using Elwig.Documents;
using Elwig.Models.Dtos;
using Elwig.Models.Entities;
using Elwig.Windows;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace Elwig.Dialogs {
    public partial class DeliveryConfirmationsWindow : ContextWindow {

        public readonly int Year;

        public DeliveryConfirmationsWindow(int year) {
            InitializeComponent();
            Year = year;
            Title = $"Anlieferungsbestätigungen - Lese {Year} - Elwig";
            TextElement.Text = App.Client.TextDeliveryConfirmation;
        }

        private void Window_Loaded(object sender, RoutedEventArgs evt) {
            ShowButton.IsEnabled = App.IsPrintingReady;
            PrintButton.IsEnabled = App.IsPrintingReady;
        }

        protected override async Task OnRenewContext() { }

        private async Task UpdateTextParameter() {
            var text = TextElement.Text;
            if (text.Length == 0) text = null;
            if (text != App.Client.TextDeliveryConfirmation) {
                App.Client.TextDeliveryConfirmation = text;
                await App.Client.UpdateValues();
            }
        }

        private async Task Generate(int mode) {

            Mouse.OverrideCursor = Cursors.AppStarting;
            await UpdateTextParameter();

            IQueryable<Member> members;
            if (AllMembersInput.IsChecked == true) {
                members = Context.Members.Where(m => m.IsActive);
            } else {
                members = Context.Members.FromSqlRaw($"""
                    SELECT m.*
                    FROM member m
                        INNER JOIN delivery d ON d.mgnr = m.mgnr
                    WHERE d.year = {Year}
                    GROUP BY m.mgnr
                    """);
            }

            if (OrderMgNrInput.IsChecked == true) {
                members = members
                    .OrderBy(m => m.MgNr);
            } else if (OrderNameInput.IsChecked == true) {
                members = members
                    .OrderBy(m => m.FamilyName)
                    .ThenBy(m => m.GivenName)
                    .ThenBy(m => m.MgNr);
            } else if (OrderPlzInput.IsChecked == true) {
                members = members
                    .OrderBy(m => m.PostalDest.AtPlz.Plz)
                    .ThenBy(m => m.PostalDest.AtPlz.Ort.Name)
                    .ThenBy(m => m.FamilyName)
                    .ThenBy(m => m.GivenName)
                    .ThenBy(m => m.MgNr);
            }

            IEnumerable<Member> list = await members.ToListAsync();
            var data = await DeliveryConfirmationData.ForSeason(Context.DeliveryParts, Year);
            using var doc = Document.Merge(list.Select(m =>
                new DeliveryConfirmation(Context, Year, m, data[m.MgNr]) {
                    //DoubleSided = true
                }
            ));
            //doc.DoubleSided = true;
            await doc.Generate(new Progress<double>(v => {
                ProgressBar.Value = v;
            }));
            Mouse.OverrideCursor = null;

            if (mode < 2) {
                doc.Show();
                return;
            }
            if (App.Config.Debug) {
                doc.Show();
            } else {
                await doc.Print();
            }
            Close();
        }

        private async void ShowButton_Click(object sender, RoutedEventArgs evt) {
            await Generate(1);
        }

        private async void PrintButton_Click(object sender, RoutedEventArgs evt) {
            await Generate(2);
        }
    }
}