﻿
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class ClassChange : UdonSharpBehaviour
{
    public AudioClip ActivateSound;

    [Header("Put in a text box to enable class code system")]
    public UnityEngine.UI.InputField ClassCodeInput;

    [UdonSynced(UdonSyncMode.None), HideInInspector]
    public string ClassCodeString = "";

    [Header("")]
    public float ChestDMG = 200;
    public float ChestDMGShieldRatio = 0.5f;

    [Header("")]
    public float HeadDMG = 1900;
    public float HeadDMGShieldRatio = 0.75f;
    

    [Header("")]
    public float DOTDMG = 280;
    public float DOTEffectRatio = 0.8f;

    [Header("")]
    public float HOTAmount = 250;

    [Header("To be tested")]
    public float ElectricDMG = 80;

    [Header("")]
    public float FireDMG = 280;

    [Header("")]
    public float PoisonDMG = 280;

    [Header("Not implemented")]
    public float RadDMG = 280;
    //bool RadWait = false;

    [Header("")]
    public float IceDMG = 80;
    public float IceEffectRatio = 0.4f;

    [Header("")]
    public float StunEffectRatio = 0.1f;

    [Header("")]
    public float SlowEffectRatio = 0.6f;

    [Header("")]
    public float SpeedEffectRatio = 1.8f;
    

    [Header("Not implemented")]
    public float RepairAmount = 0;


    [Header("")]
    public float JumpSpeed = 5;
    public float RunSpeed = 5;
    public float WalkSpeed = 3;
    public float StrafeSpeed = 3;

    HitboxManager hitboxManager;
    private void Start()
    {
        GameObject hitboxManagerObject = GameObject.Find("HitboxManager");
        if (hitboxManagerObject != null)
        {
            Debug.Log("Hitbox manager object found!");
            hitboxManager = hitboxManagerObject.GetComponent<HitboxManager>();
            if (hitboxManager)
            {
                Debug.Log("We got the Hitbox Manager!");
            }
            else
            {

                Debug.Log("We DO NOT HAVE the Hitbox Manager!");
            }
        }
        else
        {
            Debug.Log("Hitbox manager object not found!");
        }
        if (ClassCodeInput != null)
        {
            ClassCodeInput.text =
                "ChestDMG:" + ChestDMG
                +";"+
                "ChestDMGShieldRatio:" + ChestDMGShieldRatio
                + ";" +
                "HeadDMG:" + HeadDMG
                + ";" +
                "HeadDMGShieldRatio:" + HeadDMGShieldRatio
                + ";" +
                "DOTDMG:" + DOTDMG
                + ";" +
                "DOTEffectRatio:" + DOTEffectRatio
                + ";" +
                "HOTAmount:" + HOTAmount
                + ";" +
                "ElectricDMG:" + ElectricDMG
                + ";" +
                "FireDMG:" + FireDMG
                + ";" +
                "PoisonDMG:" + PoisonDMG
                + ";" +
                "RadDMG:" + RadDMG
                + ";" +
                "IceDMG:" + IceDMG
                + ";" +
                "IceEffectRatio:" + IceEffectRatio
                + ";" +
                "StunEffectRatio:" + StunEffectRatio
                + ";" +
                "SlowEffectRatio:" + SlowEffectRatio
                + ";" +
                "SpeedEffectRatio:" + SpeedEffectRatio
                + ";" +
                "RepairAmount:" + RepairAmount
                + ";" +
                "JumpSpeed:" + JumpSpeed
                + ";" +
                "RunSpeed:" + RunSpeed
                + ";" +
                "WalkSpeed:" + WalkSpeed
                + ";" +
                "StrafeSpeed:" + StrafeSpeed
                ;
            ClassCodeString = ClassCodeInput.text;
        }
    }
    // Probally needed, not sure sure about the IsValid though...
    bool PlayerCheck(VRCPlayerApi playerApi)
    {

        if (playerApi != null)
        {
            if (playerApi.IsValid())
            {
                return true;
            }
        }
        return false;
    }
    public override void Interact()
    {
        if (PlayerCheck(Networking.LocalPlayer))
        {
            if (hitboxManager != null)
            {
                hitboxManager.ActiveClassChange = this;
                hitboxManager.ChangeClass();
            }
        }
    }

    public override void OnDeserialization()
    {
        SyncClass();
    }

    public void SyncClass()
    {
        if (ClassCodeInput != null)
        {
            if (Networking.IsMaster)
            {
                ClassCodeString = ClassCodeInput.text;
                RequestSerialization();
            }
            else
            {
                ClassCodeInput.text = ClassCodeString;
            }
        }
        ChestDMG = 200;
        ChestDMGShieldRatio = 0.5f;

        HeadDMG = 1900;
        HeadDMGShieldRatio = 0.75f;

        DOTDMG = 280;
        DOTEffectRatio = 0.8f;

        HOTAmount = 250;

        ElectricDMG = 80;

        FireDMG = 280;

        PoisonDMG = 280;

        RadDMG = 280;

        IceDMG = 80;
        IceEffectRatio = 0.4f;

        StunEffectRatio = 0.1f;

        SlowEffectRatio = 0.6f;

        SpeedEffectRatio = 1.8f;

        RepairAmount = 0;

        JumpSpeed = 5;
        RunSpeed = 5;
        WalkSpeed = 3;
        StrafeSpeed = 3;

        string[] ClassCodes = ClassCodeString.Split(';');
        foreach (string ClassCode in ClassCodes)
        {
            string[] ClassCodeData = ClassCode.Split(':');
            switch (ClassCodeData[0])
            {
                case "ChestDMG":
                    ChestDMG = float.Parse(ClassCodeData[1]);
                    break;
                case "ChestDMGShieldRatio":
                    ChestDMGShieldRatio = float.Parse(ClassCodeData[1]);
                    break;
                case "HeadDMG":
                    HeadDMG = float.Parse(ClassCodeData[1]);
                    break;
                case "HeadDMGShieldRatio":
                    HeadDMGShieldRatio = float.Parse(ClassCodeData[1]);
                    break;
                case "DOTDMG":
                    DOTDMG = float.Parse(ClassCodeData[1]);
                    break;
                case "DOTEffectRatio":
                    DOTEffectRatio = float.Parse(ClassCodeData[1]);
                    break;
                case "HOTAmount":
                    HOTAmount = float.Parse(ClassCodeData[1]);
                    break;
                case "ElectricDMG":
                    ElectricDMG = float.Parse(ClassCodeData[1]);
                    break;
                case "FireDMG":
                    FireDMG = float.Parse(ClassCodeData[1]);
                    break;
                case "PoisonDMG":
                    PoisonDMG = float.Parse(ClassCodeData[1]);
                    break;
                case "RadDMG":
                    RadDMG = float.Parse(ClassCodeData[1]);
                    break;
                case "IceDMG":
                    IceDMG = float.Parse(ClassCodeData[1]);
                    break;
                case "IceEffectRatio":
                    IceEffectRatio = float.Parse(ClassCodeData[1]);
                    break;
                case "StunEffectRatio":
                    StunEffectRatio = float.Parse(ClassCodeData[1]);
                    break;
                case "SlowEffectRatio":
                    SlowEffectRatio = float.Parse(ClassCodeData[1]);
                    break;
                case "SpeedEffectRatio":
                    SpeedEffectRatio = float.Parse(ClassCodeData[1]);
                    break;
                case "RepairAmount":
                    RepairAmount = float.Parse(ClassCodeData[1]);
                    break;
                case "JumpSpeed":
                    JumpSpeed = float.Parse(ClassCodeData[1]);
                    break;
                case "RunSpeed":
                    RunSpeed = float.Parse(ClassCodeData[1]);
                    break;
                case "WalkSpeed":
                    WalkSpeed = float.Parse(ClassCodeData[1]);
                    break;
                case "StrafeSpeed":
                    StrafeSpeed = float.Parse(ClassCodeData[1]);
                    break;
            }
        }
    }
    public void ChangeClass()
    {
        if (PlayerCheck(Networking.LocalPlayer))
        {
            if (hitboxManager != null)
            {
                if(ActivateSound)
                {
                    AudioSource.PlayClipAtPoint(ActivateSound, transform.position);
                }
                
                hitboxManager.ChestDMG = ChestDMG;
                hitboxManager.ChestDMGShieldRatio = ChestDMGShieldRatio;
                hitboxManager.HeadDMG = HeadDMG;
                hitboxManager.HeadDMGShieldRatio = HeadDMGShieldRatio;
                hitboxManager.DOTDMG = DOTDMG;
                hitboxManager.DOTEffectRatio = DOTEffectRatio;
                hitboxManager.HOTAmount = HOTAmount;
                hitboxManager.ElectricDMG = ElectricDMG;
                hitboxManager.FireDMG = FireDMG;
                hitboxManager.PoisonDMG = PoisonDMG;
                hitboxManager.RadDMG = RadDMG;
                hitboxManager.IceDMG = IceDMG;
                hitboxManager.IceEffectRatio = IceEffectRatio;
                hitboxManager.StunEffectRatio = StunEffectRatio;
                hitboxManager.SlowEffectRatio = SlowEffectRatio;
                hitboxManager.SpeedEffectRatio = SpeedEffectRatio;
                hitboxManager.RepairAmount = RepairAmount;
                hitboxManager.JumpSpeed = JumpSpeed;
                hitboxManager.RunSpeed = RunSpeed;
                hitboxManager.WalkSpeed = WalkSpeed;
                hitboxManager.StrafeSpeed = StrafeSpeed;
            }
        }
    }
}
