import { prisma } from "../database";
import { normalizeBackgroundUrl } from "@/lib/avatars";
import type { SitePreferences } from "@/prisma/generated/prisma/client";

export interface UpdateSitePreferencesInput {
  homeBackground?: string | null;
  eventsBackground?: string | null;
  leaderboardBackground?: string | null;
}

/**
 * Service de gestion des préférences globales du site
 */
export class SitePreferencesService {
  /**
   * Récupère les préférences du site
   */
  async getSitePreferences(): Promise<SitePreferences | null> {
    return prisma.sitePreferences.findUnique({
      where: { id: "global" },
    });
  }

  /**
   * Récupère les préférences du site ou crée une entrée par défaut
   */
  async getOrCreateSitePreferences(): Promise<SitePreferences> {
    let sitePreferences = await prisma.sitePreferences.findUnique({
      where: { id: "global" },
    });

    if (!sitePreferences) {
      sitePreferences = await prisma.sitePreferences.create({
        data: {
          id: "global",
          homeBackground: null,
          eventsBackground: null,
          leaderboardBackground: null,
        },
      });
    }

    return sitePreferences;
  }

  /**
   * Met à jour les préférences du site
   */
  async updateSitePreferences(
    data: UpdateSitePreferencesInput
  ): Promise<SitePreferences> {
    return prisma.sitePreferences.upsert({
      where: { id: "global" },
      update: {
        homeBackground:
          data.homeBackground === ""
            ? null
            : (data.homeBackground ?? undefined),
        eventsBackground:
          data.eventsBackground === ""
            ? null
            : (data.eventsBackground ?? undefined),
        leaderboardBackground:
          data.leaderboardBackground === ""
            ? null
            : (data.leaderboardBackground ?? undefined),
      },
      create: {
        id: "global",
        homeBackground:
          data.homeBackground === "" ? null : (data.homeBackground ?? null),
        eventsBackground:
          data.eventsBackground === "" ? null : (data.eventsBackground ?? null),
        leaderboardBackground:
          data.leaderboardBackground === ""
            ? null
            : (data.leaderboardBackground ?? null),
      },
    });
  }

  /**
   * Récupère l'image de fond pour une page donnée
   */
  async getBackgroundImage(
    page: "home" | "events" | "leaderboard",
    defaultImage: string
  ): Promise<string> {
    try {
      const sitePreferences = await prisma.sitePreferences.findUnique({
        where: { id: "global" },
      });

      if (!sitePreferences) {
        return defaultImage;
      }

      const imageKey = `${page}Background` as keyof typeof sitePreferences;
      const customImage = sitePreferences[imageKey];

      const imageUrl = (customImage as string | null) || defaultImage;
      // Normaliser l'URL pour utiliser l'API si nécessaire
      return normalizeBackgroundUrl(imageUrl) || defaultImage;
    } catch (error) {
      console.error("Error fetching background image:", error);
      return defaultImage;
    }
  }
}

export const sitePreferencesService = new SitePreferencesService();
