// Copyright 2013-2023, AFI.Inc. All rights reserved.

using System.Text;
using BackEnd;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

// CharacterProfileObject는 캐릭터 선택창에서 캐릭터 프로필을 보여주는 클래스입니다.
public class CharacterProfileObject : MonoBehaviour {
    [SerializeField] private Image profileImage;
    [SerializeField] private GameObject nickNameTextObject;
    [SerializeField] private GameObject jobClassTextObject;
    [SerializeField] private GameObject emptyTextObject;
    [SerializeField] private GameObject questionTextObject;
    [SerializeField] private Button clickButton;

    public CharacterProfile profile;

    private int _selectIndex;
    
    // 캐릭터 프로필을 설정합니다.
    public void SetProfile(CharacterSelectUI characterSelectUI, CharacterProfile profile, int index) {
        _selectIndex = index;
        this.profile = profile;
        
        clickButton.onClick.AddListener(() => {
            characterSelectUI.SelectCharacter(_selectIndex);
        });

        emptyTextObject.SetActive(false);
        questionTextObject.SetActive(false);
        profileImage.sprite = null;
        profileImage.gameObject.SetActive(false);
        nickNameTextObject.SetActive(false);
        jobClassTextObject.SetActive(false);

        // 프로필 데이터가 완전히 없을 경우
        if (profile.IsEmpty) {
            emptyTextObject.SetActive(true);
            return;
        }

        // 닉네임 설정
        nickNameTextObject.GetComponentInChildren<TMP_Text>().text = profile.nickName;
        
        // 캐릭터 정보는 있지만 해당 캐릭터의 게임 정보가 없을 경우
        if (profile.IsDataExist == false) {
            questionTextObject.SetActive(true);
            nickNameTextObject.SetActive(true);
            return;
        }
        
        nickNameTextObject.SetActive(true);
        profileImage.gameObject.SetActive(true);
        jobClassTextObject.SetActive(true);
        
        jobClassTextObject.GetComponentInChildren<TMP_Text>().text = $"Lv.{profile.userData.level} {profile.userData.jobClass}";

        var sprite = SpriteManager.GetImage(profile.userData.shape);
        if (sprite == null) {
            AlertUI.Instance.Alert("오류", $"{profile.nickName}의 프로필 이미지가 없습니다.(사진 이름 : {profile.userData.shape})");
        } else {
            profileImage.sprite = sprite;
        }
        
        switch (profile.userData.color) {
            case "Red":
                profileImage.color = Color.red;
                break;
            case "Green":
                profileImage.color = Color.green;
                break;
            case "Blue":
                profileImage.color = Color.blue;
                break;
            default:
                profileImage.color = Color.white;
                Debug.LogError("해당 컬러는 존재하지 않습니다 : " + profile.userData.color);
                break;
        }
    }
}


public class CharacterProfile {
    public string inDate;
    public string uuid;
    public string nickName;

    public UserData userData;
    public bool IsEmpty = true;
    public bool IsDataExist = false;

    public CharacterProfile(string uuid, string inDate, string nickName, UserData userData) {
        this.uuid = uuid;
        this.inDate = inDate;
        this.nickName = nickName;
        this.userData = userData;

        IsEmpty = false;
        IsDataExist = true;
    }

    // JsonData를 통해 캐릭터 프로필을 설정합니다.
    public CharacterProfile(LitJson.JsonData jsonData, string tableName) {
        IsEmpty = false;
        inDate = jsonData["inDate"].ToString();
        uuid = jsonData["uuid"].ToString();
        nickName = jsonData["nickname"].ToString();
        
        // 해당 테이블에 데이터가 없을 경우
        if (jsonData.ContainsKey(tableName) == false) {
            IsDataExist = false;
            return;
        }

        IsDataExist = true;
        userData = new UserData(jsonData[tableName]);
        userData.level = int.Parse(jsonData[tableName]["level"].ToString());
        userData.atk = int.Parse(jsonData[tableName]["atk"].ToString());
        userData.def = int.Parse(jsonData[tableName]["def"].ToString());
        userData.spd = int.Parse(jsonData[tableName]["spd"].ToString());
        userData.stage = int.Parse(jsonData[tableName]["stage"].ToString());
        userData.shape = jsonData[tableName]["shape"].ToString();
        userData.color = jsonData[tableName]["color"].ToString();
        userData.jobClass = jsonData[tableName]["jobClass"].ToString();
    }

    public string GetStats() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.AppendLine($"닉네임 : {nickName}");
        if (userData == null) {
            stringBuilder.AppendLine($"기본 데이터가 생성되지 않았습니다.");
        }
        else
        {
            stringBuilder.AppendLine($"Lv : {userData.level}");
            stringBuilder.AppendLine($"직업 : {userData.jobClass}");
            stringBuilder.AppendLine($"공격력 : {userData.atk}");
            stringBuilder.AppendLine($"방어력 : {userData.def}");
            stringBuilder.AppendLine($"속도 : {userData.spd}");
            stringBuilder.AppendLine($"스테이지 : {userData.stage}");
        }
        

        return stringBuilder.ToString();
    }

}

public class UserData {
    public int level = 1;
    public int atk = 1;
    public int def = 1;
    public int spd = 1;
    public int stage = 1;
    public string shape = string.Empty;
    public string color = string.Empty;
    public string jobClass = string.Empty;

    public UserData() {
        
    }

    public UserData(LitJson.JsonData jsonData) {
        level = int.Parse(jsonData["level"].ToString());
        atk = int.Parse(jsonData["atk"].ToString());
        def = int.Parse(jsonData["def"].ToString());
        spd = int.Parse(jsonData["spd"].ToString());
        stage = int.Parse(jsonData["stage"].ToString());
        shape = jsonData["shape"].ToString();
        color = jsonData["color"].ToString();
        jobClass = jsonData["jobClass"].ToString();
    }

    public Param GetParam() {

        Param param = new Param();
        param.Add("level", level);
        param.Add("atk", atk);
        param.Add("def", def);
        param.Add("spd", spd);
        param.Add("stage", stage);
        param.Add("shape", shape);
        param.Add("color", color);
        param.Add("jobClass", jobClass);
        return param;
    }
}