using System;
using System.Collections.Generic;
using System.Linq;
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.Navigation;
using System.Windows.Shapes;
using System.Windows.Controls.Primitives;
using System.Text.RegularExpressions;
using Microsoft.Win32;
using MSAPI = Microsoft.WindowsAPICodePack;
using System.IO;

namespace CSRender
{
    public partial class MainWindow : Window
    {
        //フォルダ指定のためにファイルをドラッグ
        private void textBox_PreviewDragOver(object sender, System.Windows.DragEventArgs e)
        {
            if (e.Data.GetDataPresent(System.Windows.DataFormats.FileDrop, true))
            {
                e.Effects = System.Windows.DragDropEffects.Copy;
            }
            else
            {
                e.Effects = System.Windows.DragDropEffects.None;
            }
            e.Handled = true;
        }

        //エクスプローラーからテキストボックスにドロップして指定フォルダの場所をペースト
        private void TargetBox_Drop(object sender, System.Windows.DragEventArgs e)
        {
            var dropFiles = e.Data.GetData(System.Windows.DataFormats.FileDrop) as string[];
            if (dropFiles == null) return;
            //カーソルを終端に置く
            targetBox.Text = dropFiles[0];
            targetBox.Focus();
            targetBox.Select(this.targetBox.Text.Length, 0);
        }
        private void RefBox_Drop(object sender, System.Windows.DragEventArgs e)
        {
            var dropFiles = e.Data.GetData(System.Windows.DataFormats.FileDrop) as string[];
            if (dropFiles == null) return;
            //カーソルを終端に置く
            referenceBox.Text = dropFiles[0];
            referenceBox.Focus();
            referenceBox.Select(this.referenceBox.Text.Length, 0);
        }
        private void WorkBox_Drop(object sender, System.Windows.DragEventArgs e)
        {
            var dropFiles = e.Data.GetData(System.Windows.DataFormats.FileDrop) as string[];
            if (dropFiles == null) return;
            //カーソルを終端に置く
            workBox.Text = dropFiles[0];
            workBox.Focus();
            workBox.Select(this.workBox.Text.Length, 0);
            if (!Directory.Exists(System.IO.Path.Combine(workBox.Text, "report")))
            {
                Directory.CreateDirectory(System.IO.Path.Combine(workBox.Text, "report"));
            }
        }

        private void ReportBox_Drop(object sender, System.Windows.DragEventArgs e)
        {
            var dropFiles = e.Data.GetData(System.Windows.DataFormats.FileDrop) as string[];
            if (dropFiles == null) return;
            //カーソルを終端に置く
            reportBox.Text = dropFiles[0] + @"\";
            reportBox.Focus();
            reportBox.Select(this.reportBox.Text.Length, 0);
        }

        //参照ボタンClickでフォルダ選択のダイアログを表示（対象フォルダ）
        private void TagetButton_Click(object sender, RoutedEventArgs e)
        {
            
            //フォルダ選択の場合
            var selectFile = new MSAPI::Dialogs.CommonOpenFileDialog();
            selectFile.IsFolderPicker = true;
            selectFile.Title = "フォルダを選択してください";
            if(Directory.Exists(targetBox.Text))//前回値が存在する場合はそのフォルダを初期値として表示
            {
                selectFile.InitialDirectory = targetBox.Text.Substring(0, targetBox.Text.LastIndexOf(@"\")); 
            }
            else
            {
                selectFile.InitialDirectory = @"C:";
            }
            if (selectFile.ShowDialog() != MSAPI::Dialogs.CommonFileDialogResult.Ok)
            {
                return;
            }
            //共通部分
            targetBox.Text = selectFile.FileName;
            targetBox.Focus();
            targetBox.Select(this.targetBox.Text.Length, 0);
        }

        //参照ボタンClickでフォルダ選択のダイアログを表示（リファレンスフォルダ）
        private void ReferenceButton_Click(object sender, RoutedEventArgs e)
        {
            
            //フォルダ選択の場合
            var selectFile = new MSAPI::Dialogs.CommonOpenFileDialog();
            selectFile.IsFolderPicker = true;
            selectFile.Title = "フォルダを選択してください";
            if (Directory.Exists(referenceBox.Text))//前回値が存在する場合はそのフォルダを初期値として表示
            {
                selectFile.InitialDirectory = referenceBox.Text.Substring(0, referenceBox.Text.LastIndexOf(@"\")); 
            }
            else
            {
                selectFile.InitialDirectory = @"C:";
            }
            if (selectFile.ShowDialog() != MSAPI::Dialogs.CommonFileDialogResult.Ok)
            {
                return;
            }
            //共通部分
            referenceBox.Text = selectFile.FileName;
            referenceBox.Focus();
            referenceBox.Select(this.referenceBox.Text.Length, 0);
        }

        //参照ボタンClickでフォルダ選択のダイアログを表示（作業フォルダ）
        private void WorkButton_Click(object sender, RoutedEventArgs e)
        {
            
            //フォルダ選択の場合
            var selectFile = new MSAPI::Dialogs.CommonOpenFileDialog();
            selectFile.IsFolderPicker = true;
            selectFile.Title = "フォルダを選択してください";
            if (Directory.Exists(workBox.Text))//前回値が存在する場合はそのフォルダを初期値として表示
            {
                selectFile.InitialDirectory = workBox.Text.Substring(0, workBox.Text.LastIndexOf(@"\")); 
            }
            else
            {
                selectFile.InitialDirectory = @"C:";
            }
            if (selectFile.ShowDialog() != MSAPI::Dialogs.CommonFileDialogResult.Ok)
            {
                return;
            }
            //共通部分
            workBox.Text = selectFile.FileName;
            workBox.Focus();
            workBox.Select(this.workBox.Text.Length, 0);
            if (!Directory.Exists(System.IO.Path.Combine(selectFile.FileName, "report")))
            {
                Directory.CreateDirectory(System.IO.Path.Combine(selectFile.FileName, "report"));
            }
            //reportBox.Text = System.IO.Path.Combine(selectFile.FileName, "report") + @"\";
        }

        //参照ボタンClickでフォルダ選択のダイアログを表示（検版レポートパス）
        private void ReportButton_Click(object sender, RoutedEventArgs e)
        {
            
            //フォルダ選択の場合
            var selectFile = new MSAPI::Dialogs.CommonOpenFileDialog();
            selectFile.IsFolderPicker = true;
            selectFile.Title = "フォルダを選択してください";
            if (Directory.Exists(workBox.Text))//前回値が存在する場合はそのフォルダを初期値として表示
            {
                selectFile.InitialDirectory = workBox.Text.Substring(0, workBox.Text.LastIndexOf(@"\")); 
            }
            else
            {
                selectFile.InitialDirectory = @"C:";
            }
            if (selectFile.ShowDialog() != MSAPI::Dialogs.CommonFileDialogResult.Ok)
            {
                return;
            }
            //共通部分
            reportBox.Text = selectFile.FileName + @"\";
            reportBox.Focus();
            reportBox.Select(this.reportBox.Text.Length, 0);
        }

        private void EditEnvFile()
        {
            string appPath = System.Reflection.Assembly.GetExecutingAssembly().Location;  //モジュールのパスを取得
            string appDirectory = appPath.Substring(0, appPath.LastIndexOf(@"\") + 1);    //モジュールの存在するディレクトリを取得
            string dataPath = System.IO.Path.Combine("PureVerify.Data", "RipVerify", "setup", "PureVerifyDlg.env");
            string envFilePath = System.IO.Path.Combine(appDirectory, dataPath);//PureVerifyDlg.envまでのフルパス

            //.envファイルに記述する内容
            string equiosCenterPath = System.IO.Path.Combine(appDirectory, "PureVerify.Data", "EquiosCenter");//EquiosCenterのフルパス
            string workFolderPath = System.IO.Path.Combine(appDirectory, "PureVerify.Data", "RipVerify");//内部作業フォルダのフルパス
            string writeText = "**EquiosCenter: \"" + equiosCenterPath + "\"\r\n";
            writeText += "**WorkDirRoot: \"" + workFolderPath + "\"\r\n";
            writeText += "**InspQuality: \"3\"\r\n";
            writeText += "**MarkDistance: \"50\"\r\n";
            writeText += "**ReportEncodeType: \"2\"\r\n";
            writeText += "**WndPosLeft: \"348\"\r\n";
            writeText += "**WndPosTop: \"125\"\r\n";
            writeText += "**WndPosRight: \"933\"\r\n";
            writeText += "**WndPosBottom: \"556\"\r\n";
            writeText += "**ShowOKList: \"1\"\r\n";

            // StreamWriterオブジェクトのインスタンスを生成
            StreamWriter streamWriter = new StreamWriter(envFilePath, false, Encoding.GetEncoding("Shift_JIS"));
            // Writeメソッドで文字列データを書き込む
            streamWriter.Write(writeText);
            // StreamWriterオブジェクトを閉じる
            streamWriter.Close();

        }

        //レポート出力パスの確認
        private bool checkReportPath()
        {
            bool reportFlag = false;
            string pdfReportPath = "";
            string pdfReportName = "";
            int directoryCount = 0;
            if (reportBox.Text != "")//入力があるか
            {
                directoryCount = reportBox.Text.Split(char.Parse(@"\")).Length - 1;//入力文字列がファイル名のみかディレクトリも含むか
                if (directoryCount == 0)//ファイル名のみならば作業ディレクトリのreportフォルダに出力
                {
                    reportBox.Text = NameCalibration(reportBox.Text);
                    reportBox.Text = System.IO.Path.Combine(workBox.Text, "report", reportBox.Text);
                }
                pdfReportPath = reportBox.Text.Substring(0, reportBox.Text.LastIndexOf(@"\"));//メニュー入力から出力パスを取得
                pdfReportName = reportBox.Text.Substring(reportBox.Text.LastIndexOf(@"\"));//メニュー入力からレポートファイル名を取得
                if (!System.IO.Path.IsPathRooted(pdfReportPath))//指定したパス文字列にルートが含まれているかどうか
                {
                    pdfReportPath = System.IO.Path.Combine(workBox.Text, "report", pdfReportPath);//含まれていなければ作業フォルダのreportフォルダに出力
                }
                if (!Directory.Exists(pdfReportPath))//指定先のフォルダが存在するか
                {
                    Directory.CreateDirectory(pdfReportPath);//なければ作成
                }
                pdfReportPath = System.IO.Path.GetFullPath(pdfReportPath);//フルパスを取得

                //レポートファイル名に不正文字が使用されいないかチェック
                pdfReportName = NameCalibration(pdfReportName);

                if (pdfReportName.Length < 4 || pdfReportName.Substring(pdfReportName.Length - 4) != ".pdf")//入力に拡張子がついているか
                {
                    pdfReportName += ".pdf";
                }
                reportBox.Text = pdfReportPath + pdfReportName;
                reportBox.Focus();
                reportBox.Select(this.reportBox.Text.Length, 0);
                reportFlag = true;
            }
            return reportFlag;
        }

        //レポート名に使用不可の文字が含まれている場合の処理
        private string NameCalibration(string inFileName)
        {
            string[] charsToRemove = new string[] { "/", ":", "*", "?", "<", ">", "|" };
            char[] charsTocheck = new char[] { '/', ':', '*', '?', '<', '>', '|' };
            if (inFileName.IndexOfAny(charsTocheck) >= 0)
            {
                foreach (var allNg in charsToRemove)
                {
                    inFileName = inFileName.Replace(allNg, string.Empty);
                }
                ResultConsole.Text += "　検版レポート名に使用できない文字が含まれていたため、自動修正しました。";
                ResultConsole.Text += "\r\n\r\n";
                DoEvents();
            }
            
            return inFileName;
        }

     }
}
