import 'package:freezed_annotation/freezed_annotation.dart';

part 'item_stats.freezed.dart';
part 'item_stats.g.dart';

/// 아이템 희귀도
enum ItemRarity {
  common,
  uncommon,
  rare,
  epic,
  legendary;

  /// 희귀도 배율 (스탯 계산용)
  double get multiplier => switch (this) {
    common => 1.0,
    uncommon => 1.3,
    rare => 1.7,
    epic => 2.2,
    legendary => 3.0,
  };

  /// 가중치 보너스
  int get weightBonus => switch (this) {
    common => 0,
    uncommon => 50,
    rare => 150,
    epic => 400,
    legendary => 1000,
  };
}

/// 아이템 스탯 보정치
///
/// 장비 아이템이 제공하는 스탯 보너스.
/// 모든 값은 기본 0이며, 장착 시 플레이어 스탯에 가산됨.
@freezed
class ItemStats with _$ItemStats {
  const ItemStats._();

  const factory ItemStats({
    /// 물리 공격력 보정
    @Default(0) int atk,

    /// 물리 방어력 보정
    @Default(0) int def,

    /// 마법 공격력 보정
    @Default(0) int magAtk,

    /// 마법 방어력 보정
    @Default(0) int magDef,

    /// 크리티컬 확률 보정 (0.0 ~ 1.0)
    @Default(0.0) double criRate,

    /// 회피율 보정 (0.0 ~ 1.0)
    @Default(0.0) double evasion,

    /// 방패 방어율 (방패 전용, 0.0 ~ 1.0)
    @Default(0.0) double blockRate,

    /// 무기 쳐내기 확률 (무기 전용, 0.0 ~ 1.0)
    @Default(0.0) double parryRate,

    /// HP 보너스
    @Default(0) int hpBonus,

    /// MP 보너스
    @Default(0) int mpBonus,

    /// STR 보너스
    @Default(0) int strBonus,

    /// CON 보너스
    @Default(0) int conBonus,

    /// DEX 보너스
    @Default(0) int dexBonus,

    /// INT 보너스
    @Default(0) int intBonus,

    /// WIS 보너스
    @Default(0) int wisBonus,

    /// CHA 보너스
    @Default(0) int chaBonus,

    /// 무기 공격속도 (밀리초, 무기 전용)
    ///
    /// 0이면 기본값(1000ms) 사용, 값이 클수록 느린 공격.
    /// 느린 무기는 높은 기본 데미지를 가짐.
    @Default(0) int attackSpeed,
  }) = _ItemStats;

  factory ItemStats.fromJson(Map<String, dynamic> json) =>
      _$ItemStatsFromJson(json);

  /// 빈 스탯 (보너스 없음)
  static const empty = ItemStats();

  /// 스탯 합계 (가중치 계산용)
  int get totalStatValue {
    return atk +
        def +
        magAtk +
        magDef +
        (criRate * 100).round() +
        (evasion * 100).round() +
        (blockRate * 100).round() +
        (parryRate * 100).round() +
        hpBonus +
        mpBonus +
        strBonus * 5 +
        conBonus * 5 +
        dexBonus * 5 +
        intBonus * 5 +
        wisBonus * 5 +
        chaBonus * 5;
  }

  /// 두 스탯 합산
  ///
  /// attackSpeed는 합산 대상 아님 (무기 슬롯 단일 값)
  ItemStats operator +(ItemStats other) {
    return ItemStats(
      atk: atk + other.atk,
      def: def + other.def,
      magAtk: magAtk + other.magAtk,
      magDef: magDef + other.magDef,
      criRate: criRate + other.criRate,
      evasion: evasion + other.evasion,
      blockRate: blockRate + other.blockRate,
      parryRate: parryRate + other.parryRate,
      hpBonus: hpBonus + other.hpBonus,
      mpBonus: mpBonus + other.mpBonus,
      strBonus: strBonus + other.strBonus,
      conBonus: conBonus + other.conBonus,
      dexBonus: dexBonus + other.dexBonus,
      intBonus: intBonus + other.intBonus,
      wisBonus: wisBonus + other.wisBonus,
      chaBonus: chaBonus + other.chaBonus,
      // attackSpeed는 무기에서만 직접 참조
    );
  }
}
