import type { Artist } from "@/types/artist";
import { ARTIST_SEEDS } from "./artist-bios";
import { tosUrl } from "./tos";

/**
 * 真实艺人数据装配层。
 * 所有人物字段（姓名 / 性别 / 年龄 / 身高 / 性格 / 技能 / 赛道 / 口头禅 /
 * 座右铭 / 长简介）来自《36 位虚拟艺人人物小传.docx》。
 * 立绘 / 三视图 / 氛围图 / solo 视频 走火山 TOS 桶（webp + mp4 已压缩到 1/10）。
 *
 * 票数 / 排名是运行时计算（store 投票后会更新）。除此之外不再有任何虚构数据。
 */

/** 没有 solo.mp4 的艺人编号(docx 标注"缺视频")。
    003/010/017/027 在 v2 物料里已补上,033 已替换,这些都从集合里移除。 */
const MISSING_VIDEO: ReadonlySet<string> = new Set<string>();

/**
 * 自定义封面:这些艺人的卡片/详情主立绘改用单独上传的 cover 图,
 * 而不是默认的氛围图1。氛围图1/2/3 在画廊里保持不变。
 * (调整.xlsx 里 "封面图用氛围图N" 的实现 —— 新封面已转 webp 上传到
 *  portraits/{no}-cover.webp,这里把 portrait 字段切到该路径。)
 */
const CUSTOM_COVERS: ReadonlySet<string> = new Set([
  "002",
  "003",
  "005",
  "012",
  "013",
  "014",
  "019",
  "025",
]);

/** 画廊 = 三张氛围图（1/2/3）。不包含三视图，因为长宽比与卡片不一致。 */
function buildGallery(no: string): string[] {
  return [
    tosUrl(`portraits/${no}.webp`),
    tosUrl(`portraits/${no}-2.webp`),
    tosUrl(`portraits/${no}-3.webp`),
  ];
}

function buildArtists(): Artist[] {
  return ARTIST_SEEDS.map((seed, idx) => {
    return {
      id: seed.no,
      no: seed.no,
      name: seed.name,
      enName: seed.enName,
      age: seed.age,
      gender: seed.gender,
      bio: seed.bio,
      portrait: tosUrl(
        CUSTOM_COVERS.has(seed.no)
          ? `portraits/${seed.no}-cover.webp`
          : `portraits/${seed.no}.webp`,
      ),
      avatar: "",
      gallery: buildGallery(seed.no),
      videoUrl: MISSING_VIDEO.has(seed.no)
        ? undefined
        : tosUrl(`videos/artists/${seed.no}.mp4`),
      // 不设置 poster，由播放器运行时 seek 到 0.001s 渲染首帧作为封面
      videoPoster: "",
      tags: seed.tags,
      height: seed.height,
      // 初始全部 0 票，等用户投票产生真实排名；rank 按 no 顺序兜底
      votes: 0,
      rank: idx + 1,
      motto: seed.motto,
      personality: seed.personality,
      catchphrase: seed.catchphrase,
      skills: seed.skills,
      track: seed.track,
    };
  });
}

export const ARTISTS: Artist[] = buildArtists();

/** 排序方式 · "votes" = 实时排名(票数倒序),"no" = 编号顺序 */
export type SortKey = "votes" | "no";

/** 票数相同时按编号升序兜底，保证排序稳定 */
export function sortArtists(list: Artist[], key: SortKey = "votes"): Artist[] {
  const sorted = [...list];
  if (key === "votes") {
    sorted.sort((a, b) => b.votes - a.votes || a.no.localeCompare(b.no));
  } else {
    sorted.sort((a, b) => a.no.localeCompare(b.no));
  }
  return sorted;
}

/** 按 ID 获取艺人 */
export function getArtist(id: string): Artist | undefined {
  return ARTISTS.find((a) => a.id === id);
}

/** 活动结束时间（mock：当前日期 + 12 天） */
export function getActivityEndTime(): Date {
  const end = new Date();
  end.setDate(end.getDate() + 12);
  end.setHours(end.getHours() + 3);
  end.setMinutes(end.getMinutes() + 24);
  end.setSeconds(end.getSeconds() + 18);
  return end;
}
