﻿using System;
using System.Diagnostics;
using System.IO;
using System.Reactive.Linq;
using System.Windows;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Messaging;
using JetBrains.Annotations;
using KMBEditor.DomainLayer.Entity.AAFileModel;
using KMBEditor.DomainLayer.Entity.AAPageModel;
using KMBEditor.DomainLayer.Service.ImageProcess;
using KMBEditor.UseCaseLayer;
using Reactive.Bindings;

namespace KMBEditor.PresentationLayer.ExportPageToImage.ViewModel
{
    // ReSharper disable once ClassNeverInstantiated.Global
    public class ExportPageToImageConfigWindowViewModel : ViewModelBase
    {
        public ExportPageToImageConfigWindowViewModel(
            [NotNull] AAFile aaFile,
            [NotNull] AAPage aaPage,
            [NotNull] ExportPageToImageStore store)
            : base(Messenger.Default)
        {
            Close = store.Close;

            FileName.Value = aaFile.Name;

            PageIndex.Value = aaPage.Index;

            AA2ImageFixDotRemoveOptionTypes = store.AA2ImageFixDotRemoveOptionTypes;

            IsOpenDirectoryWhenFinished = store.IsOpenDirectoryWhenFinished;

            IsEnableColor = store.IsEnableColor;

            OkCommand.Subscribe(_ =>
            {
                // 画像一括出力
                string filePath;
                try
                {
                    // 出力ファイルパスを取得
                    filePath = store.OutputAAPageToImageFilePathDialog.GetFilePathWithDialogForSave();

                    // 画像を出力
                    store.OutputImages(aaPage.DecodeText, filePath);
                }
                catch (OperationCanceledException)
                {
                    return;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(
                        $"画像出力に失敗しました。お手数ですが作者に報告お願いします。\n{ex.Message}",
                        "画像出力エラー", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                // 成功した場合のメッセージを表示
                MessageBox.Show("正常に出力されました", "ページ画像出力",
                    MessageBoxButton.OK, MessageBoxImage.Information);

                // 出力対象ディレクトリを開く
                if (IsOpenDirectoryWhenFinished.Value)
                {
                    Process.Start(Path.GetDirectoryName(filePath));
                }

                // ウィンドウを閉じる
                Close.Value = true;
            });

            CancelCommand.Subscribe(_ => { Close.Value = true; });
        }

        /// <summary>
        ///     ウィンドウのクローズ状態
        /// </summary>
        [NotNull]
        public ReactiveProperty<bool> Close { get; }

        /// <summary>
        ///     ファイル名
        /// </summary>
        [NotNull]
        public ReactiveProperty<string> FileName { get; } = new ReactiveProperty<string>();

        /// <summary>
        ///     ページNo
        /// </summary>
        [NotNull]
        public ReactiveProperty<int> PageIndex { get; } = new ReactiveProperty<int>();

        /// <summary>
        ///     画像出力オプション: 修正ドットの除去処理オプションタイプ
        /// </summary>
        [NotNull]
        public ReactiveProperty<AAText2ImageFixDotRemoveOptionTypes> AA2ImageFixDotRemoveOptionTypes { get; }


        /// <summary>
        ///     OKボタンを押した時のコマンド
        /// </summary>
        [NotNull]
        public ReactiveCommand OkCommand { get; } = new ReactiveCommand();

        /// <summary>
        ///     キャンセルボタンを押した時のコマンド
        /// </summary>
        [NotNull]
        public ReactiveCommand CancelCommand { get; } = new ReactiveCommand();

        /// <summary>
        ///     出力後にディレクトリを開くか
        /// </summary>
        [NotNull]
        public ReactiveProperty<bool> IsOpenDirectoryWhenFinished { get; }

        /// <summary>
        ///     カラーAAを有効化するか
        /// </summary>
        [NotNull]
        public ReactiveProperty<bool> IsEnableColor { get; }
    }
}