using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace SASDesktop.ViewModels.Drivers
{
    class Create : BindableBase
    {
        private string _photoPath;
        private string _name;
        private string _surname;
        private string _patron;
        private string _passSeries;
        private string _passNumber;
        private string _addrRegistration;
        private string _addrLiving;
        private string _company;
        private string _jobPosition;
        private string _phone;
        private string _mailIndex;
        private string _emailAddr;
        private string _comment;

        /// <summary>
        /// Выбрано ли фото или оно по умолчанию?
        /// </summary>
        private bool photoChosen;

        #region Свойства
        public string Name 
        {   
            get { return _name; }
            set { _name = value; RaisePropertyChanged(nameof(Name)); }
        }
        
        public string Surname 
        { 
            get { return _surname; }
            set { _surname = value; RaisePropertyChanged(nameof(Surname)); }
        }

        public string Patron
        {
            get { return _patron; }
            set { _patron = value; RaisePropertyChanged(nameof(Patron)); }
        }
        public string PassSeries
        {
            get { return _passSeries; }
            set { _passSeries = value; RaisePropertyChanged(nameof(PassSeries)); }
        }
        public string PassNumber
        {
            get { return _passNumber; }
            set { _passNumber = value; RaisePropertyChanged(nameof(PassNumber)); }
        }
        public string AddrRegistration
        {
            get { return _addrRegistration; }
            set { _addrRegistration = value; RaisePropertyChanged(nameof(AddrRegistration)); }
        }
        public string AddrLiving
        {
            get { return _addrLiving; }
            set { _addrLiving = value; RaisePropertyChanged(nameof(AddrLiving)); }
        }
        public string Company
        {
            get { return _company; }
            set { _company = value; RaisePropertyChanged(nameof(Company)); }
        }
        public string JobPosition
        {
            get { return _jobPosition; }
            set { _jobPosition = value; RaisePropertyChanged(nameof(JobPosition)); }
        }
        public string Phone
        {
            get { return _phone; }
            set { _phone = value; RaisePropertyChanged(nameof(Phone)); }
        }
        public string MailIndex
        {
            get { return _mailIndex; }
            set { _mailIndex = value; RaisePropertyChanged(nameof(MailIndex)); }
        }
        public string EmailAddr
        {
            get { return _emailAddr; }
            set { _emailAddr = value; RaisePropertyChanged(nameof(EmailAddr)); }
        }
        public string Comment
        {
            get { return _comment; }
            set { _comment = value; RaisePropertyChanged(nameof(Comment)); }
        }
        public string PhotoPath 
        { 
            get
            {
                return _photoPath;
            }
            set
            {
                _photoPath = value;
                RaisePropertyChanged(nameof(PhotoPath));
            }
        }
        public DelegateCommand ChoosePhotoCmd { get; set; }
        public DelegateCommand CancelCmd { get; set; }
        public DelegateCommand SubmitCmd { get; set; }
        #endregion

        public Create()
        {
            string[] args = Environment.GetCommandLineArgs();
            if (args[1] == "--debug")
            {
                var rng = new Random();
                
                Name = "Вадим";
                Surname = "Королёв";
                Patron = "Сергеевич";
                PassSeries = rng.Next(1111,9999).ToString();
                PassNumber = rng.Next(111111, 999999).ToString();
                AddrRegistration = "ул. Школьная д. " + rng.Next(1,100).ToString();
                AddrLiving = AddrRegistration;
                Company = "Кока кола";
                JobPosition = "Проверка качества";
                Phone = rng.Next(111111, 999999).ToString();
                EmailAddr = "pydim@mail.ru";
                MailIndex = rng.Next(111111,999999).ToString();
                Comment = "random comment " + rng.Next(111111, 999999).ToString();
            }

            PhotoPath = "/Assets/BlackAvatar.png";
            CancelCmd = new DelegateCommand(Cancel);
            ChoosePhotoCmd = new DelegateCommand(ChoosePhoto);
            SubmitCmd = new DelegateCommand(Submit);
        }

        private void Cancel()
        {
            if (Popups.Confirm("отменить создание"))
            {
                Navigation.ToPortal();
            }
        }

        private void ChoosePhoto()
        {
            // 1. Открыть диалог выбора файла
            var ofd = new Microsoft.Win32.OpenFileDialog
            {
                Filter = "Изображения (*.png;*.jpg;*.jpeg)|*.png;*.jpg;*.jpeg|Все файлы (*.*)|*.*"
            };
            if (ofd.ShowDialog() == false)
            {
                return;
            }

            // 2. Установить источник изображения на выбранный пользователем
            PhotoPath = ofd.FileName;
            photoChosen = true;
        }

        private async void Submit()
        {
            List<string> errors = new List<string>();
            if (!photoChosen)
            {
                errors.Add("Не выбрана фотография водителя");
            }

            // Проверка заполнения строковых переменных
            Dictionary<string, string> errorMessages = new Dictionary<string, string>
            {
                { nameof(Name), "Имя водителя" },
                { nameof(Surname), "Фамилия водителя" },
                { nameof(PassSeries), "Серия паспорта" },
                { nameof(PassNumber), "Номер паспорта" },
                { nameof(AddrRegistration), "Адрес регистрации" },
                { nameof(AddrLiving), "Адрес проживания" },
                { nameof(MailIndex), "Почтовый индекс" }
            };
            foreach (var item in errorMessages)
            {
                string value = (string)this.GetType().GetProperty(item.Key).GetValue(this);
                if (string.IsNullOrEmpty(value) || string.IsNullOrWhiteSpace(value))
                {
                    errors.Add("Поле \"" + item.Value + "\" не заполнено");
                }
            }

            string photoExtension = Path.GetExtension(_photoPath);
            string photoName = Path.GetFileNameWithoutExtension(_photoPath);

            string[] allowedExtensions = new string[]
            {
                ".png",
                ".jpg",
                ".jpeg"
            };
            if (!allowedExtensions.Contains(photoExtension))
            {
                errors.Add("Фотография водителя - не изображение");
            }

            if (errors.Count > 0)
            {
                Popups.ShowErrors(errors);
            } else
            {
                var db = new Models.SASEntities();
                
                // Создать или найти расширение для фото водителя
                Models.Extension extension = db.Extensions.FirstOrDefault(x => x.Name == photoExtension);
                if (extension == null)
                {
                    extension = new Models.Extension
                    {
                        Name = photoExtension
                    };
                    db.Extensions.Add(extension);
                    await db.SaveChangesAsync();
                }

                // Создать файл фото водителя
                Models.File driverPhoto = new Models.File
                {
                    Name = PhotoPath,
                    Extension1 = extension,
                    BinaryData = File.ReadAllBytes(_photoPath)
                };
                db.Files.Add(driverPhoto);
                await db.SaveChangesAsync();

                // Создать или найти компанию в которой водитель работает
                Models.Company company = db.Companies.FirstOrDefault(x => x.Name == Company);
                if (company == null)
                {
                    company = new Models.Company
                    {
                        Name = Company
                    };
                    db.Companies.Add(company);
                    await db.SaveChangesAsync();
                }

                // Найти или создать позицию работы на которой работает водитель
                Models.Job driverJob = db.Jobs.FirstOrDefault(j => j.Company == company.ID && j.Name == JobPosition);
                if (driverJob == null)
                {
                    driverJob = new Models.Job
                    {
                        Name = JobPosition,
                        Company = company.ID
                    };
                    db.Jobs.Add(driverJob);
                    await db.SaveChangesAsync();
                }

                // Создать водителя
                Models.Citizen driver = new Models.Citizen
                {
                    Photo = driverPhoto.ID,
                    Surname = Surname,
                    Name = Name,
                    Patronymic = Patron,
                    Job = driverJob.ID,
                    Email = EmailAddr,
                    Phone = Phone,
                    PassSeries = PassSeries,
                    PassNumber = PassNumber,
                    MailIndex = MailIndex,
                    RegistrationAddress = AddrRegistration,
                    Discription = "", // не используем
                    CurrentAddress = AddrLiving,
                    Comment = Comment
                };
                db.Citizens.Add(driver);
                await db.SaveChangesAsync();

                Navigation.ToPortal();
            }
        }
    }
}
