import { 
  SlashCommandBuilder, 
  ChatInputCommandInteraction, 
  EmbedBuilder,
  Colors,
  ButtonBuilder,
  ButtonStyle,
  ActionRowBuilder,
  ComponentType
} from 'discord.js';
import { prisma } from '../database';
import { SupportedLocale } from '../i18n';
import { RefinementService } from '../services/RefinementService';
import { FeverService } from '../services/FeverService';

export default {
  data: new SlashCommandBuilder()
    .setName('refine')
    .setDescription('Mini-game: Refinement')
    .setDescriptionLocalizations({
      ko: '미니게임: 재련 (무기 강화 및 전투)',
    })
    // --- Try Subcommand ---
    .addSubcommand(subcommand =>
      subcommand
        .setName('try')
        .setDescription('Try to refine your weapon.')
        .setDescriptionLocalizations({ ko: '무기 재련을 시도합니다.' })
    )
    // --- Battle Subcommand ---
    .addSubcommand(subcommand =>
      subcommand
        .setName('battle')
        .setDescription('Battle with another user.')
        .setDescriptionLocalizations({ ko: '다른 유저와 전투를 수행합니다.' })
        .addUserOption(option =>
          option.setName('target')
            .setDescription('The user to attack')
            .setRequired(true)
        )
    )
    // --- Checkin Subcommand ---
    .addSubcommand(subcommand =>
      subcommand
        .setName('checkin')
        .setDescription('Daily check-in to get gold.')
        .setDescriptionLocalizations({ ko: '일일 출석 및 골드를 수령합니다.' })
    )
    // --- Profile Subcommand ---
    .addSubcommand(subcommand =>
      subcommand
        .setName('profile')
        .setDescription('View refinement profile.')
        .setDescriptionLocalizations({ ko: '재련 프로필을 확인합니다.' })
        .addUserOption(option =>
          option.setName('user')
            .setDescription('User to view')
        )
    )
    // --- Ranking Subcommand ---
    .addSubcommand(subcommand =>
      subcommand
        .setName('ranking')
        .setDescription('View server rankings.')
        .setDescriptionLocalizations({ ko: '서버 랭킹을 확인합니다.' })
        .addStringOption(option =>
          option.setName('type')
            .setDescription('Ranking type')
            .setRequired(true)
            .addChoices(
              { name: '최대 강화 단계', value: 'max_level' },
              { name: '승률', value: 'win_rate' },
            )
        )
    )
    // --- Sell Subcommand ---
    .addSubcommand(subcommand =>
      subcommand
        .setName('sell')
        .setDescription('Sell your weapon and reset to level 0.')
        .setDescriptionLocalizations({ ko: '무기를 판매하고 0단계로 회귀합니다.' })
    )
    // --- Help Subcommand ---
    .addSubcommand(subcommand =>
      subcommand
        .setName('help')
        .setDescription('Get help about the refinement game.')
        .setDescriptionLocalizations({ ko: '재련 게임 도움말을 확인합니다.' })
    ),

  async execute(interaction: ChatInputCommandInteraction, locale: SupportedLocale) {
    if (!interaction.guildId) return;

    // 1. 미니게임 활성화 및 전용 채널 체크
    const config = await prisma.miniGameConfig.findUnique({
      where: { guildId_gameKey: { guildId: interaction.guildId, gameKey: 'refinement' } }
    });

    if (!config || !config.enabled) {
      return interaction.editReply({ content: '❌ 이 서버에서는 재련 미니게임이 비활성화되어 있습니다.' });
    }

    if (config.channelId && config.channelId !== interaction.channelId) {
      return interaction.editReply({ content: `❌ 재련 미니게임은 <#${config.channelId}> 채널에서만 이용 가능합니다.` });
    }

    const subcommand = interaction.options.getSubcommand();

    // --- TRY ---
    if (subcommand === 'try') {
      try {
        const result = await RefinementService.tryRefine(interaction.user.id, interaction.guildId);
        const fever = await FeverService.getFeverBonus(interaction.guildId);

        const embed = new EmbedBuilder()
          .setTitle(result.success ? '✨ 재련 성공!' : (result.destroyed ? '🧨 무기 파괴!' : '❌ 재련 실패...'))
          .setColor(result.success ? Colors.Green : (result.destroyed ? Colors.Red : Colors.Grey))
          .addFields(
            { name: '강화 단계', value: `${result.levelBefore} → **${result.levelAfter}**`, inline: true },
            { name: '비용', value: `${result.cost} G`, inline: true },
            { name: '잔액', value: `${result.remainingGold} G`, inline: true }
          );

        if (fever.active) {
          embed.setFooter({ text: `🔥 피버 타임 활성화 중! (성공률 +${fever.bonusRate * 100}%)` });
        }

        const retryBtn = new ButtonBuilder()
          .setCustomId(`refine_try_again:${interaction.user.id}`)
          .setLabel('다시 시도')
          .setStyle(ButtonStyle.Primary);

        const row = new ActionRowBuilder<ButtonBuilder>().addComponents(retryBtn);

        return interaction.editReply({ embeds: [embed], components: [row] });
      } catch (err: any) {
        return interaction.editReply({ content: `❌ 오류: ${err.message}` });
      }
    }

    // --- BATTLE ---
    if (subcommand === 'battle') {
      const targetUser = interaction.options.getUser('target', true);
      if (targetUser.id === interaction.user.id) {
        return interaction.editReply({ content: '❌ 자신을 공격할 수 없습니다.' });
      }
      if (targetUser.bot) {
        return interaction.editReply({ content: '❌ 봇과 전투할 수 없습니다.' });
      }

      try {
        const result = await RefinementService.startBattle(interaction.user.id, targetUser.id, interaction.guildId);
        
        const embed = new EmbedBuilder()
          .setTitle('⚔️ 전투 결과')
          .setColor(result.winnerId === interaction.user.id ? Colors.Gold : Colors.Red)
          .setDescription(`<@${result.attackerId}> 님과 <@${result.targetId}> 님의 대결!`)
          .addFields(
            { name: '승자', value: `<@${result.winnerId}>`, inline: false },
            { name: '패자', value: `<@${result.loserId}>`, inline: false },
            { name: '보상', value: `${result.reward} G`, inline: true },
            { name: '내 단계', value: `${result.attackerLevel}강`, inline: true },
            { name: '상대 단계', value: `${result.targetLevel}강`, inline: true }
          );

        if (result.destroyed) {
          embed.addFields({ name: '🧨 무기 파괴', value: '공격자가 내구도 0인 상태에서 공격하여 무기가 완전히 파괴되었습니다!', inline: false });
        } else {
          embed.addFields({ name: '🛡️ 내구도', value: `나: ${result.attackerDurability} | 상대: ${result.targetDurability}`, inline: false });
          if (result.attackerDurability <= 0) embed.setFooter({ text: '⚠️ [경고] 무기가 전투 불능이 되었습니다. 내구도 0에서 다시 공격하면 파괴됩니다!' });
        }

        return interaction.editReply({ embeds: [embed] });
      } catch (err: any) {
        return interaction.editReply({ content: `❌ 오류: ${err.message}` });
      }
    }

    // --- CHECKIN ---
    if (subcommand === 'checkin') {
      try {
        const res = await RefinementService.checkIn(interaction.user.id, interaction.guildId);
        return interaction.editReply({ content: `✅ 출석 완료! **${res.goldAdded} G**를 수령했습니다. (총: ${res.totalGold} G)` });
      } catch (err: any) {
        return interaction.editReply({ content: `❌ 오류: ${err.message}` });
      }
    }

    // --- PROFILE ---
    if (subcommand === 'profile') {
      const targetUser = interaction.options.getUser('user') || interaction.user;
      const profile = await RefinementService.getProfile(targetUser.id, interaction.guildId);

      const maxDurability = RefinementService.getMaxDurability(profile.weaponLevel);
      const embed = new EmbedBuilder()
        .setTitle(`👤 ${targetUser.username} 님의 재련 프로필`)
        .setColor(Colors.Blue)
        .setThumbnail(targetUser.displayAvatarURL())
        .addFields(
          { name: '현재 무기', value: `${profile.weaponLevel} 단계`, inline: true },
          { name: '최대 무기', value: `${profile.maxWeaponLevel} 단계`, inline: true },
          { name: '소지 골드', value: `${profile.gold} G`, inline: true },
          { name: '내구도', value: `${profile.durability} / ${maxDurability}`, inline: true },
          { name: '전투 상태', value: profile.isDisabled ? '❌ 전투 불능' : '✅ 양호', inline: true },
          { name: '일일 공격', value: `${profile.dailyBattleCount} / 10`, inline: true },
          { name: '출석', value: profile.lastCheckIn ? profile.lastCheckIn.toLocaleDateString() : '미기록', inline: true },
          { name: '통계', value: `시도: ${profile.tryCount} | 성공: ${profile.successCount} | 실패: ${profile.failCount} | 파괴: ${profile.destroyCount}`, inline: false },
          { name: '전투', value: `승리: ${profile.battleWin} | 패배: ${profile.battleLoss}`, inline: false }
        );

      return interaction.editReply({ embeds: [embed] });
    }

    // --- RANKING ---
    if (subcommand === 'ranking') {
      const type = interaction.options.getString('type', true);
      const ranking = await prisma.refinementProfile.findMany({
        where: { guildId: interaction.guildId },
        orderBy: type === 'max_level' ? { maxWeaponLevel: 'desc' } : undefined,
        take: 10
      });

      let rankingList = ranking;
      if (type === 'win_rate') {
        rankingList = ranking
          .sort((a, b) => {
            const rateA = a.battleWin / (a.battleWin + a.battleLoss || 1);
            const rateB = b.battleWin / (b.battleWin + b.battleLoss || 1);
            return rateB - rateA;
          })
          .slice(0, 10);
      }

      const embed = new EmbedBuilder()
        .setTitle(type === 'max_level' ? '🏆 서버 최고 강화 랭킹' : '🏆 서버 최고 승률 랭킹')
        .setColor(Colors.Gold);

      const listStr = rankingList.map((p, i) => {
        const val = type === 'max_level' 
          ? `${p.maxWeaponLevel}단계` 
          : `${Math.round((p.battleWin / (p.battleWin + p.battleLoss || 1)) * 100)}% (${p.battleWin}승)`;
        return `${i + 1}. <@${p.userId}> - **${val}**`;
      }).join('\n') || '데이터가 없습니다.';

      embed.setDescription(listStr);
      return interaction.editReply({ embeds: [embed] });
    }

    // --- SELL ---
    if (subcommand === 'sell') {
      try {
        const res = await RefinementService.sellWeapon(interaction.user.id, interaction.guildId);
        return interaction.editReply({ content: `💰 **${res.level}단계** 무기를 판매하고 **${res.price} G**를 받았습니다. (총: ${res.gold} G)` });
      } catch (err: any) {
        return interaction.editReply({ content: `❌ 오류: ${err.message}` });
      }
    }

    // --- HELP ---
    if (subcommand === 'help') {
      const embed = new EmbedBuilder()
        .setTitle('🎮 재련 미니게임 도움말')
        .setColor(Colors.White)
        .setDescription('무기를 강화하고 다른 유저와 전투하며 강력한 전사가 되어보세요!')
        .addFields(
          { name: '🛠️ 재련 (/refine try)', value: '골드를 소모하여 강화합니다. 5강부터 확률이 극악이며, 성공 시 **내구도가 최대치(10+레벨)**로 수리됩니다.' },
          { name: '⚔️ 전투 (/refine battle)', value: '다른 유저를 공격합니다. **일일 10회 제한**이 있으며, 5강 이상 차이나는 강자 공격 시 승률이 급락(최대 0%)합니다.' },
          { name: '🛡️ 내구도 및 수명', value: '단계가 높을수록 최대 내구도가 증가하여 더 오래 사용할 수 있습니다. 내구도 0에서 공격 시 무기가 파괴됩니다.' },
          { name: '📅 출석 (/refine checkin)', value: '매일 한 번 골드를 수령할 수 있습니다.' },
          { name: '💰 판매 (/refine sell)', value: '무기를 팔고 0단계로 돌아갑니다. 고강화 무기는 난이도(기대값)에 비례해 **수억 골드**의 가치를 가집니다.' },
          { name: '🔥 피버 타임', value: '서버가 가장 활발한 시간대에 재련 성공 확률이 10% 증가합니다!' }
        );

      return interaction.editReply({ embeds: [embed] });
    }
  },
};
