import { asc, desc, eq } from 'drizzle-orm';
import { db } from './index';
import { tenants, testimonios, testimonioFotos, galeriaFotos, type GaleriaFoto } from './schema';
import { getCurrentTenantId as getTenantId } from '@/lib/auth/current-user';

export type TenantPerfil = {
  nombreEmpresa: string;
  slug: string;
  logoUrl: string | null;
  provincia: string | null;
  cif: string | null;
  direccion: string | null;
  telefono: string | null;
  email: string | null;
  web: string | null;
  seoTitle: string | null;
  seoDescription: string | null;
  aboutEnabled: boolean;
  aboutFotoUrl: string | null;
  aboutTexto: string | null;
  aniosExperiencia: number | null;
  themePreset: string;
  themeColor: string | null;
};

const TENANT_PERFIL_FALLBACK: TenantPerfil = {
  nombreEmpresa: 'Reformix',
  slug: '',
  logoUrl: null,
  provincia: null,
  cif: null,
  direccion: null,
  telefono: null,
  email: null,
  web: null,
  seoTitle: null,
  seoDescription: null,
  aboutEnabled: false,
  aboutFotoUrl: null,
  aboutTexto: null,
  aniosExperiencia: null,
  themePreset: 'pizarra',
  themeColor: null,
};

// Perfil del reformista por id, sin depender del contexto de auth. Lo usa el builder de PDF
// y la finalización, que corren desde el EP público (sin sesión).
export async function getTenantPerfilById(tenantId: string): Promise<TenantPerfil> {
  const [row] = await db
    .select({
      nombreEmpresa: tenants.nombreEmpresa,
      slug: tenants.slug,
      logoUrl: tenants.logoUrl,
      provincia: tenants.provincia,
      cif: tenants.cif,
      direccion: tenants.direccion,
      telefono: tenants.telefono,
      email: tenants.email,
      web: tenants.web,
      seoTitle: tenants.seoTitle,
      seoDescription: tenants.seoDescription,
      aboutEnabled: tenants.aboutEnabled,
      aboutFotoUrl: tenants.aboutFotoUrl,
      aboutTexto: tenants.aboutTexto,
      aniosExperiencia: tenants.aniosExperiencia,
      themePreset: tenants.themePreset,
      themeColor: tenants.themeColor,
    })
    .from(tenants)
    .where(eq(tenants.id, tenantId))
    .limit(1);

  return row ?? TENANT_PERFIL_FALLBACK;
}

export async function getTenantPerfil(): Promise<TenantPerfil> {
  const tenantId = await getTenantId();
  return getTenantPerfilById(tenantId);
}

// Galería de trabajos del reformista, para gestionarla desde el panel.
export async function getGaleriaPanel(): Promise<GaleriaFoto[]> {
  const tenantId = await getTenantId();
  return db
    .select()
    .from(galeriaFotos)
    .where(eq(galeriaFotos.tenantId, tenantId))
    .orderBy(asc(galeriaFotos.orden), asc(galeriaFotos.createdAt));
}

export type TestimonioPanel = {
  id: string;
  nombre: string;
  contexto: string | null;
  rating: number;
  texto: string;
  estado: (typeof testimonios.estado.enumValues)[number];
  createdAt: Date;
  fotos: string[];
};

export async function getTestimoniosPanel(): Promise<TestimonioPanel[]> {
  const tenantId = await getTenantId();
  const rows = await db
    .select()
    .from(testimonios)
    .where(eq(testimonios.tenantId, tenantId))
    .orderBy(desc(testimonios.createdAt));
  if (rows.length === 0) return [];

  const ids = rows.map((r) => r.id);
  const fotos = await db.select().from(testimonioFotos);
  const fotosPorTestimonio = new Map<string, string[]>();
  for (const f of fotos) {
    if (!ids.includes(f.testimonioId)) continue;
    const list = fotosPorTestimonio.get(f.testimonioId) ?? [];
    list.push(f.url);
    fotosPorTestimonio.set(f.testimonioId, list);
  }

  return rows.map((r) => ({
    id: r.id,
    nombre: r.nombre,
    contexto: r.contexto,
    rating: r.rating,
    texto: r.texto,
    estado: r.estado,
    createdAt: r.createdAt,
    fotos: fotosPorTestimonio.get(r.id) ?? [],
  }));
}
