using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

using TDCG;
using TDCGUtils;
using TSOView;

namespace Tso2Pmd
{
    public partial class MainForm : Form
    {
        TemplateList template_list = null;
        Viewer viewer = null;
        TSOForm view_form = null;
        TransTso2Pmd t2p = null;
        ClippingVertexForm clip_form = null;

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            // お待ちくださいダイアログを表示
            ProgressDialog pd = new ProgressDialog();
            pd.Show();
            pd.Message = "Tso2Pmxを起動しています。";

            // テンプレートリストを初期化
            template_list = new TemplateList();
            pd.Value += 15;

            // Viewerクラスを初期化
            viewer = new Viewer();
            pd.Value += 15;

            // Tso2Pmdクラスを初期化
            t2p = new TransTso2Pmd();
            pd.Value += 15;

            // スプリクトを読みとる
            if (!template_list.Load())
            {
                pd.Dispose();
                this.Dispose();
            }
            pd.Value += 30;

            // T2POptionControlの初期化
            t2POptionControl1.Initialize(ref viewer, template_list);
            pd.Value += 20;

            // ビューアーフォームの初期化
            view_form = new TSOForm(viewer, this);

            // お待ちくださいダイアログを閉じる
            pd.Value = pd.Maximum;
            System.Threading.Thread.Sleep(1000);
            pd.Dispose();
        }

        private void panel1_DragEnter(object sender, DragEventArgs e)
        {
            //コントロール内にカーソルがドラッグされたとき、表示されるものを選択
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                // Ctrlを押している状態を判別しない
                e.Effect = DragDropEffects.Copy;

                /*// Ctrlを押している状態なら、+を表示する
                if ((e.KeyState & 8) == 8)
                    e.Effect = DragDropEffects.Copy;
                else
                    e.Effect = DragDropEffects.Move;*/
            }
            else
            {
                //ファイル以外は受け付けない
                e.Effect = DragDropEffects.None;
            }

            panel1.BackColor = Color.DarkTurquoise;
        }

        private void panel1_DragLeave(object sender, EventArgs e)
        {
            panel1.BackColor = Color.LightCyan;
        }

        public void panel1_DragDrop(object sender, DragEventArgs e)
        {
            //ドロップされたデータがファイルか調べる
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] FileName
                    = (string[])e.Data.GetData(DataFormats.FileDrop);

                string name = FileName[0];

                // 拡張子が".tdcgsav.png"or".tso"であるか確認する
                if ((System.IO.Path.GetExtension(name) == ".png" &&
                    System.IO.Path.GetExtension(
                        System.IO.Path.GetFileNameWithoutExtension(name)) == ".tdcgsav")
                    || System.IO.Path.GetExtension(name) == ".tso")
                {
                    // お待ちくださいダイアログを表示
                    ProgressDialog pd = new ProgressDialog();
                    pd.Show(this);
                    pd.Message = "ファイルを読み込んでいます。";

                    //ドロップされたファイルを読み込む
                    viewer.ClearFigureList();
                    viewer.LoadAnyFile(name, false);

                    // フォームより各パラメータを得て、設定
                    SetupFigure(name);

                    // お待ちくださいダイアログを閉じる
                    pd.Value = pd.Maximum;
                    System.Threading.Thread.Sleep(1000);
                    pd.Dispose();
                }
                else
                {
                    MessageBox.Show("拡張子が.tdcgsav.pngか、.tsoである必要があります。");
                    return;
                }
            }

            panel1.BackColor = Color.LightCyan;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // フォームを表示
            view_form.Show();

            button2.Enabled = false;
        }

        // TSOFormが閉じた時（実際はHide）
        public void TSOForm_Hiding()
        {
            button2.Enabled = true;
        }

        private void button_Clipping_Click(object sender, EventArgs e)
        {
            // ClippingVertexFormを表示する
            clip_form.Show();

            button_Clipping.Enabled = false;
        }

        // ClippingVertexが閉じた時（実際はHide）
        public void ClippingVertexForm_Hiding()
        {
            button_Clipping.Enabled = true;
        }

        // フォームより各パラメータを得て、設定
        public void SetupFigure(string file_name)
        {
            // Figureをセット
            Figure fig;
            viewer.TryGetFigure(out fig);
            t2p.Figure = fig;

            // カテゴリをセット
            List<string> category;
            if (System.IO.Path.GetExtension(file_name) == ".png")
            {
                PNGFileUtils png_u = new PNGFileUtils();
                category = png_u.GetCategoryList(file_name);
            }
            else
            {
                category = new List<string>();
                category.Add("カテゴリーなし");
            }
            t2p.Categories = category;

            // コントロールより、体型リストをセットアップ
            t2POptionControl1.SetupTPOListRatio();

            // ファイル名をセット
            t2POptionControl1.SetFileName(file_name);

            // ClippingVertexFormクラスのインスタンスを作成する
            if (clip_form != null && clip_form.Visible == true)
            {
                clip_form.Hide();
                clip_form = new ClippingVertexForm(viewer, t2p, category, this);
                clip_form.Show();
            }
            else
            {
                clip_form = new ClippingVertexForm(viewer, t2p, category, this);
            }
            button_Clipping.Enabled = true;

            button_Trans.Enabled = true;
        }

        private void button_Trans_Click(object sender, EventArgs e)
        {
            // お待ちくださいダイアログを表示
            ProgressDialog pd = new ProgressDialog();
            pd.Show(this);
            pd.Message = "ファイルを変換しています。";

            try
            {
                t2POptionControl1.SetupOptions(t2p);
                t2p.UpdatePmdFromFigure();
            }
            catch (FormatException ex)
            {
                pd.Dispose();
                MessageBox.Show(ex.Message);
                return;
            }

            // 出力フォルダのパスを得る
            string file_path = t2POptionControl1.GetOutputFilePath();

            t2p.SavePmdFile(file_path + "/" + t2POptionControl1.GetModelName() + ".pmx");

            t2p.OutputMaterialFile(file_path, t2POptionControl1.GetModelName());

            // 体型レシピを出力
            t2POptionControl1.SaveTPOConfig(Application.StartupPath);
            t2POptionControl1.SaveTPOConfig(file_path);

            // お待ちくださいダイアログを閉じる
            pd.Value = pd.Maximum;
            System.Threading.Thread.Sleep(1000);
            pd.Dispose();

            // にっこりさせる
            t2p.NikkoriFace();

            // メッセージボックスを表示する
            MessageBox.Show("変換を完了しました。");

            // 初期の表情にする
            t2p.DefaultFace();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (viewer != null)
                viewer.Dispose();

            if (view_form != null)
                view_form.Dispose();

            if (clip_form != null)
                clip_form.Dispose();
        }

    }
}
