import { createClient } from "@supabase/supabase-js";
import { fetchDataByUrl, fetchGlobals } from "./utils/fetchers.js";
import {
  generateArtistHTML,
  generateBookHTML,
  generateGenreHTML,
  generateMetadata,
  generateWatchingHTML,
} from "./utils/generators.js";
import { updateDynamicContent } from "./utils/updaters.js";

const BASE_URL = "https://coryd.dev";
const NOT_FOUND_URL = `${BASE_URL}/404`;

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    const path = url.pathname.replace(/\/$/, "");
    const supabaseUrl = env.SUPABASE_URL || process.env.SUPABASE_URL;
    const supabaseKey = env.SUPABASE_KEY || process.env.SUPABASE_KEY;
    const supabase = createClient(supabaseUrl, supabaseKey);
    let data, type;

    if (path === "/books" || path === "/books/")
      return fetch(`${BASE_URL}/books/`);
    if (path.startsWith("/books/years/")) return fetch(`${BASE_URL}${path}`);

    if (path.startsWith("/watching/movies/")) {
      data = await fetchDataByUrl(supabase, "optimized_movies", path);
      type = "movie";
    } else if (path.startsWith("/watching/shows/")) {
      data = await fetchDataByUrl(supabase, "optimized_shows", path);
      type = "show";
    } else if (path.startsWith("/music/artists/")) {
      data = await fetchDataByUrl(supabase, "optimized_artists", path);
      type = "artist";
    } else if (path.startsWith("/music/genres/")) {
      data = await fetchDataByUrl(supabase, "optimized_genres", path);
      type = "genre";
    } else if (path.startsWith("/books/")) {
      data = await fetchDataByUrl(supabase, "optimized_books", path);
      type = "book";
    } else {
      return Response.redirect(NOT_FOUND_URL, 302);
    }

    if (!data) return Response.redirect(NOT_FOUND_URL, 302);

    const globals = await fetchGlobals(supabase);
    let mediaHtml;

    switch (type) {
      case "artist":
        mediaHtml = generateArtistHTML(data, globals);
        break;
      case "genre":
        mediaHtml = generateGenreHTML(data, globals);
        break;
      case "book":
        mediaHtml = generateBookHTML(data, globals);
        break;
      default:
        mediaHtml = generateWatchingHTML(data, globals, type);
        break;
    }

    const templateResponse = await fetch(`${BASE_URL}`);
    const template = await templateResponse.text();
    const metadata = generateMetadata(data, type, globals);
    const html = updateDynamicContent(template, metadata, mediaHtml);
    const headers = new Headers({
      "Content-Type": "text/html",
      "Cache-Control":
        "public, max-age=3600, s-maxage=3600, stale-while-revalidate=86400",
    });

    return new Response(html, { headers });
  },
};