using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using CommonAI.Zone.ZoneEditor;

namespace GameEditorPlugin.Lua
{
    public class LuaCodeGen
    {
        private static Encoding UTF8 = new UTF8Encoding(false);
        private readonly int sceneID;
        private readonly DirectoryInfo scene_proj;
        private readonly DirectoryInfo client_dir;
        private readonly DirectoryInfo server_dir;
        private readonly DirectoryInfo template_dir;

        public LuaCodeGen(DirectoryInfo scene_proj, int sceneID)
        {
            this.scene_proj = scene_proj;
            this.sceneID = sceneID;

            if (!scene_proj.Exists)
            {
                scene_proj.Create();
                client_dir = scene_proj.CreateSubdirectory("client");
                server_dir = scene_proj.CreateSubdirectory("server");
            }
            else
            {
                client_dir = new DirectoryInfo(scene_proj.FullName + "/client");
                server_dir = new DirectoryInfo(scene_proj.FullName + "/server");
                if (!client_dir.Exists) client_dir.Create();
                if (!server_dir.Exists) server_dir.Create();
            } 
            template_dir = new DirectoryInfo(scene_proj.Parent.FullName + "/doc/template");
        }

        public FileInfo GenSceneScript(object data)
        {
            FileInfo ret = null;
            if (data is SceneData)
            {
                SceneData sdata = data as SceneData;
                FileInfo dst_zone_script = new FileInfo(server_dir.FullName + "/ZoneEvents.lua");
                ret = new FileInfo(server_dir.FullName + "/ZoneEvents.lua");
                if (!dst_zone_script.Exists)
                {
                    string st = File.ReadAllText(template_dir.FullName + "/IZoneListener.lua", UTF8);
                    st = st.Replace("_Name_", "_" + sdata.Name + "_");
                    File.WriteAllText(ret.FullName, st, UTF8);
                }
            }
            else if (data is SceneObjectData)
            {
                SceneObjectData obj = (data as SceneObjectData);
                if (data is UnitData)
                {
                    ret = RedirectTemplate(obj.Name, "IUnitListener.lua", server_dir);
                }
                else if (data is RegionData)
                {
                    ret = RedirectTemplate(obj.Name, "IRegionListener.lua", server_dir);
                }
                else
                {
                    ret = RedirectTemplate(obj.Name, "IFlagListener.lua", server_dir);
                }
                obj.Script = ret.Name;
            }
            return ret;
        }

        private FileInfo RedirectTemplate(string name, string template_file_name, DirectoryInfo dst_dir)
        {
            FileInfo dst_file = new FileInfo(dst_dir.FullName + "/" + name + "_Events.lua");
            if (!dst_file.Exists)
            {
                string ut = File.ReadAllText(template_dir.FullName + "/" + template_file_name, UTF8);
                ut = ut.Replace("_Name_", "_" + name + "_");
                File.WriteAllText(dst_file.FullName, ut, UTF8);
            }
            return dst_file;
        }
    }
}