using UnityEngine;

/*
사용법:
1. Project에서 Create → Skill/SkillData로 스킬 에셋 생성, 레벨별 수치 입력
2. Create → Skill/WeaponSkillSet로 무기별 스킬 묶음 생성
3. Create → Skill/DebuffData로 디버프 에셋 생성 (필요시)
4. 플레이어에 SkillModule + 필요한 Effect 컴포넌트들 부착
   (DamageEffect, AreaEffect, ZoneEffect, BuffEffect, ProjectileEffect)
5. 디버프 받는 대상에 StatusEffectReceiver + IDamageable 구현 부착
6. 무기 변경 시 LoadWeaponSkills(skillSet) 호출
7. 입력 시 SkillInput(slotIndex, inputState) 호출
8. Remote 스킬 범위 확인 시 AreaConfirmInput(inputState) 호출

ActivationType (발동 방식):
  Instant — 즉시 발동
  Charge  — 누르고 있으면 차징, 놓으면 발동
  Cast    — 시전 시간 후 자동 발동 (피격/회피 시 취소)
  Channel — 시전 동안 지속적으로 효과 반복 (피격/회피 시 취소)

CastMethod (발동 위치):
  Self   — 자기 중심 발동 (키 입력 즉시 ActivationType 흐름 시작)
  Remote — 원격 발동 (마우스로 위치 선택 → 확인 후 ActivationType 흐름 시작)

TargetType (효과 방식):
  Single     → DamageEffect
  Area       → AreaEffect
  Self       → BuffEffect
  Projectile → ProjectileEffect
  Zone       → ZoneEffect (설치형)

조합 예시:
  Instant + Self   → 즉시 자기 주변 발동
  Instant + Remote → 위치 선택 후 즉시 발동
  Cast + Remote    → 위치 선택 → 캐스팅 → 완료 시 해당 위치에 발동
  Channel + Remote → 위치 선택 → 해당 위치에서 채널링
  Charge + Remote  → 위치 선택 → 차징 → 릴리스 시 해당 위치에 발동
*/

[CreateAssetMenu(menuName = "Skill/SkillData")]
public class SkillData : ScriptableObject
{
    [Header("기본 정보")]
    public string SkillName;
    [TextArea] public string Description;
    public Sprite Icon;

    [Header("스킬 분류")]
    public SkillType SkillType;
    public ActivationType ActivationType;
    public CastMethod CastMethod;
    public TargetType TargetType;

    [Header("애니메이션")]
    public string AnimTrigger;

    [Header("이펙트")]
    public GameObject AttackEffectPrefab;
    public GameObject CastEffectPrefab;

    [Header("범위 지정 (Remote용)")]
    public GameObject AreaIndicatorPrefab;

    [Header("설치형 (Zone)")]
    public GameObject ZonePrefab;

    [Header("디버프")]
    public DebuffData[] AppliedDebuffs;

    [Header("레벨별 수치")]
    public SkillLevelData[] Levels;

    public SkillLevelData GetLevelData(int level)
    {
        int idx = Mathf.Clamp(level - 1, 0, Levels.Length - 1);
        return Levels[idx];
    }
}

[System.Serializable]
public class SkillLevelData
{
    public float Damage;
    public float Range;
    public float Cooldown;
    public float ManaCost;
    public float Duration;
    public float ChargeTimeMax;
    public float CastTime;
    public float ChannelDuration;
    public float TickInterval;
    public float TickDamage;
}

public enum SkillType { Active, Passive }
public enum ActivationType { Instant, Charge, Cast, Channel }
public enum CastMethod { Self, Remote }
public enum TargetType { Self, Single, Area, Projectile, Zone }
