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.Drawing.Drawing2D;
using CommonAI.RTS;
using System.IO;

namespace CommonTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            this.DoubleBuffered = true;
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

            InitializeComponent();

            GameWorld.global_font = this.Font;

            this.MouseWheel += new MouseEventHandler(form1_MouseWheel);

            this.mapmask = (Bitmap)Bitmap.FromFile(Application.StartupPath + "\\res\\MapData.png");
        }

        //---------------------------------------------------------------------------------------

        Bitmap mapmask;
        GameWorld world;
        GameUnit actor;


        private void Form1_Load(object sender, EventArgs e)
        {
            string path = "F:\\projects\\morefuntek\\Heros\\Client\\GameEditors\\SceneEditor\\Assets\\DGodWorld\\Data\\";
            XLSLoader xls = new XLSLoader();
            using (FileStream fs = new FileStream(path + "TriggerTemplate.xls.xml", FileMode.Open))
            {
                xls.LoadTriggerTemplate(fs);
            }
            using (FileStream fs = new FileStream(path + "UnitTemplate.xls.xml", FileMode.Open))
            {
                xls.LoadUnitTemplate(fs);
            }
            this.world = GameWorld.createLOL(mapmask);
            this.world.test_AddActor("Actor");
        }

        private void restart3CToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.world = GameWorld.create3C();
            this.world.test_AddActor("Actor");
        }

        private void restart4AToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.world = GameWorld.create4A();
            this.world.test_AddActor("Actor");
        }

        private void restartLOLToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.world = GameWorld.createLOL(mapmask);
            this.world.test_AddActor("Actor");
        }

        //---------------------------------------------------------------------------------------

        // timer 2 for render system
        private void timer2_Tick(object sender, EventArgs e)
        {
            world.setWindow(new RectangleF(0, 0, pictureBox1.Width, pictureBox1.Height));
            world.update();
            actor = world.getUnitByName("Actor");
            if (actor != null)
            {
                world.setCamera(actor.pos.x, actor.pos.y);
            }
            pictureBox1.Refresh();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            world.renderWorld(e.Graphics);

            world.renderHUD(e.Graphics, actor);
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            float wx = world.screenToWorldX(e.X);
            float wy = world.screenToWorldY(e.Y);

            if (actor != null)
            {
                if (e.Button == MouseButtons.Left)
                {
                    world.test_UnitMove(actor.ID, wx, wy);
                }
                else if (e.Button == MouseButtons.Right)
                {
                    world.test_UnitSlip(actor.ID, wx, wy);
                }
            }
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            float wx = world.screenToWorldX(e.X);
            float wy = world.screenToWorldY(e.Y);

            if (actor != null)
            {
                if (e.Button == MouseButtons.Left)
                {
                    world.test_UnitMove(actor.ID, wx, wy);
                }
            }
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (actor != null)
            {
                if (e.KeyCode >= Keys.D1 && e.KeyCode <= Keys.D9)
                {
                    world.test_UnitAttack(actor.ID, 1 + (e.KeyCode - Keys.D1));
                } 
            }
        }

        private void spawnUnitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                world.test_AddUnit("Enemy");
            }
        }

        private void spawnUnit100ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {
                world.test_AddUnit("Enemy");
            }
        }

        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 1000; i++)
            {
                world.test_AddUnit("Enemy");
            }
        }

        private void toolStripMenuItem3_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10000; i++)
            {
                world.test_AddUnit("Enemy");
            }
        }

        void form1_MouseWheel(object sender, MouseEventArgs e)
        {
            int d = RTSMath.getDirect(e.Delta) ;
            if (d > 0)
            {
                world.setCameraScale(world.getCameraScale() * 1.1f);
            }
            else if (d < 0)
            {
                world.setCameraScale(world.getCameraScale() / 1.1f);
            }
        }




    }

}