import { getTranslations, setRequestLocale } from "next-intl/server";
import { redirect } from "next/navigation";
import { connectDB } from "@/lib/db";
import { ClientPhotoFolder } from "@/models/ClientPhotoFolder";
import { PhotoRating } from "@/models/PhotoRating";
import { getSessionClientId } from "@/lib/auth";
import { listFolderImages } from "@/lib/nextcloud";
import { Link } from "@/i18n/navigation";
import { formatDateLocale } from "@/lib/orderConstants";
import { AccountPageHeader } from "@/components/account/AccountPageHeader";

export const dynamic = "force-dynamic";

export default async function PhotosOverviewPage({ params }: { params: Promise<{ locale: string }> }) {
  const { locale } = await params;
  setRequestLocale(locale);
  const t = await getTranslations({ locale, namespace: "photos" });

  const clientId = await getSessionClientId();
  if (!clientId) redirect(`/${locale}/login`);

  await connectDB();
  // Nur freigegebene Ordner sind für den Kunden sichtbar — manuell
  // zugewiesene Ordner starten unveröffentlicht, bis ein Admin sie freigibt.
  const folders = await ClientPhotoFolder.find({ clientId, released: true }).sort({ sortOrder: 1 }).lean();

  // Erstes freigegebenes Bild pro Ordner für ein Vorschaubild — einzeln pro
  // Ordner abgesichert, damit ein einzelner nicht erreichbarer
  // Nextcloud-Ordner nicht die ganze Übersicht zum Absturz bringt. Nur
  // freigegebene Fotos zählen/erscheinen — der Kunde soll auch hier nichts
  // von noch nicht freigegebenen Fotos sehen.
  const previews = await Promise.all(
    folders.map(async (f) => {
      try {
        const [images, approvedRatings] = await Promise.all([
          listFolderImages(f.nextcloudPath),
          PhotoRating.find({ folderId: f._id, approvedForDownload: true }).select("fileName").lean(),
        ]);
        const approvedNames = new Set(approvedRatings.map((r) => r.fileName));
        const approvedImages = images.filter((img) => approvedNames.has(img));
        return { coverImage: approvedImages[0] ?? null, count: approvedImages.length };
      } catch {
        return { coverImage: null, count: 0 };
      }
    })
  );

  return (
    <div>
      <div>
        <AccountPageHeader eyebrow={t("eyebrow")} title={t("title")} />

        {folders.length === 0 ? (
          <p className="text-sm text-[var(--rk-ink-muted)]">{t("noFolders")}</p>
        ) : (
          <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3">
            {folders.map((f, i) => {
              const preview = previews[i];
              return (
                <Link
                  key={String(f._id)}
                  href={`/account/photos/${f._id}`}
                  className="group block overflow-hidden rounded-xl border border-white/10 bg-[var(--rk-surface)] transition-colors hover:border-white/30"
                >
                  <div className="relative aspect-[4/3] bg-white/5">
                    {preview.coverImage ? (
                      // Authentifizierte Nextcloud-Route — next/image würde serverseitig
                      // proxyen und dabei das Session-Cookie verlieren (401), daher
                      // bewusst ein normales <img>, wie auch in PhotoGalleryClient.
                      // eslint-disable-next-line @next/next/no-img-element
                      <img
                        src={`/api/photos/${f._id}/${encodeURIComponent(preview.coverImage)}?variant=thumb`}
                        alt=""
                        loading="lazy"
                        className="absolute inset-0 w-full h-full object-cover transition-transform duration-700 ease-out group-hover:scale-105"
                      />
                    ) : (
                      <div className="absolute inset-0 flex items-center justify-center text-3xl opacity-30">📁</div>
                    )}
                  </div>
                  <div className="p-4">
                    <p className="text-sm font-medium text-[var(--rk-ink)] truncate">{f.label || f.nextcloudPath}</p>
                    <p className="mt-1 text-xs text-[var(--rk-ink-muted)]">
                      {formatDateLocale(new Date(f.assignedAt), locale)}
                      {preview.count > 0 ? ` · ${t("photoCount", { count: preview.count })}` : ""}
                    </p>
                  </div>
                </Link>
              );
            })}
          </div>
        )}
      </div>
    </div>
  );
}
