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 { Emoji } from "@systems/emojis";
import { Discord } from "@discord";
import { User } from "@systems/users";

export async function handleScoreSet(interaction: ChatInputCommandInteraction): Promise<void> {
  const options   = Discord.Interaction.options<ChatInputCommandInteraction>(interaction);

  const member    = await interaction.guild!.members.fetch(interaction.user.id);
  const isOfficer = User.hasOfficerRole({ 
    member: member, 
    officerRoles: Config.get({ section: "roles", key: "officer" 
  })});
  const nameArg   = options.string({ key: "name" });
  const ptsArg    = options.integer({ key: "pts", required: true });
  const slotArg   = options.string({ key: "slot" });
  const k         = options.integer({ key: "k" }) ?? undefined;
  const d         = options.integer({ key: "d" }) ?? undefined;
  const atk       = options.integer({ key: "atk" }) ?? undefined;
  const def       = options.integer({ key: "def" }) ?? undefined;
  const heal      = options.integer({ key: "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.key,
    nation:             char.nation,
    pts:                ptsArg!,
    k,
    d,
    slot,
    atk,
    def,
    heal,
    submittedByOfficer: isOfficer && !!nameArg,
  });

  const scoreEmoji = Emoji.get("score") || "📊";
  const kdEmoji    = Emoji.get("kd")    || "⚔️";
  const borrowNote = borrowedFrom ? ` *(borrowed from ${borrowedFrom})*` : "";
  const kdNote     = k !== undefined && d !== undefined ? `\n${kdEmoji} ${k}/${d}` : "";
  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
  );
}