import {
  clearVideo,
  clearStill,
  defineVQTimeline,
  say,
  standeePosition,
  still,
  video,
  wait,
  type VQSpeechEvent,
  type VQTimelineEvent,
  type VQTimelineInputEvent,
} from "../../lib/VQRemotionLib/timeline";
import type {CharacterId, VoicevoxVoice} from "./characters";

export {characters} from "./characters";
export type {CharacterDefinition, CharacterId, VoicevoxVoice} from "./characters";

export type SpeechEvent = VQSpeechEvent<CharacterId, VoicevoxVoice>;
export type TimelineEvent = VQTimelineEvent<CharacterId, VoicevoxVoice>;
export type TimelineInputEvent = VQTimelineInputEvent<
  CharacterId,
  VoicevoxVoice
>;

export const timeline = defineVQTimeline([
  say("pizza-oven-project-01-sayo-001", "sayo", "こんにちは。小夜です。"),
  say("pizza-oven-project-01-sayo-002", "sayo", "ピザって美味しいじゃないですか。"),
  say("pizza-oven-project-01-sayo-003", "sayo", "だから、作る事にしたんですよね。"),
  standeePosition("pizza-oven-project-01-sayo-position-001", "sayo", "corner"),
  still(
    "pizza-oven-project-01-oven-still-001",
    "image/still/blender-oven-still01.png",
    {
      durationSeconds: 1.0,
      fit: "cover",
    }
  ),
  say("pizza-oven-project-01-sayo-004", "sayo", "ピザ窯を。", {
    readAs: "ぴざがまを。",
  }),
  wait(0.5),
  say("pizza-oven-project-01-sayo-005", "sayo", "まずはblender上で、耐熱レンガの寸法を元に積み方を設計することにしました。"),
  say("pizza-oven-project-01-sayo-006", "sayo", "使うレンガの数がこれでわかります。"),
  say("pizza-oven-project-01-sayo-007", "sayo", "通常サイズのレンガが91個、\n半分にしたレンガが8個必要ですね。"),
  say("pizza-oven-project-01-sayo-008", "sayo", "レンガを割って半分にするので、合計95個の耐熱レンガを買うことにしました。"),
  clearStill("pizza-oven-project-01-clear-still-001"),
  standeePosition("pizza-oven-project-01-sayo-position-002", "sayo", "stage"),
  say("pizza-oven-project-01-sayo-009", "sayo", "次に、レンガを積む土台を作ります。"),
  say("pizza-oven-project-01-sayo-010", "sayo", "ホームセンターで、コンクリートブロックを8個買ってきました。"),
  standeePosition("pizza-oven-project-01-sayo-position-003", "sayo", "corner"),
  still(
    "pizza-oven-project-01-block-still-001",
    "image/still/oven-base-block.jpg",
    {
      durationSeconds: 0.1,
      fit: "cover",
    }
  ),
  say("pizza-oven-project-01-sayo-011", "sayo", "これを平らに固めた地面に置いて、その上にレンガを積んでいきます。"),
  say("pizza-oven-project-01-sayo-012", "sayo", "後は設計図通りに……　3.5kg×95個の耐熱レンガを積んでいくだけですね。"),
  say("pizza-oven-project-01-sayo-013", "sayo", "……合計332.5kgですね。"),
  say("pizza-oven-project-01-sayo-014", "sayo", "かなり重かったので運ぶのは大変でしたが、\nなんとかしました。"),
  still(
    "pizza-oven-project-01-stacked-block-still-001",
    "image/still/oven-dev01.jpg",
    {
      durationSeconds: 0.5,
      fit: "cover",
    }
  ),
  say("pizza-oven-project-01-sayo-015", "sayo", "設計に従ってレンガを積み上げていきます。"),
  video("pizza-oven-project-01-stacking-bricks-video-001", "image/video/block-dev.mp4", {
    placement: "background",
    playback: "once",
    durationSeconds: 15.0,
    muted: true,
    fit: "cover",
    zIndex: 1,
  }),
  say("pizza-oven-project-01-sayo-016", "sayo", "焼成室の床部分ではレンガを浮かせる必要があるため、L字鉄アングルを使って支えます。"),
  wait(2.0),
  video("pizza-oven-project-01-cutting-steel-video-001", "image/video/cutting-steel01.mp4", {
    placement: "background",
    playback: "once",
    durationSeconds: 27.111,
    muted: false,
    volume: 0.1,
    fit: "cover",
    zIndex: 1,
  }),
  clearStill("pizza-oven-project-01-clear-still-002"),
  say("pizza-oven-project-01-sayo-017", "sayo", "長めのL字鉄アングルを買ってきたので、\n窯の幅に合わせて切断して使います。"),
  say("pizza-oven-project-01-sayo-018", "sayo", "金属用のディスクグラインダーを使って切りましょうね。"),
  say("pizza-oven-project-01-sayo-019", "sayo", "燃焼室の床、天井を支えるためには9本のL字鉄アングルが必要でした。"),
  say("pizza-oven-project-01-sayo-020", "sayo", "切断したら、続きを積み上げて行きましょう。"),
  clearVideo(
    "pizza-oven-project-01-clear-cutting-steel-video-001",
    "pizza-oven-project-01-cutting-steel-video-001"
  ),
  standeePosition("pizza-oven-project-01-sayo-position-005", "sayo", "corner"),
  still(
    "pizza-oven-project-01-stacked-block-still-002",
    "image/still/oven-dev02.jpg",
    {
      durationSeconds: 0.5,
      fit: "cover",
    }
  ),
  say("pizza-oven-project-01-sayo-021", "sayo", "積みました。"),
  say("pizza-oven-project-01-sayo-022", "sayo", "ひとまずは窯の形になりましたね。\nピザが近づいてきた気配がします。"),
  // firewood01.jpgを表示
  still(
    "pizza-oven-project-01-firewood-still-001",
    "image/still/firewood01.jpg",
    {
      durationSeconds: 0.5,
      fit: "cover",
    }),
  say("pizza-oven-project-01-sayo-023", "sayo", "早速試験運転してみようと思います。"),
  say("pizza-oven-project-01-sayo-024", "sayo", "燃料は薪です。\n今後のため肉焼き用の炭も用意してあります。"),
  // firewood02.jpgを表示
  still(
    "pizza-oven-project-01-firewood-still-002",
    "image/still/firewood02.jpg",
    {
      durationSeconds: 0.5,
      fit: "cover",
    }),
  say("pizza-oven-project-01-sayo-025", "sayo", "焚き付け用に細い薪もありますよ。"),
  // firewood03.jpgを表示
  still(
    "pizza-oven-project-01-firewood-still-003",
    "image/still/firewood03.jpg",
    {
      durationSeconds: 0.5,
      fit: "cover",
    }),
  say("pizza-oven-project-01-sayo-026", "sayo", "早速薪を組み上げて……"),
  // firewood04.jpgを表示
  still(
    "pizza-oven-project-01-firewood-still-004",
    "image/still/firewood04.jpg",
    {
      durationSeconds: 0.5,
      fit: "cover",
    }),
  say("pizza-oven-project-01-sayo-027", "sayo", "着火！"),
  say("pizza-oven-project-01-sayo-028", "sayo", "火がつきました！\nこのまましばらく燃やして、窯を温めていきます。"),
  // running01.jpgを表示
  still(
    "pizza-oven-project-01-running-still-001",
    "image/still/running01.jpg",
    {
      durationSeconds: 0.5,
      fit: "cover",
    }),
  say("pizza-oven-project-01-sayo-029", "sayo", "いい感じに温まりましたね。"),
  say("pizza-oven-project-01-sayo-030", "sayo", "今回はまだピザ生地を用意していないので、試験運転にはソーセージを焼いてみます。"),
  say("pizza-oven-project-01-sayo-031", "sayo", "結果は、大成功！スモーキーな香りがついて、とても美味しく焼けました。"),
  // stillを消して、小夜を真ん中に戻す
  clearStill("pizza-oven-project-01-clear-still-003"),
  standeePosition("pizza-oven-project-01-sayo-position-006", "sayo", "stage"),
  say("pizza-oven-project-01-sayo-032", "sayo", "次回はピザ生地を用意して、ピザを焼いてみたいと思います！"),
  say("pizza-oven-project-01-sayo-033", "sayo", "今後、石窯のアップデートや料理の様子をお届けする予定です。"),
  say("pizza-oven-project-01-sayo-034", "sayo", "お楽しみに！"),
] satisfies readonly TimelineInputEvent[]);
