import { getAuthUserId } from "@convex-dev/auth/server";
import { v } from "convex/values";
import { api, internal } from "./_generated/api";
import { Id } from "./_generated/dataModel";
import { action } from "./_generated/server";
import { REQ_HEADERS, convertSunoClip } from "./constants";

export const doSomething = action({
  args: { roomId: v.id("rooms") },
  handler: async (ctx, args) => {
    const userId = await getAuthUserId(ctx);
    if (userId === null) {
      return null;
    }

    const room = await ctx.runQuery(api.rooms.getById, {
      roomId: args.roomId,
    });

    const response = await fetch(
      "https://studio-api.staging.suno.com/api/generate/v2",
      {
        method: "POST",
        headers: REQ_HEADERS,
        body: JSON.stringify({
          gpt_description_prompt:
            room?.metadata?.gpt_description_prompt ||
            "an acoustic synthpop song about prototyping software",
          mv: "chirp-v4-h-s-31",
          prompt: "",
          metadata: { lyrics_model: null },
          make_instrumental: false,
          user_uploaded_images_b64: [],
          generation_type: "TEXT",
          user_uploaded_video_id: null,
        }),
      }
    );

    const reqData = await response.json();

    for (let clipData of reqData.clips) {
      const data = await ctx.runMutation(
        internal.internalUpdateClip.addClipInternal,
        {
          userId: userId,
          roomId: args.roomId,
          clip: convertSunoClip(clipData),
        }
      );
    }

    ctx.scheduler.runAfter(8000, internal.internalUpdateClip.syncClipsInternal);

    return "success";
  },
});

export const changeRadio = action({
  args: { roomId: v.id("rooms") },
  handler: async (ctx, args) => {
    const userId = await getAuthUserId(ctx);
    if (userId === null) {
      return null;
    }

    // Enqueue generation in Room
    const room = await ctx.runQuery(api.rooms.getById, {
      roomId: args.roomId,
    });

    const response = await fetch(
      "https://studio-api.staging.suno.com/api/generate/v2",
      {
        method: "POST",
        headers: REQ_HEADERS,
        body: JSON.stringify({
          gpt_description_prompt:
            room?.metadata?.gpt_description_prompt ||
            "an acoustic synthpop song about prototyping software",
          mv: "chirp-v4-h-s-31",
          prompt: "",
          metadata: { lyrics_model: null },
          make_instrumental: false,
          user_uploaded_images_b64: [],
          generation_type: "TEXT",
          user_uploaded_video_id: null,
        }),
      }
    );

    const reqData = await response.json();

    let newClipIds: Id<"clips">[] = [];

    for (let clipData of reqData.clips) {
      const data = await ctx.runMutation(
        internal.internalUpdateClip.addClipInternal,
        {
          userId: userId,
          roomId: args.roomId,
          clip: convertSunoClip(clipData),
        }
      );
      newClipIds.push(data);
    }

    ctx.scheduler.runAfter(8000, internal.internalUpdateClip.syncClipsInternal);

    await ctx.runMutation(internal.rooms.updateRoomRadioState, {
      roomId: args.roomId,
      radioState: {
        queue: newClipIds.map((clipId) => ({
          clipId,
          audio_url: null,
          status: "pending",
          queueTs: new Date().getTime(),
          playTs: null,
        })),
      },
    });

    return "success";
  },
});
