using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Xamarin.Forms;

namespace InABox.Mobile
{

    public class ModuleMenuItemTappedArgs :EventArgs
    {
        
    }
    
    public delegate void ModuleMenuItemTapped(MobileModuleItem sender, ModuleMenuItemTappedArgs args);
    
    public interface IModuleMenuItem
    {
        String Header { get; set; }
        String Description { get; set; }
        ImageSource Thumbnail { get; set; }
        bool IsEnabled { get; set; }
        bool IsVisible { get; set; }
        event ModuleMenuItemTapped Tapped;
        string Alert { get; set; }
        void Tap();
    }
    
    public class MobileModuleItem : BindableObject, IModuleMenuItem
    {
        
        public static readonly BindableProperty HeaderProperty =
            BindableProperty.Create(nameof(Header), typeof(String), typeof(MobileModuleItem), "");

        public string Header
        {
            get => (String)GetValue(HeaderProperty);
            set => SetValue(HeaderProperty, value);
        }
        
        public static readonly BindableProperty DescriptionProperty =
            BindableProperty.Create(nameof(Description), typeof(String), typeof(MobileModuleItem), "");

        public string Description
        {
            get => (String)GetValue(DescriptionProperty);
            set => SetValue(DescriptionProperty, value);
        }

        public static readonly BindableProperty ThumbnailProperty =
            BindableProperty.Create(nameof(Thumbnail), typeof(ImageSource), typeof(MobileModuleItem), null);

        public ImageSource Thumbnail
        {
            get => (ImageSource)GetValue(ThumbnailProperty);
            set => SetValue(ThumbnailProperty, value);
        }
        
        public static readonly BindableProperty BackgroundColorProperty = BindableProperty.Create(
            nameof(BackgroundColor),
            typeof(Color),
            typeof(MobileModuleItem),
            XF.Material.Forms.Material.Color.Surface);

        public Color BackgroundColor
        {
            get => (Color)GetValue(BackgroundColorProperty);
            set => SetValue(BackgroundColorProperty, value);
        }

        public static readonly BindableProperty BorderColorProperty = BindableProperty.Create(
            nameof(BorderColor),
            typeof(Color),
            typeof(MobileModuleItem),
            XF.Material.Forms.Material.Color.SecondaryVariant);

        public Color BorderColor
        {
            get => (Color)GetValue(BorderColorProperty);
            set => SetValue(BorderColorProperty, value);
        }
        
        public static readonly BindableProperty TextColorProperty = BindableProperty.Create(
            nameof(TextColor),
            typeof(Color),
            typeof(MobileModuleItem),
            XF.Material.Forms.Material.Color.OnSurface);

        public Color TextColor
        {
            get => (Color)GetValue(TextColorProperty);
            set => SetValue(TextColorProperty, value);
        }
        
        public static readonly BindableProperty IsEnabledProperty =
            BindableProperty.Create(nameof(IsEnabled), typeof(bool), typeof(MobileModuleItem), true);

        public bool IsEnabled
        {
            get => (bool)GetValue(IsEnabledProperty);
            set => SetValue(IsEnabledProperty, value);
        }

        public static readonly BindableProperty IsVisibleProperty =
            BindableProperty.Create(nameof(IsVisible), typeof(bool), typeof(MobileModuleItem), true);

        public bool IsVisible
        {
            get => (bool)GetValue(IsVisibleProperty);
            set => SetValue(IsVisibleProperty, value);
        }
        
        public static readonly BindableProperty AlertProperty = BindableProperty.Create(
            nameof(Alert), 
            typeof(string), 
            typeof(MobileModuleItem), 
            null);
        
        public string Alert
        {
            get { return (string)GetValue(AlertProperty); }
            set { 
                SetValue(AlertProperty, value);
                OnPropertyChanged(nameof(AlertVisible));
            }
        }
        
        public bool AlertVisible => !String.IsNullOrWhiteSpace(Alert);
        
        public event ModuleMenuItemTapped Tapped;
        public void Tap() => Tapped?.Invoke(this, new ModuleMenuItemTappedArgs());

    }
}