import 'package:asciineverdie/src/core/util/balance_constants.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  group('MonsterBaseStats ATK 완화 공식', () {
    test('ATK 레벨별 차등 공식 검증', () {
      // 레벨 1~5: 2 + level * 3 (초반 난이도 완화)
      expect(MonsterBaseStats.forLevel(1).atk, 5); // 2 + 3
      expect(MonsterBaseStats.forLevel(5).atk, 17); // 2 + 15
      // 레벨 6+: 3 + level * 4
      expect(MonsterBaseStats.forLevel(8).atk, 35); // 3 + 32
      expect(MonsterBaseStats.forLevel(10).atk, 43); // 3 + 40
      expect(MonsterBaseStats.forLevel(20).atk, 83); // 3 + 80
      expect(MonsterBaseStats.forLevel(100).atk, 403); // 3 + 400
    });

    test('레벨 8 몬스터가 플레이어에게 적절한 데미지', () {
      // 레벨 8 몬스터: ATK 35
      // 플레이어 DEF ~40 가정 (중간 수준 장비)
      // 최대 데미지: 35 * 1.2 - 40 * 0.5 = 42 - 20 = 22
      final level8Atk = MonsterBaseStats.forLevel(8).atk;
      final maxDamage = (level8Atk * 1.2 - 40 * 0.5).round();
      // 플레이어 HP ~150 기준 6~7회 생존
      expect(maxDamage, lessThan(50));
      expect(maxDamage, greaterThan(10));
    });

    test('레벨 1 몬스터 데미지가 플레이어 1히트킬 방지', () {
      final level1Atk = MonsterBaseStats.forLevel(1).atk;
      // ATK 5에서 DEF 10 기준 최대 데미지 = 5 * 1.2 - 10 * 0.5 = 1
      final maxDamage = (level1Atk * 1.2 - 10 * 0.5).round();
      expect(maxDamage, lessThanOrEqualTo(10));
    });

    test('ATK 곡선이 단조 증가', () {
      int prevAtk = 0;
      for (var level = 1; level <= 50; level++) {
        final atk = MonsterBaseStats.forLevel(level).atk;
        expect(
          atk,
          greaterThan(prevAtk),
          reason: 'Level $level ATK should be > level ${level - 1}',
        );
        prevAtk = atk;
      }
    });

    test('기존 공식 대비 ATK 감소 확인', () {
      // 기존: 10 + level * 12
      // 신규 (레벨 1~5): 2 + level * 3 (초반 난이도 완화)
      // 신규 (레벨 6+): 3 + level * 4

      // 레벨 6 이상은 약 33% 수준 (기존 대비 67% 감소)
      for (var level in [10, 20]) {
        final oldAtk = 10 + level * 12;
        final newAtk = MonsterBaseStats.forLevel(level).atk;
        final ratio = newAtk / oldAtk;
        expect(
          ratio,
          lessThan(0.45),
          reason: 'Level $level should be < 45% of old',
        );
        expect(
          ratio,
          greaterThan(0.25),
          reason: 'Level $level should be > 25% of old',
        );
      }

      // 레벨 1~5는 추가 완화 (기존 대비 더 낮음)
      for (var level in [1, 5]) {
        final oldAtk = 10 + level * 12;
        final newAtk = MonsterBaseStats.forLevel(level).atk;
        final ratio = newAtk / oldAtk;
        expect(
          ratio,
          lessThan(0.35),
          reason: 'Early level $level should be < 35% of old',
        );
        expect(
          ratio,
          greaterThan(0.15),
          reason: 'Early level $level should be > 15% of old',
        );
      }
    });
  });

  group('PlayerScaling HP 스케일링', () {
    test('hpPerLevel = 18, hpPerCon = 10 검증', () {
      expect(PlayerScaling.hpPerLevel, 18);
      expect(PlayerScaling.hpPerCon, 10);
    });

    test('레벨업당 HP 증가 검증', () {
      // baseHp=10, level=10, conBonus=5
      final result = PlayerScaling.calculateResources(
        level: 10,
        baseHp: 10,
        baseMp: 20,
        conBonus: 5,
        intBonus: 5,
      );
      // HP = 10 + (10-1)*18 + 5*10 = 10 + 162 + 50 = 222
      expect(result.hpMax, 222);
    });
  });
}
