import { createFileRoute } from "@tanstack/react-router";
import { msg } from "@lingui/core/macro";
import { SpotifyWebApiClient } from "@/lib/spotify/client";
import type { SpotifyPlaybackSnapshot } from "@/lib/spotify/types";
import { localizedFor } from "@/lib/i18n/server-messages";

export const Route = createFileRoute("/api/spotify/capture")({
  server: {
    handlers: {
      POST: async ({ request }: { request: Request }) => {
        // No session middleware on this route; localize with DEFAULT_LOCALE.
        const i18n = localizedFor(null);
        try {
          const cookies = request.headers.get("Cookie") || "";
          const accessTokenMatch = cookies.match(
            /spotify_access_token=([^;]+)/
          );

          if (!accessTokenMatch) {
            return new Response(
              JSON.stringify({ error: i18n._(msg`No access token found`) }),
              {
                status: 401,
                headers: { "Content-Type": "application/json" },
              }
            );
          }

          const accessToken = decodeURIComponent(accessTokenMatch[1]);
          const spotifyClient = new SpotifyWebApiClient(accessToken);

          const snapshot = await spotifyClient.createPlaybackSnapshot();

          if (!snapshot) {
            return new Response(
              JSON.stringify({ error: i18n._(msg`No active playback to capture`) }),
              {
                status: 400,
                headers: { "Content-Type": "application/json" },
              }
            );
          }

          return new Response(JSON.stringify({ snapshot }), {
            status: 200,
            headers: { "Content-Type": "application/json" },
          });
        } catch (error) {
          console.error("Spotify capture error:", error);

          const errorMessage =
            error instanceof Error
              ? error.message
              : i18n._(msg`Failed to capture playback state`);

          return new Response(JSON.stringify({ error: errorMessage }), {
            status: 500,
            headers: { "Content-Type": "application/json" },
          });
        }
      },
    },
  },
});
