export type VoicevoxVoice = Readonly<{
  speakerName: string;
  styleName: string;
}>;

export type CharacterDefinition = Readonly<{
  displayName: string;
  voicevox: VoicevoxVoice;
  avatar: Readonly<{
    accentColor: string;
    imagePath: string;
  }>;
}>;

export const characters = {
  sayo: {
    displayName: "小夜",
    voicevox: {
      speakerName: "小夜/SAYO",
      styleName: "ノーマル",
    },
    avatar: {
      accentColor: "#6b5f83",
      imagePath: "image/sayo-standee-base.png",
    },
  },
} as const satisfies Record<string, CharacterDefinition>;

export type CharacterId = keyof typeof characters;

export type SpeechOptions = Readonly<{
  subtitle?: string;
  voicevox?: Partial<VoicevoxVoice>;
}>;

export type SpeechEvent = Readonly<{
  type: "say";
  id: string;
  character: CharacterId;
  text: string;
  subtitle?: string;
  voicevox?: Partial<VoicevoxVoice>;
}>;

export const say = (
  id: string,
  character: CharacterId,
  text: string,
  options: SpeechOptions = {}
): SpeechEvent => ({
  type: "say",
  id,
  character,
  text,
  ...options,
});

export const timeline = [
  say(
    "pizza-kiln-sayo-001",
    "sayo",
    "小夜です。今日は、お手製の耐熱煉瓦ピザ窯を、全体ショットでご紹介します。"
  ),
  say(
    "pizza-kiln-sayo-002",
    "sayo",
    "以上、小夜がお届けしました。ピザ窯の雰囲気、伝わっていたらうれしいです。"
  ),
] satisfies SpeechEvent[];

export const script = timeline;
