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 CommonAI.ZoneEditor;
using CommonAI.Zone.ZoneEditor.EventTrigger;

namespace CommonAIEditor.Scene
{
    public partial class SceneVarEditor : Form
    {
        readonly private SceneEditor sceneEditor;
        public SceneVarEditor(SceneEditor scene)
        {
            InitializeComponent();
            this.sceneEditor = scene;
            this.Text = scene.Text + " - 变量编辑器";

            LoadData();
        }

        private void LoadData()
        {
            foreach (ZoneVar var in sceneEditor.Data.EnvironmentVars)
            {
                this.listView1.Items.Add(ToItem(var));
            }
        }

        internal void Save()
        {
            sceneEditor.Data.EnvironmentVars.Clear();
            foreach (ListViewItem item in listView1.Items)
            {
                sceneEditor.Data.EnvironmentVars.Add(item.Tag as ZoneVar);
            }
        }

        internal bool ContainsVarKey(string key)
        {
            foreach (ListViewItem item in listView1.Items)
            {
                if (key.Equals((item.Tag as ZoneVar).Key))
                {
                    return true;
                }
            }
            return false;
        }

        internal string GenVarKey()
        {
            int i = 0;
            while (true)
            {
                string name = "VarName" + i;
                if (!ContainsVarKey(name))
                {
                    return name;
                }
                i++;
            }
        }

        private void btn_Add_Click(object sender, EventArgs e)
        {
            SceneVarDialog dialog = new SceneVarDialog(sceneEditor, this);
            if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                ZoneVar var = dialog.Value;
                this.listView1.Items.Add(ToItem(var));
            }
        }

        private void btn_Remove_Click(object sender, EventArgs e)
        {
            foreach (ListViewItem item in SelectedItems())
            {
                listView1.Items.Remove(item);
            }
        }

        private void btn_Edit_Click(object sender, EventArgs e)
        {
            foreach (ListViewItem item in SelectedItems())
            {
                SceneVarDialog dialog = new SceneVarDialog(sceneEditor, this, item.Tag as ZoneVar);
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    SetItem(dialog.Value, item);
                }
                return;
            }
        }

        private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            ListViewItem item = listView1.GetItemAt(e.X, e.Y);
            if (item != null)
            {
                SceneVarDialog dialog = new SceneVarDialog(sceneEditor, this, item.Tag as ZoneVar);
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    SetItem(dialog.Value, item);
                }
            }
        }

        private ListViewItem[] SelectedItems()
        {
            ListViewItem[] ret = new ListViewItem[listView1.SelectedItems.Count];
            listView1.SelectedItems.CopyTo(ret, 0);
            return ret;
        }

        private ListViewItem ToItem(ZoneVar var)
        {
            ListViewItem item = new ListViewItem(new string[] {
                var.Key, 
                AbstractValueTypeMap.GetBaseValueType(var.Value.GetType()).Desc.Desc,
                var.Value.ToString(),
                var.SyncToClient?"是":"否"
            });
            item.Tag = var;
            item.ImageIndex = var.SyncToClient ? 1 : 0;
            return item;
        }

        private void SetItem(ZoneVar var, ListViewItem item)
        {
            item.SubItems[0].Text = var.Key;
            item.SubItems[1].Text = AbstractValueTypeMap.GetBaseValueType(var.Value.GetType()).Desc.Desc;
            item.SubItems[2].Text = var.Value.ToString();
            item.SubItems[3].Text = var.SyncToClient ? "是" : "否";
            item.Tag = var;
            item.ImageIndex = var.SyncToClient ? 1 : 0;
        }

    }
}