using Billing.Models;
using Billing.UI;
using System;
using Xamarin.Forms;

namespace Billing.Views
{
    public partial class AddAccountPage : BillingPage
    {
        private static readonly BindableProperty AccountNameProperty = BindableProperty.Create(nameof(AccountName), typeof(string), typeof(AddAccountPage));
        private static readonly BindableProperty AccountIconProperty = BindableProperty.Create(nameof(AccountIcon), typeof(string), typeof(AddAccountPage));
        private static readonly BindableProperty CategoryProperty = BindableProperty.Create(nameof(Category), typeof(string), typeof(AddAccountPage));
        private static readonly BindableProperty BalanceProperty = BindableProperty.Create(nameof(Balance), typeof(decimal), typeof(AddAccountPage));
        private static readonly BindableProperty MemoProperty = BindableProperty.Create(nameof(Memo), typeof(string), typeof(AddAccountPage));

        public string AccountName
        {
            get => (string)GetValue(AccountNameProperty);
            set => SetValue(AccountNameProperty, value);
        }
        public string AccountIcon
        {
            get => (string)GetValue(AccountIconProperty);
            set => SetValue(AccountIconProperty, value);
        }
        public string Category
        {
            get => (string)GetValue(CategoryProperty);
            set => SetValue(CategoryProperty, value);
        }
        public decimal Balance
        {
            get => (decimal)GetValue(BalanceProperty);
            set => SetValue(BalanceProperty, value);
        }
        public string Memo
        {
            get => (string)GetValue(MemoProperty);
            set => SetValue(MemoProperty, value);
        }

        private readonly Account account;

        public Command CheckAccount { get; }
        public Command SelectIcon { get; }
        public Command SelectCategory { get; }

        public event EventHandler<AccountEventArgs> AccountChecked;

        public AddAccountPage()
        {
            CheckAccount = new Command(OnCheckAccount);
            SelectIcon = new Command(OnSelectIcon);
            SelectCategory = new Command(OnSelectCategory);
            InitializeComponent();
        }

        public AddAccountPage(Account account)
        {
            this.account = account;
            AccountName = account.Name;
            AccountIcon = account.Icon;
            Category = account.Category.ToString();
            Balance = account.Balance;
            Memo = account.Memo;
            CheckAccount = new Command(OnCheckAccount);
            InitializeComponent();
        }

        private void OnCheckAccount()
        {
            AccountChecked?.Invoke(this, new AccountEventArgs
            {
                Account = new Account
                {
                    Id = account?.Id ?? -1,
                    Name = AccountName,
                    Icon = AccountIcon,
                    //Category = Category,
                    Balance = Balance,
                    Memo = Memo
                }
            });
        }

        private void OnSelectIcon()
        {

        }

        private void OnSelectCategory()
        {

        }
    }

    public class AccountEventArgs : EventArgs
    {
        public Account Account { get; set; }
    }
}