using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.SceneManagement;


//TODO: 테스트용, 게임로직과 머지시 삭제
public enum PlayerType{None, PlayerA, PlayerB}
public enum StoneType{None, White, Black}


[Serializable]
public class ReplayRecord
{
    public string gameDate;
    public string playerA;
    public string playerB;
    public List<Move> moves = new List<Move>();
    public string winnerPlayerType;
}
[Serializable]
public class Move
{
    public string stoneType;
    public int columnIndex;
    public int rowIndex;

    public Move(string stoneType, int columnIndex,int rowIndex)
    {
        this.stoneType = stoneType;
        this.columnIndex = columnIndex;
        this.rowIndex = rowIndex;
    }
}

public class ReplayManager : Singleton<ReplayManager>
{
    private ReplayRecord _recordingReplayData;
    

    ///<summary>
    /// 게임 시작에 호출해서 기보 데이터 초기화
    /// </summary>
    public void InitReplayData(string playerANickname, string playerBNickname)
    {
        _recordingReplayData = new ReplayRecord();
        _recordingReplayData.playerA = playerANickname;
        _recordingReplayData.playerB = playerBNickname;
    }
    
    ///<summary>
    /// 게임 씬에서 착수를 할 때마다 호출해서 기록
    /// </summary>
    public void RecordStonePlaced(StoneType stoneType,int row, int col)
    {
        string stoneColor = stoneType.ToString();
        _recordingReplayData.moves.Add(new Move(stoneColor, row, col));
    }


    /// <summary>
    /// 게임 종료 후 호출하여 리플레이 데이터를 저장합니다.
    /// </summary>
    public void SaveReplayData(PlayerType winnerPlayerType)
    {
        try
        {
            string time = DateTime.Now.ToString(("yyyy-MM-dd HH_mm_ss"));
            _recordingReplayData.gameDate = time;
            _recordingReplayData.winnerPlayerType = winnerPlayerType.ToString();


            string json = JsonUtility.ToJson(_recordingReplayData, true);


            string path = Path.Combine(Application.persistentDataPath, $"{time}.json");
            File.WriteAllText(path, json);

            //최신 데이터 10개만 유지되도록 저장
            RecordCountChecker();
        }
        catch(Exception e)
        {
            Debug.LogError($"An error occurred while saving replay data:{e.Message}");
        }
    }


    //폴더내 기보 파일을 전부 읽어옵니다.
    public List<ReplayRecord> LoadReplayDatas()
    {
        List<ReplayRecord> records = new List<ReplayRecord>();
        string path = Application.persistentDataPath;

        try
        {
            var files = Directory.GetFiles(path, "*.json");
            foreach (var file in files)
            {
                try
                {
                    ReplayRecord record = JsonUtility.FromJson<ReplayRecord>(File.ReadAllText(file));
                    records.Add(record);
                }
                catch (Exception e)
                {
                    Debug.LogError($"Replaydata cannot be converted to JSON: {e.Message}");
                }
            }
        }
        catch (Exception e)
        {
            Debug.LogError($"Replay Directory Error: {e.Message}");
        }

        return records;
    }
    
    private void RecordCountChecker()
    {
        try
        {
            string path = Application.persistentDataPath;
            var files = Directory.GetFiles(path, "*.json");
            if (files.Length <= 10)
                return;
            File.Delete(files[0]);
            RecordCountChecker();
        }
        catch (Exception e)
        {
            Debug.LogError($"Replay Directory Error: {e.Message}");
        }
    }
    

    protected override void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
    }
}