using UnityEngine;
using UnityEditor; // 에디터 기능 사용을 위해 필수
using System.IO;

public class LevelAssetGenerator : EditorWindow
{
    // 생성할 레벨 개수 설정
    private int levelCount = 100;
    // 저장될 경로 (Resources 폴더에 넣으면 런타임 로드가 편함)
    private string savePath = "Assets/Resources/Levels";

    // Unity 상단 메뉴에 도구 추가 [Tools -> Generate Levels]
    [MenuItem("Tools/Generate Levels")]
    public static void ShowWindow()
    {
        GetWindow<LevelAssetGenerator>("Level Generator");
    }

    private void OnGUI()
    {
        GUILayout.Label("Puzzle Level Auto-Generator", EditorStyles.boldLabel);
        
        levelCount = EditorGUILayout.IntField("Total Levels", levelCount);
        savePath = EditorGUILayout.TextField("Save Path", savePath);

        EditorGUILayout.Space();

        if (GUILayout.Button("Generate 100 Levels"))
        {
            CreateLevels();
        }
    }

    private void CreateLevels()
    {
        // 1. 폴더가 없으면 생성
        if (!Directory.Exists(savePath))
        {
            Directory.CreateDirectory(savePath);
            AssetDatabase.Refresh();
        }

        for (int i = 1; i <= levelCount; i++)
        {
            // 2. 인스턴스 생성
            LevelData levelData = ScriptableObject.CreateInstance<LevelData>();
            
            // 3. 데이터 설정 (난이도 로직)
            SetLevelDifficulty(levelData, i);

            // 4. 파일 저장
            string fileName = $"Level_{i:D3}.asset"; // Level_001.asset 형식
            string fullPath = $"{savePath}/{fileName}";

            // 이미 존재하는 파일이면 덮어쓰기 위해 고유 경로 생성
            fullPath = AssetDatabase.GenerateUniqueAssetPath(fullPath);
            
            AssetDatabase.CreateAsset(levelData, fullPath);
        }

        // 5. 저장 및 새로고침
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
        
        Debug.Log($"Success! {levelCount} levels generated at {savePath}");
    }

    // 레벨 번호에 따른 난이도 및 색상 로직
    private void SetLevelDifficulty(LevelData data, int levelNum)
    {
        data.levelIndex = levelNum;

        // 1. 그리드 크기 설정 (기존과 동일)
        if (levelNum <= 10) data.gridSize = new Vector2Int(3, 3);
        else if (levelNum <= 30) data.gridSize = new Vector2Int(4, 4);
        else if (levelNum <= 60) data.gridSize = new Vector2Int(5, 5);
        else data.gridSize = new Vector2Int(6, 7);

        // 2. 색상 생성 로직 개선 (HSV 기반 상대적 변환)
        
        // (A) 기준이 되는 메인 색상(Hue)을 하나 뽑습니다. (0.0 ~ 1.0)
        float baseHue = Random.Range(0f, 1f);
        
        // (B) 난이도에 따라 색상 범위(Range)를 결정합니다.
        // 초반: 아주 비슷한 색 (유사색) -> 범위 0.1 ~ 0.2
        // 후반: 보색에 가까운 색 -> 범위 0.3 ~ 0.5
        float range = (levelNum < 20) ? 0.15f : 0.4f;

        // (C) 4개의 코너 색상을 기준 색상에서 'range'만큼만 비틀어서 생성합니다.
        // 명도(V)와 채도(S)는 높게 고정하여 '칙칙한 색'을 방지합니다.
        
        data.colorTL = Color.HSVToRGB(baseHue, 0.7f, 0.9f); 
        
        // 우상단: Hue를 살짝 더함
        data.colorTR = Color.HSVToRGB((baseHue + range * 0.3f) % 1f, 0.7f, 0.9f); 
        
        // 좌하단: Hue를 살짝 뺌 + 명도를 조금 어둡게(입체감)
        data.colorBL = Color.HSVToRGB((baseHue - range * 0.3f + 1f) % 1f, 0.8f, 0.8f); 
        
        // 우하단: 대각선 방향으로 가장 많이 변화
        data.colorBR = Color.HSVToRGB((baseHue + range) % 1f, 0.8f, 0.7f);
    }
}