import { ChatInputCommandInteraction } from "discord.js";
import { Config } from "@systems/config";
import { resolveUser, hasOfficerRole } from "@systems/users";
import { submitScore, detectSlot, normalizeSlot } from "@systems/scores";
import { getEffectiveCharacter } from "@systems/borrow";
import { replyAndDelete } from "@utils";
import { getEmoji } from "@systems/emojis";

export async function handleScoreSet(interaction: ChatInputCommandInteraction): Promise<void> {
  const member    = await interaction.guild!.members.fetch(interaction.user.id);
  const isOfficer = hasOfficerRole(member, Config.get({ section: "roles", key: "officer" }));
  const nameArg   = interaction.options.getString("name");
  const ptsArg    = interaction.options.getInteger("pts", true);
  const slotArg   = interaction.options.getString("slot");
  const kills     = interaction.options.getInteger("k") ?? undefined;
  const deaths    = interaction.options.getInteger("d") ?? undefined;
  const k         = interaction.options.getInteger("k") ?? undefined;
  const d         = interaction.options.getInteger("d") ?? undefined;
  const atk       = interaction.options.getInteger("atk") ?? undefined;
  const def       = interaction.options.getInteger("def") ?? undefined;
  const heal      = interaction.options.getInteger("heal") ?? undefined;

  let userKey: string | null;
  if (nameArg) {
    if (!isOfficer) return void replyAndDelete(interaction, "❌ Only officers can submit scores for other players.");
    userKey = nameArg;
  } else {
    const user = await resolveUser(member);
    userKey = user.userKey;
  }

  if (!userKey) return void replyAndDelete(interaction, "❌ You are not registered in the system.");

  const { char, borrowedFrom } = getEffectiveCharacter(userKey);
  if (!char) return void replyAndDelete(interaction, "❌ No active character found. Use `/tg char set-active` first.");

  let slot: number | null = null;
  if (slotArg) {
    slot = normalizeSlot(slotArg);
    if (slot === null) return void replyAndDelete(interaction, `❌ Could not parse slot "${slotArg}".`);
  } else {
    slot = detectSlot() ?? Config.get({ section: "poll", key: "slots" }).find((s) => s.active)?.tgHour ?? 20;
  }

  await submitScore({
    userKey:         borrowedFrom ?? userKey,
    playedBy:           borrowedFrom ? userKey : undefined,
    characterName:      char.name,
    cls:                char.class,
    nation:             char.nation,
    pts:                ptsArg,
    k,
    d,
    slot,
    atk,
    def,
    heal,
    submittedByOfficer: isOfficer && !!nameArg,
  });

  const scoreEmoji = getEmoji("score") || "📊";
  const kdEmoji    = getEmoji("kd")    || "⚔️";
  const borrowNote = borrowedFrom ? ` *(borrowed from ${borrowedFrom})*` : "";
  const kdNote     = kills !== undefined && deaths !== undefined ? `\n${kdEmoji} ${kills}/${deaths}` : "";
  const statsNote  = [
    atk  !== undefined ? `ATK: ${atk}`   : null,
    def  !== undefined ? `DEF: ${def}`   : null,
    heal !== undefined ? `HEAL: ${heal}` : null,
  ].filter(Boolean).join(" · ");

  return void replyAndDelete(interaction,
    `✅ ${scoreEmoji} **${ptsArg}** submitted for **${char.name}**${borrowNote} (${slot}:00 TG)${kdNote}${statsNote ? `\n${statsNote}` : ""}`,
    true
  );
}