using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Tao.OpenGl;
using WiimoteLib;

namespace Log740
{
    class ExempleWii : AbstractExemple
    {
        private WiiInput wm; // Controle de Wiimote

        private Quaternion quatx = Quaternion.FromAxisAngle(1, 0, 0, -Math.PI / 2); // quaternion de la rotation en x par defaut
        private Quaternion quat_wii = Quaternion.Identity(); // quaternion de la rotation du wiimote

        private float rotz = 0; // Orientation du joueur
        private Quaternion quatz = Quaternion.Identity(); // quaternion de l'orientation du joueur

        public ExempleWii() : base(10)
        {
            wm = new WiiInput(20, Quaternion.FromAxisAngle(1, 0, 0, 0), false);
            wm.ButtonPress += wm_ButtonEventHandler;
            wm.ButtonDepress += wm_ButtonEventHandler;
            wm.SetLEDs(true, false, true, false);
        }

        protected override void Cleanup()
        {
            wm.Disconnect();
        }

        private void wm_ButtonEventHandler(object sender, WiimoteButtonEvent args)
        {
            if (args.Pressed)
            {
                // Quand le bouton Home est appuye, remettre la position et orientation a zero
                if (args.ButtonType == BUTTON_TYPE.HOME_BUTTON)
                {
                    position.X = 0;
                    position.Y = 0;
                    rotz = 0;
                    quatz = Quaternion.Identity();
                }
                // Quand le bouton B est appuye, selectionne l'ennemi sous le pointeur
                else if (args.ButtonType == BUTTON_TYPE.B_BUTTON)
                {
                    if (selected_enemy != null)
                    {
                        selected_enemy.Color = new Vecteur3F(1, 0, 0);
                    }

                    selected_enemy = SelectedEnemy();

                    if (selected_enemy != null)
                    {
                        selected_enemy.Color = new Vecteur3F(1, 1, 1);
                    }
                }
                // Quand le bouton A est appuye, tire un projectile
                else if (args.ButtonType == BUTTON_TYPE.A_BUTTON || args.ButtonType == BUTTON_TYPE.C_BUTTON)
                {
                    Shoot();
                }
            }

            if (args.ButtonType == BUTTON_TYPE.Z_BUTTON)
            {
                pointing = args.Pressed;

                // Quand Z est relache, ramene le curseur
                if (pointing == false)
                {
                    ResetCrosshair();
                }
            }
        }

        override protected void RefreshScene()
        {
            base.RefreshScene(); // pour Esc -> Close

            wm.DoEvents(); // S'occuper des evenements du wiimote

            // Quitter si le bouton Plus est appuye
            if (wm.Buttons.Plus)
            {
                this.CloseGLWindow();
            }

            // Si Z est appuye, le joystick deplace la mire
            if (wm.Nunchuck.Z)
            {
                if (Math.Abs(wm.Nunchuck.Joystick.X) > WiiInput.JOYSTICK_DEADZONE)
                {
                    crosshair.Location.X += wm.Nunchuck.Joystick.X * 30;
                }

                if (Math.Abs(wm.Nunchuck.Joystick.Y) > WiiInput.JOYSTICK_DEADZONE)
                {
                    crosshair.Location.Y += wm.Nunchuck.Joystick.Y * 30;
                }
            }
            else
            {
                // Sinon, X change l'orientation du joueur
                if (Math.Abs(wm.Nunchuck.Joystick.X) > WiiInput.JOYSTICK_DEADZONE)
                {
                    rotz -= Math.Sign(wm.Nunchuck.Joystick.X) * wm.Nunchuck.Joystick.X * wm.Nunchuck.Joystick.X / 100;
                    quatz = Quaternion.FromAxisAngle(0, 0, 1, -rotz);
                }

                // Et Y change sa position
                if (Math.Abs(wm.Nunchuck.Joystick.Y) > WiiInput.JOYSTICK_DEADZONE)
                {
                    double value = 0.1 * Math.Sign(wm.Nunchuck.Joystick.Y) * wm.Nunchuck.Joystick.Y * wm.Nunchuck.Joystick.Y;
                    position.Y += (float)Math.Cos(rotz) * value;
                    position.X -= (float)Math.Sin(rotz) * value;
                }
            }

            quat_wii = wm.Rotation;

            CameraRotation = quatx * quat_wii * quatz;

            CameraPosition = position + (-quatz * -quat_wii * ground_offset);
        }
    }
}
