using ExcelToCsvToDbCommon.Gamen;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.Xml.Serialization;

namespace ExcelToCsvToDbCommon.Class
{
    public class ColumnDefinitionEditor : UITypeEditor
    {
        // 編集スタイルを「モーダルダイアログ」に指定
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.Modal;
        }

        // [...]ボタンが押された（またはダブルクリックされた）時の処理
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            var svc = provider?.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
            var org = value as ColumnDefinition;
            var edited = new ColumnDefinition();

            if (svc != null && org != null)
            {
                if (org.Type == ColumnType.Fixed &&
                    string.IsNullOrEmpty(org.FixedValue))
                {
                    // 新規の場合、タイプを選択する
                    using (var frm = new TypeSelectForm())
                    {
                        if (frm.ShowDialog() == DialogResult.Cancel) return org;

                        edited.Type = frm.Type;
                    }
                }
                else
                {
                    edited.Type = org.Type;
                }

                // まず論理名とテーブルカラム名
                using (var frm = new NameForm(org.LogicalName))
                {
                    if (frm.ShowDialog() == DialogResult.Cancel) return org;

                    edited.LogicalName = frm.LogicalName;
                }

                switch (edited.Type)
                {
                    case ColumnType.Fixed:
                        // ★ここで自作の「編集用フォーム」を呼び出す！
                        // configのコピーを渡して、OKなら反映させるのが安全です
                        using (var frm = new ColFixedForm(org.FixedValue))
                        {
                            if (svc.ShowDialog(frm) == DialogResult.Cancel)
                            {
                                return org;
                            }
                            edited.FixedValue = frm.Koteichi;
                        }
                        break;

                    case ColumnType.Mapping:
                        // ★ここで自作の「編集用フォーム」を呼び出す！
                        // configのコピーを渡して、OKなら反映させるのが安全です
                        using (var frm = new ColMappingForm(org.TargetCol))
                        {
                            if (svc.ShowDialog(frm) == DialogResult.Cancel)
                            {
                                return org;
                            }
                            edited.TargetCol = frm.Retsu;
                        }
                        break;

                    case ColumnType.Conversion:
                        // 列選択
                        using (var frm = new ColMappingForm(org.TargetCol))
                        {
                            if (svc.ShowDialog(frm) == DialogResult.Cancel)
                            {
                                return org;
                            }
                            edited.TargetCol = frm.Retsu;
                        }
                        // 変換値
                        using (var frm = new ColKeyValueListForm(org.ConvertMap))
                        {
                            if (svc.ShowDialog(frm) == DialogResult.Cancel)
                            {
                                return org;
                            }
                            edited.ConvertMap = frm.keyValuePairs;
                        }
                        break;
                    case ColumnType.HorizontalDate:
                        // 何もしない
                        edited.Type = ColumnType.HorizontalDate;
                        break;
                    case ColumnType.ValueAmount:
                        // 何もしない
                        edited.Type = ColumnType.ValueAmount;
                        break;
                    case ColumnType.FuncReplace:
                        // 列選択
                        using (var frm = new ColMappingForm(org.TargetCol))
                        {
                            if (svc.ShowDialog(frm) == DialogResult.Cancel)
                            {
                                return org;
                            }
                            edited.TargetCol = frm.Retsu;
                        }
                        break;

                    case ColumnType.FuncSubstring:
                        // 列選択
                        using (var frm = new ColMappingForm(org.TargetCol))
                        {
                            if (svc.ShowDialog(frm) == DialogResult.Cancel)
                            {
                                return org;
                            }
                            edited.TargetCol = frm.Retsu;
                        }

                        //途中でやめた！(笑)🔥🌊
                        //// 置換値
                        //using (var frm = new ColReplaceForm(org.ConvertMap))
                        //{
                        //    if (svc.ShowDialog(frm) == DialogResult.Cancel)
                        //    {
                        //        return org;
                        //    }
                        //    edited.ConvertMap = frm.keyValuePairs;
                        //}
                        break;
                }
                return edited; // 編集後のデータを返す
            }
            return org;
        }
    }
}