using MYOB.AccountRight.SDK.Contracts;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace InABox.Poster.MYOB;
/// <summary>
/// Interaction logic for MYOBCompanyFileSelectionDialog.xaml
/// </summary>
public partial class MYOBCompanyFileSelectionDialog : Window, INotifyPropertyChanged
{
    private bool _canSave;
    public bool CanSave
    {
        get => _canSave;
        set
        {
            _canSave = true;
            OnPropertyChanged();
        }
    }

    public List<MYOBCompanyFile> Items
    {
        get => Grid.Items;
        set => Grid.Items = value;
    }

    public MYOBCompanyFile? Result
    {
        get
        {
            var row = Grid.SelectedRows.FirstOrDefault();
            if(row is not null)
            {
                return Grid.LoadItem(row);
            }
            return null;
        }
    }

    public MYOBCompanyFileSelectionDialog()
    {
        InitializeComponent();
    }

    public event PropertyChangedEventHandler? PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private void Grid_OnSelectItem(object sender, DynamicGrid.DynamicGridSelectionEventArgs e)
    {
        CanSave = e.Rows is not null && e.Rows.Length > 0;
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Grid.Refresh(true, true);
    }

    private void CancelButton_Click(object sender, RoutedEventArgs e)
    {
        DialogResult = false;
        Close();
    }

    private void OKButton_Click(object sender, RoutedEventArgs e)
    {
        DialogResult = true;
        Close();
    }

    public static CompanyFile? SelectCompanyFile()
    {
        var data = MYOBPosterEngine.GetConnectionData();
        var window = new MYOBCompanyFileSelectionDialog();

        var files = data.CompanyFileService.GetRange();

        window.Items = files.Select(x =>
        {
            return new MYOBCompanyFile
            {
                ID = x.Id,
                Name = x.Name
            };
        }).ToList();
        if(window.ShowDialog() == true)
        {
            var result = window.Result;
            if(result is not null)
            {
                return files.FirstOrDefault(x => x.Id == result.ID);
            }
            else
            {
                return null;
            }
        }
        else
        {
            return null;
        }
    }
}
