using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using ComPDFKitViewer.PdfViewer;
using PDF_Office.EventAggregators;
using PDF_Office.Helper;
using PDF_Office.Model;
using PDF_Office.Model.EditTools.Background;
using PDF_Office.Model.EditTools.Watermark;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace PDF_Office.ViewModels.EditTools.Background
{
    public class BackgroundCreateFileContentViewModel : BindableBase, INavigationAware
    {
        IEventAggregator eventAggregator;

        public BackgroundInfo BackgroundInfo = new BackgroundInfo();
        private CPDFViewer PDFViewer;

        private List<string> _rotationList = new List<string>();
        public List<string> RotationList
        {
            get { return _rotationList; }
            set { SetProperty(ref _rotationList, value); }
        }

        private List<string> _opacityList = new List<string>();
        public List<string> OpacityList
        {
            get { return _opacityList; }
            set
            {
                SetProperty(ref _opacityList, value);
            }
        }

        private List<string> _relativeRatioList = new List<string>();
        public List<string> RelativeRatioList
        {
            get { return _relativeRatioList; }
            set
            {
                SetProperty(ref _relativeRatioList, value);
            }
        }

        private int _rotationNumber = 0;
        public int RotationNumber
        {
            get { return _rotationNumber; }
            set
            {
                SetProperty(ref _rotationNumber, value);
            }
        }

        private int _opacityNumber = 100;
        public int OpacityNumber
        {
            get { return _opacityNumber; }
            set { SetProperty(ref _opacityNumber, value); }
        }

        private int _relativeRatioNumber = 0;
        public int RelativeRatioNumber
        {
            get { return _relativeRatioNumber; }
            set { SetProperty(ref _rotationNumber, value); }
        }

        private ObservableDictionary<string, bool> _getLocationFromNumber = new ObservableDictionary<string, bool>();
        public ObservableDictionary<string, bool> GetLocationFromNumber
        {
            get { return _getLocationFromNumber; }
        }

        private string _fileNameText = "";
        public string FileNameText
        {
            get { return _fileNameText; }
            set
            {
                SetProperty(ref _fileNameText, value);
            }
        }

        private bool isFirstEnter = true;
        public bool IsFirstEnter
        {
            get => isFirstEnter;
            set => isFirstEnter = value;
        }

        private Visibility _createModFileVisible =  Visibility.Collapsed;
        public Visibility CreateModFileVisible
        {
            get => _createModFileVisible;
            set=>SetProperty(ref _createModFileVisible, value);
        }
        

        public DelegateCommand OpenFileCommand { get; set; }
        public DelegateCommand<object> ChangeLocationCommand { get; set; }


        public BackgroundCreateFileContentViewModel(IEventAggregator eventAggregator)
        {
            this.eventAggregator = eventAggregator;

            ChangeLocationCommand = new DelegateCommand<object>(ChangeLocation);
            InitComponent();
            BackgroundInfo.BackgroundHorizalign = C_Background_Horizalign.BG_HORIZALIGN_CENTER;
            BackgroundInfo.BackgroundVertalign = C_Background_Vertalign.BG_VERTALIGN_CENTER;
            InitLocationButtonMatrix();

            OpenFileCommand = new DelegateCommand(OpenFile);
            eventAggregator.GetEvent<ConfirmEditToolsBackgroundEvent>().Subscribe(ConfirmEditTools);
        }

        public string PageRangeText { get; set; } = "0";

        private int _pageRangeSelectIndex = 0;
        public int PageRangeSelectIndex
        {
            get { return _pageRangeSelectIndex; }
            set
            {
                SetProperty(ref _pageRangeSelectIndex, value);
                EditToolsHelper.GetPageRange(PageRangeSelectIndex, PDFViewer.Document, ref BackgroundInfo.PageRange, PageRangeText);
            }
        }


        public void InitComponent()
        {
            InitOpacityList();
            InitRotationList();
            InitRelativeRatioList();
        }

        private void InitRotationList()
        {
            OpacityList.Clear();
            for (int defaultRotation = -45; defaultRotation <= 45; defaultRotation += 15)
            {
                RotationList.Add(defaultRotation.ToString());
            }
        }

        private void InitOpacityList()
        {
            OpacityList.Clear();
            for (int defaultOpacity = 10; defaultOpacity <= 100; defaultOpacity += 10)
            {
                OpacityList.Add(defaultOpacity.ToString() + " %");
            }
        }

        private void InitRelativeRatioList()
        {
            RelativeRatioList.Clear();
            for (int defaultRelativeRatioList = 10; defaultRelativeRatioList <= 100; defaultRelativeRatioList += 10)
            {
                RelativeRatioList.Add(defaultRelativeRatioList.ToString() + " %");
            }
        }

        private void InitLocationButtonMatrix()
        {
            GetLocationFromNumber.Clear();
            for (var temp = 0; temp <= 22; temp++)
            {
                GetLocationFromNumber.Add(temp.ToString(), true);
                if (temp % 10 == 2)
                {
                    temp += 7;
                }
            }
            int Num = (int)BackgroundInfo.BackgroundVertalign * 10 + (int)BackgroundInfo.BackgroundHorizalign;
            GetLocationFromNumber[Num.ToString()] = false;

        }

        public void ConfirmEditTools(EnumColorOrFile enumColorOrFile)
        {
            if (enumColorOrFile == EnumColorOrFile.StatusFile)
            {
                eventAggregator.GetEvent<SetBackgroundEvent>().Publish(BackgroundInfo);
            }
        }

        public void ChangeLocation(object e)
        {
            string args = e as string;
            if (args != null)
            {
                BackgroundInfo.BackgroundVertalign = (C_Background_Vertalign)(int.Parse(args) / 10);
                BackgroundInfo.BackgroundHorizalign = (C_Background_Horizalign)(int.Parse(args) % 10);
                InitLocationButtonMatrix();
            }
        }

        public void OpenFile()
        {
            System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog();
            dlg.Multiselect = false;
            dlg.Filter = "PDF|*.png;*.jpg;*.pdf";
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                FileNameText = dlg.SafeFileName;
                FileInfo file = new FileInfo(dlg.FileName);
                if (file.Extension == ".pdf")
                {
                    GetBitmapFromDocment(dlg.FileName);
                }
                else
                {
                    EditToolsHelper.ChooseFile(dlg.FileName, ref BackgroundInfo);
                }
                CreateModFileVisible = Visibility.Visible;
            }
        }

        public async void GetBitmapFromDocment(string filePath)
        {
            CPDFDocument document = CPDFDocument.InitWithFilePath(filePath);
            CPDFPage page = document.PageAtIndex(0);
            byte[] bmp_data = new byte[(int)page.PageSize.Width * (int)page.PageSize.Height * 4];
            await Task.Run(delegate
            {
                page.RenderPageBitmap(0, 0, (int)page.PageSize.Width, (int)page.PageSize.Height, 0xffffffff, bmp_data, 1);
            });
            BackgroundInfo.ImageArray = bmp_data;
            BackgroundInfo.ImageWidth = (int)page.PageSize.Width;
            BackgroundInfo.ImageHeight = (int)page.PageSize.Height;
            document.ReleasePages();
            document.Release();
        }

        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            navigationContext.Parameters.TryGetValue<CPDFViewer>(ParameterNames.PDFViewer, out PDFViewer);
            InitOpacityList();
        }
    }
}