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

public class SubClassChange : 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 = "";
    
    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 ="";
        }
    }
    // 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.ActiveSubClassChange = 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;
            }
        }
    }
    public void ChangeClass()
    {
        if (PlayerCheck(Networking.LocalPlayer))
        {
            if (hitboxManager != null)
            {
                if (ActivateSound)
                {
                    AudioSource.PlayClipAtPoint(ActivateSound, transform.position);
                }

                string[] ClassCodes = ClassCodeString.Split(';');
                foreach (string ClassCode in ClassCodes)
                {
                    string[] ClassCodeData = ClassCode.Split(':');
                    switch (ClassCodeData[0])
                    {
                        case "ChestDMG":
                            hitboxManager.ChestDMG = float.Parse(ClassCodeData[1]);
                            break;
                        case "-ChestDMG":
                            hitboxManager.ChestDMG -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+ChestDMG":
                            hitboxManager.ChestDMG += float.Parse(ClassCodeData[1]);
                            break;
                        case "*ChestDMG":
                            hitboxManager.ChestDMG *= float.Parse(ClassCodeData[1]);
                            break;
                        case "ChestDMGShieldRatio":
                            hitboxManager.ChestDMGShieldRatio = float.Parse(ClassCodeData[1]);
                            break;
                        case "-ChestDMGShieldRatio":
                            hitboxManager.ChestDMGShieldRatio -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+ChestDMGShieldRatio":
                            hitboxManager.ChestDMGShieldRatio += float.Parse(ClassCodeData[1]);
                            break;
                        case "*ChestDMGShieldRatio":
                            hitboxManager.ChestDMGShieldRatio *= float.Parse(ClassCodeData[1]);
                            break;
                        case "HeadDMG":
                            hitboxManager.HeadDMG = float.Parse(ClassCodeData[1]);
                            break;
                        case "-HeadDMG":
                            hitboxManager.HeadDMG -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+HeadDMG":
                            hitboxManager.HeadDMG += float.Parse(ClassCodeData[1]);
                            break;
                        case "*HeadDMG":
                            hitboxManager.HeadDMG *= float.Parse(ClassCodeData[1]);
                            break;
                        case "HeadDMGShieldRatio":
                            hitboxManager.HeadDMGShieldRatio = float.Parse(ClassCodeData[1]);
                            break;
                        case "-HeadDMGShieldRatio":
                            hitboxManager.HeadDMGShieldRatio -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+HeadDMGShieldRatio":
                            hitboxManager.HeadDMGShieldRatio += float.Parse(ClassCodeData[1]);
                            break;
                        case "*HeadDMGShieldRatio":
                            hitboxManager.HeadDMGShieldRatio *= float.Parse(ClassCodeData[1]);
                            break;
                        case "DOTDMG":
                            hitboxManager.DOTDMG = float.Parse(ClassCodeData[1]);
                            break;
                        case "-DOTDMG":
                            hitboxManager.DOTDMG -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+DOTDMG":
                            hitboxManager.DOTDMG += float.Parse(ClassCodeData[1]);
                            break;
                        case "*DOTDMG":
                            hitboxManager.DOTDMG *= float.Parse(ClassCodeData[1]);
                            break;
                        case "DOTEffectRatio":
                            hitboxManager.DOTEffectRatio = float.Parse(ClassCodeData[1]);
                            break;
                        case "-DOTEffectRatio":
                            hitboxManager.DOTEffectRatio -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+DOTEffectRatio":
                            hitboxManager.DOTEffectRatio += float.Parse(ClassCodeData[1]);
                            break;
                        case "*DOTEffectRatio":
                            hitboxManager.DOTEffectRatio *= float.Parse(ClassCodeData[1]);
                            break;
                        case "HOTAmount":
                            hitboxManager.HOTAmount = float.Parse(ClassCodeData[1]);
                            break;
                        case "_HOTAmount":
                            hitboxManager.HOTAmount -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+HOTAmount":
                            hitboxManager.HOTAmount += float.Parse(ClassCodeData[1]);
                            break;
                        case "*HOTAmount":
                            hitboxManager.HOTAmount *= float.Parse(ClassCodeData[1]);
                            break;
                        case "ElectricDMG":
                            hitboxManager.ElectricDMG = float.Parse(ClassCodeData[1]);
                            break;
                        case "-ElectricDMG":
                            hitboxManager.ElectricDMG -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+ElectricDMG":
                            hitboxManager.ElectricDMG += float.Parse(ClassCodeData[1]);
                            break;
                        case "*ElectricDMG":
                            hitboxManager.ElectricDMG *= float.Parse(ClassCodeData[1]);
                            break;
                        case "FireDMG":
                            hitboxManager.FireDMG = float.Parse(ClassCodeData[1]);
                            break;
                        case "-FireDMG":
                            hitboxManager.FireDMG -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+FireDMG":
                            hitboxManager.FireDMG += float.Parse(ClassCodeData[1]);
                            break;
                        case "*FireDMG":
                            hitboxManager.FireDMG *= float.Parse(ClassCodeData[1]);
                            break;
                        case "PoisonDMG":
                            hitboxManager.PoisonDMG = float.Parse(ClassCodeData[1]);
                            break;
                        case "-PoisonDMG":
                            hitboxManager.PoisonDMG -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+PoisonDMG":
                            hitboxManager.PoisonDMG += float.Parse(ClassCodeData[1]);
                            break;
                        case "*PoisonDMG":
                            hitboxManager.PoisonDMG *= float.Parse(ClassCodeData[1]);
                            break;
                        case "RadDMG":
                            hitboxManager.RadDMG = float.Parse(ClassCodeData[1]);
                            break;
                        case "-RadDMG":
                            hitboxManager.RadDMG -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+RadDMG":
                            hitboxManager.RadDMG += float.Parse(ClassCodeData[1]);
                            break;
                        case "*RadDMG":
                            hitboxManager.RadDMG *= float.Parse(ClassCodeData[1]);
                            break;
                        case "IceDMG":
                            hitboxManager.IceDMG = float.Parse(ClassCodeData[1]);
                            break;
                        case "-IceDMG":
                            hitboxManager.IceDMG -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+IceDMG":
                            hitboxManager.IceDMG += float.Parse(ClassCodeData[1]);
                            break;
                        case "*IceDMG":
                            hitboxManager.IceDMG *= float.Parse(ClassCodeData[1]);
                            break;
                        case "IceEffectRatio":
                            hitboxManager.IceEffectRatio = float.Parse(ClassCodeData[1]);
                            break;
                        case "-IceEffectRatio":
                            hitboxManager.IceEffectRatio -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+IceEffectRatio":
                            hitboxManager.IceEffectRatio += float.Parse(ClassCodeData[1]);
                            break;
                        case "*IceEffectRatio":
                            hitboxManager.IceEffectRatio *= float.Parse(ClassCodeData[1]);
                            break;
                        case "StunEffectRatio":
                            hitboxManager.StunEffectRatio = float.Parse(ClassCodeData[1]);
                            break;
                        case "-StunEffectRatio":
                            hitboxManager.StunEffectRatio -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+StunEffectRatio":
                            hitboxManager.StunEffectRatio += float.Parse(ClassCodeData[1]);
                            break;
                        case "*StunEffectRatio":
                            hitboxManager.StunEffectRatio *= float.Parse(ClassCodeData[1]);
                            break;
                        case "SlowEffectRatio":
                            hitboxManager.SlowEffectRatio = float.Parse(ClassCodeData[1]);
                            break;
                        case "-SlowEffectRatio":
                            hitboxManager.SlowEffectRatio -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+SlowEffectRatio":
                            hitboxManager.SlowEffectRatio += float.Parse(ClassCodeData[1]);
                            break;
                        case "*SlowEffectRatio":
                            hitboxManager.SlowEffectRatio *= float.Parse(ClassCodeData[1]);
                            break;
                        case "SpeedEffectRatio":
                            hitboxManager.SpeedEffectRatio = float.Parse(ClassCodeData[1]);
                            break;
                        case "-SpeedEffectRatio":
                            hitboxManager.SpeedEffectRatio -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+SpeedEffectRatio":
                            hitboxManager.SpeedEffectRatio += float.Parse(ClassCodeData[1]);
                            break;
                        case "*SpeedEffectRatio":
                            hitboxManager.SpeedEffectRatio *= float.Parse(ClassCodeData[1]);
                            break;
                        case "RepairAmount":
                            hitboxManager.RepairAmount = float.Parse(ClassCodeData[1]);
                            break;
                        case "-RepairAmount":
                            hitboxManager.RepairAmount -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+RepairAmount":
                            hitboxManager.RepairAmount += float.Parse(ClassCodeData[1]);
                            break;
                        case "*RepairAmount":
                            hitboxManager.RepairAmount *= float.Parse(ClassCodeData[1]);
                            break;
                        case "JumpSpeed":
                            hitboxManager.JumpSpeed = float.Parse(ClassCodeData[1]);
                            break;
                        case "-JumpSpeed":
                            hitboxManager.JumpSpeed -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+JumpSpeed":
                            hitboxManager.JumpSpeed += float.Parse(ClassCodeData[1]);
                            break;
                        case "*JumpSpeed":
                            hitboxManager.JumpSpeed *= float.Parse(ClassCodeData[1]);
                            break;
                        case "RunSpeed":
                            hitboxManager.RunSpeed = float.Parse(ClassCodeData[1]);
                            break;
                        case "-RunSpeed":
                            hitboxManager.RunSpeed -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+RunSpeed":
                            hitboxManager.RunSpeed += float.Parse(ClassCodeData[1]);
                            break;
                        case "*RunSpeed":
                            hitboxManager.RunSpeed *= float.Parse(ClassCodeData[1]);
                            break;
                        case "WalkSpeed":
                            hitboxManager.WalkSpeed = float.Parse(ClassCodeData[1]);
                            break;
                        case "-WalkSpeed":
                            hitboxManager.WalkSpeed -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+WalkSpeed":
                            hitboxManager.WalkSpeed += float.Parse(ClassCodeData[1]);
                            break;
                        case "*WalkSpeed":
                            hitboxManager.WalkSpeed *= float.Parse(ClassCodeData[1]);
                            break;
                        case "StrafeSpeed":
                            hitboxManager.StrafeSpeed = float.Parse(ClassCodeData[1]);
                            break;
                        case "-StrafeSpeed":
                            hitboxManager.StrafeSpeed -= float.Parse(ClassCodeData[1]);
                            break;
                        case "+StrafeSpeed":
                            hitboxManager.StrafeSpeed += float.Parse(ClassCodeData[1]);
                            break;
                        case "*StrafeSpeed":
                            hitboxManager.StrafeSpeed *= float.Parse(ClassCodeData[1]);
                            break;
                    }
                }
            }
        }
    }
}
