import { v } from "convex/values";
import { internal } from "./_generated/api";
import {
  internalAction,
  internalMutation,
  internalQuery,
} from "./_generated/server";
import { REQ_HEADERS, convertSunoClip } from "./constants";

// export const updateClipInternal = internalMutation({
//   args: { clipId: v.id("clips") },
//   handler: async (ctx, args) => {
//     await ctx.db.patch(args.clipId, { });
//   },
// });

export const addClipInternal = internalMutation({
  args: { userId: v.id("users"), roomId: v.id("rooms"), clip: v.any() },
  handler: async (ctx, args) => {
    return await ctx.db.insert("clips", {
      ...args.clip,
      roomId: args.roomId,
      userId: args.userId,
    });
  },
});

export const updateClipInternal = internalMutation({
  args: { clipId: v.id("clips"), clip: v.any() },
  handler: async (ctx, args) => {
    await ctx.db.patch(args.clipId, args.clip);
  },
});

export const getIncompleteClipsInternal = internalQuery({
  args: {},
  handler: async (ctx, args) => {
    return await ctx.db
      .query("clips")
      .filter((q) =>
        q.and(
          q.neq(q.field("status"), "complete"),
          q.gte(
            q.field("_creationTime"),
            // 5 minutes ago in ms
            Date.now() - 5 * 60 * 1000
          )
        )
      )
      .collect();
  },
});

export const syncClipsInternal = internalAction({
  args: {},
  handler: async (ctx, args) => {
    const clips = await ctx.runQuery(
      internal.internalUpdateClip.getIncompleteClipsInternal
    );

    const sunoIds = clips.map((clip) => clip.sunoId);
    const sunoIdToClipId = clips.reduce(
      (acc, clip) => {
        acc[clip.sunoId] = clip._id;
        return acc;
      },
      {} as Record<string, any>
    );

    if (!sunoIds.length) {
      return;
    }

    const sunoClips = await fetch(
      `https://studio-api.staging.suno.com/api/feed/v2?ids=${sunoIds.join(",")}`,
      {
        headers: REQ_HEADERS,
      }
    );

    const sunoClipsJson = await sunoClips.json();

    console.log(sunoClipsJson);

    for (const sunoClip of sunoClipsJson.clips) {
      await ctx.runMutation(internal.internalUpdateClip.updateClipInternal, {
        clip: convertSunoClip(sunoClip),
        clipId: sunoIdToClipId[sunoClip.id],
      });
    }
  },
});
