using System;
using System.Collections.Generic;
using FarseerPhysics.Dynamics.Joints;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Widgets;
using Silk.NET.SDL;
using Color = Jypeli.Color;

namespace KelaCombatTesti;

/// @author Sakari
/// @version 17.02.2025
/// <summary>
/// 
/// </summary>
    public class KelaCombatTesti : PhysicsGame
    {
        PlatformCharacter pelaaja;
        PhysicsObject Pesari;
        private Image KelabottiKuva = LoadImage("Kelabotti");
        private Image PelaajaKuva = LoadImage("Pelaaja.png");
        //private AssaultRifle PelaajanPesismaila;
        
        
      

        public override void Begin()
        {
            LuoKentta();
            LuoKelabotti();
            //LuoPesismaila(40, 90);
            //LuoPelaaja(0, 0);
            //Camera.Follow(pelaaja);
            //Camera.ZoomFactor = 1.2;
            //Camera.StayInLevel = true;
            
            
            

            
            
            Keyboard.Listen(Key.A, ButtonState.Down, LiikuVasemmalle, null, new Vector());
            Keyboard.Listen(Key.D, ButtonState.Down, LiikuOikealle, null, new Vector());
            Keyboard.Listen(Key.W, ButtonState.Down, Hyppaa, null, new Vector());
            Keyboard.Listen(Key.Space, ButtonState.Down, LyoMailalla, "", pelaaja);
            //Keyboard.Listen(Key.S, ButtonState.Down, LiikutaPelaajaa, null, new Vector(0, -1000));
            Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
            
            Keyboard.Listen(Key.J, ButtonState.Pressed, LuoPesismaila, "", new Vector(90, 10), pelaaja);
           

            
        
            void LiikuVasemmalle(Vector vektori)
            {
                pelaaja.Walk(-100);
            }

            void LiikuOikealle(Vector vektori)
            {
                pelaaja.Walk(100);
            }
            
            void Hyppaa(Vector vektori)
            {
                pelaaja.Jump(300.0);
            }
        }

        void LuoKentta()
        {
         
            Level.BackgroundColor = Color.Pink;
            Gravity = new Vector(0, -981.0);
            
            PhysicsObject vasenReuna = Level.CreateLeftBorder();
            vasenReuna.Restitution = 0.0;
            vasenReuna.KineticFriction = 0.0;
            vasenReuna.IsVisible = false;

            PhysicsObject oikeaReuna = Level.CreateRightBorder();
            oikeaReuna.Restitution = 0.0;
            oikeaReuna.KineticFriction = 0.0;
            oikeaReuna.IsVisible = false;

            PhysicsObject ylaReuna = Level.CreateTopBorder();
            ylaReuna.Restitution = 0.0;
            ylaReuna.KineticFriction = 0.0;
            ylaReuna.IsVisible = false;

            PhysicsObject alaReuna = Level.CreateBottomBorder();
            alaReuna.Restitution = 1.0;
            alaReuna.IsVisible = false;
            alaReuna.KineticFriction = 0.0;


            pelaaja = LuoPelaaja(0.0, 0.0);

        }
        //Tällä funktiolla luodaan pelaaja, sekä annetaan pelaajalle ase, AssaultRifle.
        // pelaaja kuuluu CollisionIgnoreGroup = 1. Kaikki fyysiset objektit, jotka on samassa CollisionIgnoreGroupissa
        // pystyy menemään toistensa läpi. Tarvitaan myöhemmin siihen, että pesismaila ja pelaajahahmo ei törmää toisiinsa
        //pelaaja.Weapon on turha. Se on korvattu LuoPesismailalla
        PlatformCharacter LuoPelaaja(double x, double y)
        {
            PlatformCharacter pelaaja = new PlatformCharacter(50.0, 100.0);
            pelaaja.Image = PelaajaKuva;
            pelaaja.Mass = 1.0;
            pelaaja.Image = LoadImage("Pelaaja.png");
            pelaaja.Shape = Shape.Rectangle;
            pelaaja.Color = Color.Black;
            pelaaja.X = x;
            pelaaja.Y = y;
            pelaaja.Weapon = new AssaultRifle(20, 20);
            pelaaja.CollisionIgnoreGroup = 1;
            pelaaja.Weapon.ProjectileCollision = LyontiOsui;
            Add(pelaaja);
            
           

            return pelaaja;
        }
        
        // Tässä luodaan Pesismailalla ampumisen systeemi
        // Pesismailan ampuma luoti eli Lyonti on pieni ja kestää vain 0,01s
        // Ase on käytännössä pesismailaksi naamioitu AssaultRifle
        //Tämäkin ampumismekaniikka on turha, koska se on osa turhaa pelaaja.Weaponi -systeemiä
        void LyoMailalla(PlatformCharacter pelaaja)
        {
            PhysicsObject Lyonti = pelaaja.Weapon.Shoot();

            if (Lyonti != null)
            {
                Lyonti.Size *= 0.1;
                //Pesismaila.Image
                Lyonti.MaximumLifetime = TimeSpan.FromSeconds(0.01);
            }
        }
        //Tässä tehdään lyönnin osumisen vaikutukset
        //Kelabottiin osuessa Lyonti (pesismailan ampuma luoti) ja Kelabotti tuhotaan
        //tämä osumisen käsittelykin on turha, koska LyoMailalla ja pelaaja.Weapon on turhaa
        void LyontiOsui(PhysicsObject Lyonti, PhysicsObject Kelabotti)
        {
            Lyonti.Destroy();
            Kelabotti.Destroy();
        }
        
        // Tässä luodaan uusi fysiikkaolio, Pesismaila
        //Tämä toimii pelaajan lyöntinä (samalla määritellään ase)
        //
        void LuoPesismaila(Vector koko, PlatformCharacter liitettava)
        {
            PhysicsObject Pesari = new PhysicsObject(koko.X, koko.Y);
            Pesari.Position = liitettava.Position + new Vector(80*liitettava.FacingDirection.GetVector().X, 10);
            Pesari.CollisionIgnoreGroup = 1;
            Pesari.Mass = 1;
            Add(Pesari);
            Pesari.LifetimeLeft = TimeSpan.FromSeconds(0.075);
            Pesari.IgnoresGravity = true;
            
        }

        
        
        //Tämä funktio luo Kelabotti-vihun ja sille annetaan pelaajan seuraamis aivot
        PlatformCharacter LuoKelabotti()
        {
            PlatformCharacter Kelabotti = new PlatformCharacter(80.0, 80.0);
            Kelabotti.Color = Color.Orange;
            Kelabotti.Image = KelabottiKuva;
            Kelabotti.MirrorImage();
            Add(Kelabotti);
            
            
            FollowerBrain seuraajanAivot = new FollowerBrain(pelaaja);
            seuraajanAivot.Speed = 100;

            Kelabotti.Brain = seuraajanAivot;
            return Kelabotti;
            
        }
        
       
        
    }