export type EquipmentSlot =
  | 'weapon'
  | 'helmet'
  | 'shoulders'
  | 'chest'
  | 'belt'
  | 'gloves'
  | 'boots'
  | 'ring'
  | 'necklace'
  | 'bracelet'
  | 'artifact';

export type InventoryItem = {
  id: string;
  name: string;
  category: 'weapon' | 'armor' | 'accessory' | 'consumable' | 'material';
  rarity: 'common' | 'rare' | 'epic';
  icon: string;
  description: string;
  attack?: number;
  defense?: number;
  critRate?: number;
  spellPower?: number;
  maxMpBonus?: number;
  manaAbsorbChance?: number;
  heal?: number;
  mpRestore?: number;
  healOverTimeTotal?: number;
  healOverTimeTicks?: number;
  healOverTimeIntervalMs?: number;
  autoHealMultiplier?: number;
  moveSpeedMultiplier?: number;
  effectDurationMs?: number;
  quantity?: number;
  slot?: EquipmentSlot;
};

export type SkillDefinition = {
  id: string;
  name: string;
  description: string;
  manaCost: number;
  cooldownMs: number;
  damage: number;
  range: number;
  castTimeMs: number;
  accentLabel: string;
  color: string;
  icon: string;
  role: 'attack' | 'buff' | 'summon';
  durationMs?: number;
};

export type QuestDefinition = {
  id: string;
  title: string;
  description: string;
  progressType: 'kill' | 'collect';
  target: string;
  requiredCount: number;
  turnInNpcId: string;
  turnInItemId?: string;
  rewardGold: number;
  rewardExp: number;
  rewardItemId?: string;
};

export type NpcDefinition = {
  id: string;
  name: string;
  role: 'quest' | 'shop' | 'guide';
  description: string;
  x: number;
  y: number;
};

export type EnemyDefinition = {
  id: string;
  name: string;
  role: 'normal' | 'boss';
  level: number;
  maxHp: number;
  maxMp: number;
  attack: number;
  expReward: number;
  goldReward: number;
  lootTable: Array<{
    itemId: string;
    chance: number;
    minQuantity?: number;
    maxQuantity?: number;
  }>;
  x: number;
  y: number;
  patrolRadius: number;
  tint: number;
};

export const THE_QUEST_WORLD_SIZE = {
  width: 2200,
  height: 1600,
} as const;

export const THE_QUEST_STAGE_PORTAL = {
  x: 1870,
  y: 258,
  radius: 118,
} as const;

export const THE_QUEST_SKILLS: SkillDefinition[] = [
  {
    id: 'energy-bolt',
    name: '에너지 볼트',
    description: '짧은 쿨다운으로 마력 탄환을 날려 기본 견제를 이어 갑니다.',
    manaCost: 0,
    cooldownMs: 640,
    damage: 16,
    range: 214,
    castTimeMs: 0,
    accentLabel: '기본기',
    color: '#9ecfff',
    icon: '✦',
    role: 'attack',
  },
  {
    id: 'fire-arrow',
    name: '파이어 애로우',
    description: '시전이 빠른 화염 탄환으로 체력을 깎아 두기 좋은 견제 마법입니다.',
    manaCost: 10,
    cooldownMs: 2100,
    damage: 34,
    range: 224,
    castTimeMs: 120,
    accentLabel: '화염',
    color: '#ffb06f',
    icon: '➶',
    role: 'attack',
  },
  {
    id: 'ice-dagger',
    name: '아이스 대거',
    description: '날카로운 냉기 단검을 날려 강한 단일 피해를 줍니다.',
    manaCost: 16,
    cooldownMs: 3200,
    damage: 52,
    range: 238,
    castTimeMs: 180,
    accentLabel: '빙결',
    color: '#8fe7ff',
    icon: '❄',
    role: 'attack',
  },
  {
    id: 'lightning',
    name: '라이트닝',
    description: '가까운 적을 기준으로 번개를 연쇄시켜 다수를 태웁니다.',
    manaCost: 24,
    cooldownMs: 5200,
    damage: 46,
    range: 244,
    castTimeMs: 220,
    accentLabel: '연쇄',
    color: '#ffd36f',
    icon: '⚡',
    role: 'attack',
  },
  {
    id: 'fireball',
    name: '파이어볼',
    description: '폭발하는 화염구를 떨어뜨려 반경 적을 한 번에 태웁니다.',
    manaCost: 30,
    cooldownMs: 7600,
    damage: 68,
    range: 182,
    castTimeMs: 280,
    accentLabel: '광역',
    color: '#ff9a6a',
    icon: '☄',
    role: 'attack',
  },
  {
    id: 'greater-haste',
    name: '그레이터 헤이스트',
    description: '이동과 시전 리듬을 끌어올려 위험한 구간을 빠르게 돌파합니다.',
    manaCost: 22,
    cooldownMs: 11800,
    damage: 0,
    range: 0,
    castTimeMs: 120,
    accentLabel: '가속',
    color: '#d4c0ff',
    icon: '⟡',
    role: 'buff',
    durationMs: 10000,
  },
  {
    id: 'magic-shield',
    name: '매직 실드',
    description: '마력 보호막으로 받는 피해를 줄이며 난전을 버팁니다.',
    manaCost: 26,
    cooldownMs: 12600,
    damage: 0,
    range: 0,
    castTimeMs: 120,
    accentLabel: '보호',
    color: '#7fcfff',
    icon: '⬡',
    role: 'buff',
    durationMs: 9200,
  },
  {
    id: 'summon-skeleton',
    name: '서먼 스켈레톤',
    description: '언데드 하수인을 불러 주변 적을 압박하고 마나 순환을 돕습니다.',
    manaCost: 34,
    cooldownMs: 15000,
    damage: 30,
    range: 168,
    castTimeMs: 180,
    accentLabel: '소환',
    color: '#d8f0ff',
    icon: '☠',
    role: 'summon',
    durationMs: 15000,
  },
];

export const THE_QUEST_ITEMS: InventoryItem[] = [
  {
    id: 'apprentice-staff',
    name: '수습 마도 지팡이',
    category: 'weapon',
    rarity: 'rare',
    icon: '🪄',
    description: '기본 주문 위력을 끌어올리고 낮은 확률로 적 MP를 흡수합니다.',
    attack: 8,
    spellPower: 12,
    maxMpBonus: 16,
    manaAbsorbChance: 0.16,
    slot: 'weapon',
  },
  {
    id: 'scribe-hood',
    name: '스크라이브 후드',
    category: 'armor',
    rarity: 'common',
    icon: '🪖',
    description: '집중을 돕는 천 후드. 치명과 MP를 살짝 높입니다.',
    defense: 4,
    critRate: 0.02,
    maxMpBonus: 10,
    slot: 'helmet',
  },
  {
    id: 'astral-mantle',
    name: '아스트랄 맨틀',
    category: 'armor',
    rarity: 'rare',
    icon: '🧥',
    description: '별가루를 엮은 로브. 주문 저항과 MP 풀을 함께 보강합니다.',
    defense: 8,
    maxMpBonus: 18,
    slot: 'chest',
  },
  {
    id: 'moon-spaulders',
    name: '문 스폴더',
    category: 'armor',
    rarity: 'rare',
    icon: '🪽',
    description: '달빛 견갑. 치명 감각과 주문 회전을 보조합니다.',
    defense: 4,
    critRate: 0.03,
    spellPower: 4,
    slot: 'shoulders',
  },
  {
    id: 'rune-gloves',
    name: '룬 글러브',
    category: 'armor',
    rarity: 'common',
    icon: '🧤',
    description: '시전 안정화를 돕는 장갑. 주문 위력이 조금 오릅니다.',
    spellPower: 6,
    slot: 'gloves',
  },
  {
    id: 'mist-belt',
    name: '미스트 벨트',
    category: 'armor',
    rarity: 'common',
    icon: '🧷',
    description: '마력 응축 벨트. 방어와 MP를 함께 보정합니다.',
    defense: 3,
    maxMpBonus: 12,
    slot: 'belt',
  },
  {
    id: 'trail-boots',
    name: '트레일 부츠',
    category: 'armor',
    rarity: 'common',
    icon: '🥾',
    description: '이동용 부츠. 기본 방어를 보강합니다.',
    defense: 3,
    slot: 'boots',
  },
  {
    id: 'moon-ring',
    name: '문링',
    category: 'accessory',
    rarity: 'epic',
    icon: '💍',
    description: '달의 조율 반지. 치명과 주문 위력을 크게 높입니다.',
    critRate: 0.08,
    spellPower: 8,
    slot: 'ring',
  },
  {
    id: 'ember-bracelet',
    name: '엠버 브레이슬릿',
    category: 'accessory',
    rarity: 'rare',
    icon: '📿',
    description: '주문 가속 팔찌. MP와 주문 위력을 함께 높입니다.',
    spellPower: 5,
    maxMpBonus: 14,
    slot: 'bracelet',
  },
  {
    id: 'forest-relic',
    name: '포레스트 렐릭',
    category: 'accessory',
    rarity: 'epic',
    icon: '🜂',
    description: '숲의 비전이 담긴 유물. 전반적인 마도사 성능을 끌어올립니다.',
    attack: 4,
    defense: 4,
    spellPower: 6,
    critRate: 0.04,
    slot: 'artifact',
  },
  {
    id: 'moonbranch-staff',
    name: '문브랜치 스태프',
    category: 'weapon',
    rarity: 'rare',
    icon: '🪄',
    description: '달가지 지팡이. 주문 위력과 마나 흡수 확률이 더 높습니다.',
    attack: 10,
    spellPower: 16,
    maxMpBonus: 20,
    manaAbsorbChance: 0.22,
    slot: 'weapon',
  },
  {
    id: 'slimecore-cane',
    name: '슬라임코어 케인',
    category: 'weapon',
    rarity: 'epic',
    icon: '🔮',
    description: '슬라임 코어를 박아 넣은 지팡이. 주문 위력과 흡수량이 크게 오릅니다.',
    attack: 12,
    spellPower: 20,
    maxMpBonus: 28,
    manaAbsorbChance: 0.28,
    slot: 'weapon',
  },
  {
    id: 'moss-guard',
    name: '모스 가드',
    category: 'armor',
    rarity: 'rare',
    icon: '🥋',
    description: '이끼 섬유를 엮은 외투. 생존력과 MP를 함께 올립니다.',
    defense: 12,
    maxMpBonus: 16,
    slot: 'chest',
  },
  {
    id: 'owl-visor',
    name: '아울 바이저',
    category: 'armor',
    rarity: 'rare',
    icon: '⛑',
    description: '시야 보정 바이저. 방어와 치명을 함께 올립니다.',
    defense: 6,
    critRate: 0.03,
    slot: 'helmet',
  },
  {
    id: 'river-striders',
    name: '리버 스트라이더',
    category: 'armor',
    rarity: 'rare',
    icon: '👢',
    description: '습지 돌파 장화. 안정적인 하체 방어를 제공합니다.',
    defense: 5,
    slot: 'boots',
  },
  {
    id: 'river-charm',
    name: '리버 참',
    category: 'accessory',
    rarity: 'epic',
    icon: '🪬',
    description: '강의 기운이 담긴 부적. MP와 치명타 확률을 높입니다.',
    critRate: 0.1,
    maxMpBonus: 24,
    slot: 'necklace',
  },
  {
    id: 'sun-band',
    name: '선 밴드',
    category: 'accessory',
    rarity: 'rare',
    icon: '💠',
    description: '햇빛 결정 보조 반지. 주문 위력이 추가로 오릅니다.',
    spellPower: 7,
    slot: 'ring',
  },
  {
    id: 'mist-pendant',
    name: '미스트 펜던트',
    category: 'accessory',
    rarity: 'epic',
    icon: '📿',
    description: '안개 정수 목걸이. 방어와 MP를 동시에 보강합니다.',
    defense: 4,
    maxMpBonus: 26,
    critRate: 0.05,
    slot: 'necklace',
  },
  {
    id: 'hp-potion',
    name: '체력 포션',
    category: 'consumable',
    rarity: 'common',
    icon: '🧪',
    description: '체력을 순차적으로 180 회복합니다.',
    healOverTimeTotal: 180,
    healOverTimeTicks: 6,
    healOverTimeIntervalMs: 900,
    quantity: 5,
  },
  {
    id: 'auto-heal-elixir',
    name: '특수 회복 엘릭서',
    category: 'consumable',
    rarity: 'rare',
    icon: '✨',
    description: '18초 동안 자동 회복량을 2.5배로 끌어올립니다.',
    autoHealMultiplier: 2.5,
    effectDurationMs: 18000,
    quantity: 2,
  },
  {
    id: 'celerity-potion',
    name: '가속 물약',
    category: 'consumable',
    rarity: 'rare',
    icon: '⚡',
    description: '14초 동안 모든 이동 속도를 2배로 가속합니다.',
    moveSpeedMultiplier: 2,
    effectDurationMs: 14000,
    quantity: 2,
  },
  {
    id: 'slime-gel',
    name: '슬라임 젤',
    category: 'material',
    rarity: 'common',
    icon: '🫧',
    description: '연금술 재료. 퀘스트와 촉매 제작에 사용됩니다.',
    quantity: 0,
  },
];

export const THE_QUEST_QUESTS: QuestDefinition[] = [
  {
    id: 'slime-hunt',
    title: '[메인] 푸른 숲의 정화',
    description: '포탈 근처 슬라임 8마리를 정리한 뒤 기사단장 브롬에게 보고하세요.',
    progressType: 'kill',
    target: 'slime',
    requiredCount: 8,
    turnInNpcId: 'brom',
    rewardGold: 120,
    rewardExp: 90,
    rewardItemId: 'hp-potion',
  },
  {
    id: 'slime-gel',
    title: '[서브] 연금 재료 수집',
    description: '슬라임 젤 12개를 모은 뒤 상인 미라에게 직접 전달하세요.',
    progressType: 'collect',
    target: 'slime-gel',
    requiredCount: 12,
    turnInNpcId: 'mira',
    turnInItemId: 'slime-gel',
    rewardGold: 160,
    rewardExp: 120,
    rewardItemId: 'celerity-potion',
  },
];

export const THE_QUEST_NPCS: NpcDefinition[] = [
  {
    id: 'lyra',
    name: '리라',
    role: 'guide',
    description: '초반 진행과 조작을 안내하는 길드 안내원.',
    x: 1080,
    y: 730,
  },
  {
    id: 'brom',
    name: '브롬',
    role: 'quest',
    description: '사냥 퀘스트를 제공하는 기사단장.',
    x: 1470,
    y: 960,
  },
  {
    id: 'mira',
    name: '미라',
    role: 'shop',
    description: '포션과 장비 재료를 취급하는 상인.',
    x: 880,
    y: 1160,
  },
];

export function createInitialEnemies(): EnemyDefinition[] {
  return [
    {
      id: 'slime-1',
      name: '슬라임',
      role: 'normal',
      level: 10,
      maxHp: 250,
      maxMp: 26,
      attack: 18,
      expReward: 28,
      goldReward: 16,
      lootTable: [
        { itemId: 'slime-gel', chance: 1, minQuantity: 1, maxQuantity: 2 },
        { itemId: 'hp-potion', chance: 0.24, minQuantity: 1, maxQuantity: 1 },
        { itemId: 'moonbranch-staff', chance: 0.08, minQuantity: 1, maxQuantity: 1 },
      ],
      x: 1260,
      y: 760,
      patrolRadius: 72,
      tint: 0x6fd0ff,
    },
    {
      id: 'slime-2',
      name: '슬라임',
      role: 'normal',
      level: 10,
      maxHp: 250,
      maxMp: 24,
      attack: 18,
      expReward: 28,
      goldReward: 16,
      lootTable: [
        { itemId: 'slime-gel', chance: 1, minQuantity: 1, maxQuantity: 2 },
        { itemId: 'celerity-potion', chance: 0.18, minQuantity: 1, maxQuantity: 1 },
        { itemId: 'moss-guard', chance: 0.08, minQuantity: 1, maxQuantity: 1 },
      ],
      x: 1410,
      y: 900,
      patrolRadius: 84,
      tint: 0x7be08f,
    },
    {
      id: 'slime-3',
      name: '엘더 슬라임',
      role: 'normal',
      level: 11,
      maxHp: 310,
      maxMp: 42,
      attack: 20,
      expReward: 32,
      goldReward: 18,
      lootTable: [
        { itemId: 'slime-gel', chance: 1, minQuantity: 2, maxQuantity: 3 },
        { itemId: 'hp-potion', chance: 0.3, minQuantity: 1, maxQuantity: 1 },
        { itemId: 'moonbranch-staff', chance: 0.12, minQuantity: 1, maxQuantity: 1 },
      ],
      x: 1540,
      y: 840,
      patrolRadius: 80,
      tint: 0x86d0ff,
    },
    {
      id: 'slime-4',
      name: '문글림 슬라임',
      role: 'normal',
      level: 11,
      maxHp: 320,
      maxMp: 56,
      attack: 21,
      expReward: 32,
      goldReward: 18,
      lootTable: [
        { itemId: 'slime-gel', chance: 1, minQuantity: 2, maxQuantity: 3 },
        { itemId: 'auto-heal-elixir', chance: 0.24, minQuantity: 1, maxQuantity: 1 },
        { itemId: 'river-charm', chance: 0.1, minQuantity: 1, maxQuantity: 1 },
      ],
      x: 1360,
      y: 1060,
      patrolRadius: 78,
      tint: 0x7ce8ff,
    },
    {
      id: 'slime-5',
      name: '가디언 슬라임',
      role: 'normal',
      level: 12,
      maxHp: 390,
      maxMp: 64,
      attack: 24,
      expReward: 40,
      goldReward: 20,
      lootTable: [
        { itemId: 'slime-gel', chance: 1, minQuantity: 2, maxQuantity: 4 },
        { itemId: 'hp-potion', chance: 0.3, minQuantity: 1, maxQuantity: 2 },
        { itemId: 'slimecore-cane', chance: 0.18, minQuantity: 1, maxQuantity: 1 },
        { itemId: 'moss-guard', chance: 0.14, minQuantity: 1, maxQuantity: 1 },
      ],
      x: 1670,
      y: 970,
      patrolRadius: 90,
      tint: 0x65d6ff,
    },
    {
      id: 'slime-6',
      name: '에메랄드 슬라임',
      role: 'normal',
      level: 12,
      maxHp: 380,
      maxMp: 52,
      attack: 23,
      expReward: 40,
      goldReward: 20,
      lootTable: [
        { itemId: 'slime-gel', chance: 1, minQuantity: 2, maxQuantity: 4 },
        { itemId: 'celerity-potion', chance: 0.3, minQuantity: 1, maxQuantity: 1 },
        { itemId: 'moonbranch-staff', chance: 0.12, minQuantity: 1, maxQuantity: 1 },
        { itemId: 'river-charm', chance: 0.14, minQuantity: 1, maxQuantity: 1 },
      ],
      x: 1210,
      y: 1180,
      patrolRadius: 96,
      tint: 0x80f0b0,
    },
    {
      id: 'stage-boss',
      name: '포탈 수호자 크라운 슬라임',
      role: 'boss',
      level: 14,
      maxHp: 920,
      maxMp: 180,
      attack: 38,
      expReward: 120,
      goldReward: 88,
      lootTable: [
        { itemId: 'slime-gel', chance: 1, minQuantity: 4, maxQuantity: 6 },
        { itemId: 'hp-potion', chance: 0.75, minQuantity: 2, maxQuantity: 3 },
        { itemId: 'auto-heal-elixir', chance: 0.54, minQuantity: 1, maxQuantity: 2 },
        { itemId: 'celerity-potion', chance: 0.58, minQuantity: 1, maxQuantity: 2 },
        { itemId: 'mist-pendant', chance: 0.24, minQuantity: 1, maxQuantity: 1 },
        { itemId: 'slimecore-cane', chance: 0.28, minQuantity: 1, maxQuantity: 1 },
      ],
      x: 1820,
      y: 360,
      patrolRadius: 64,
      tint: 0xffb86a,
    },
  ];
}
