import { mkdir, writeFile } from "node:fs/promises";
import path from "node:path";
import { randomUUID } from "node:crypto";
import { NextResponse } from "next/server";
import { getDbPool } from "@/db";
import { getPortalContext } from "@/lib/portal-context";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

const defaults = { primaryColor: "#0d718a", accentColor: "#10bde0", backgroundColor: "#f5f8fa" };
const color = (value: unknown, fallback: string) => /^#[0-9a-f]{6}$/i.test(String(value || "")) ? String(value) : fallback;

async function clientContext() {
  const portal = await getPortalContext();
  if (!portal) return null;
  return { ...portal, db: getDbPool() };
}

export async function GET() {
  const context = await clientContext();
  if (!context) return NextResponse.json({ error: "Faça login no portal do cliente." }, { status: 401 });
  try {
    const [rows] = await context.db.execute(
      `SELECT t.name AS tenant_name, b.display_name, b.logo_storage_key, b.primary_color, b.accent_color, b.background_color
       FROM tenants t LEFT JOIN tenant_branding b ON b.tenant_id = t.id WHERE t.id = ? LIMIT 1`,
      [context.tenantId],
    );
    const branding = (rows as Record<string, unknown>[])[0];
    if (!branding) return NextResponse.json({ error: "Cliente não encontrado." }, { status: 404 });
    return NextResponse.json({
      branding: {
        displayName: String(branding.display_name || branding.tenant_name),
        logoUrl: branding.logo_storage_key ? "/api/client/branding/logo" : null,
        hasLogo: Boolean(branding.logo_storage_key),
        primaryColor: color(branding.primary_color, defaults.primaryColor),
        accentColor: color(branding.accent_color, defaults.accentColor),
        backgroundColor: color(branding.background_color, defaults.backgroundColor),
      },
      canManage: context.session.role === "client_admin" || context.isSupport,
      isSupport: context.isSupport,
      user: { name: context.isSupport ? `Suporte Capital · ${context.operatorName}` : context.session.name, role: context.isSupport ? "capital_support" : context.session.role },
    });
  } catch (error) {
    console.error("Erro ao carregar marca do cliente", error);
    return NextResponse.json({ error: "A personalização visual ainda não foi instalada.", hint: "Execute a migration 013_tenant_branding.sql." }, { status: 503 });
  }
}

export async function PUT(request: Request) {
  const context = await clientContext();
  if (!context) return NextResponse.json({ error: "Faça login no portal do cliente." }, { status: 401 });
  if (context.session.role !== "client_admin" && !context.isSupport) return NextResponse.json({ error: "Somente o administrador do cliente pode alterar a marca." }, { status: 403 });
  try {
    const form = await request.formData();
    const displayName = String(form.get("displayName") || "").trim().slice(0, 160);
    const primaryColor = color(form.get("primaryColor"), defaults.primaryColor);
    const accentColor = color(form.get("accentColor"), defaults.accentColor);
    const backgroundColor = color(form.get("backgroundColor"), defaults.backgroundColor);
    const logo = form.get("logo");
    let logoStorageKey: string | null = null;
    if (logo instanceof File && logo.size) {
      if (!logo.type.startsWith("image/") || !["image/png", "image/jpeg", "image/webp"].includes(logo.type)) return NextResponse.json({ error: "Use uma imagem PNG, JPG ou WebP para o logo." }, { status: 400 });
      if (logo.size > 2 * 1024 * 1024) return NextResponse.json({ error: "O logo deve ter no máximo 2 MB." }, { status: 413 });
      const extension = logo.type === "image/png" ? "png" : logo.type === "image/webp" ? "webp" : "jpg";
      logoStorageKey = path.posix.join("tenant-branding", context.tenantId, `${randomUUID()}.${extension}`);
      const root = process.env.STORAGE_PATH || "/app/storage";
      const filePath = path.resolve(root, logoStorageKey);
      if (!filePath.startsWith(`${path.resolve(root)}${path.sep}`)) return NextResponse.json({ error: "Arquivo inválido." }, { status: 400 });
      await mkdir(path.dirname(filePath), { recursive: true });
      await writeFile(filePath, Buffer.from(await logo.arrayBuffer()));
    }
    await context.db.execute(
      `INSERT INTO tenant_branding (tenant_id, display_name, logo_storage_key, primary_color, accent_color, background_color)
       VALUES (?, ?, ?, ?, ?, ?)
       ON DUPLICATE KEY UPDATE display_name = VALUES(display_name), logo_storage_key = COALESCE(VALUES(logo_storage_key), logo_storage_key), primary_color = VALUES(primary_color), accent_color = VALUES(accent_color), background_color = VALUES(background_color), updated_at = NOW()`,
      [context.tenantId, displayName || null, logoStorageKey, primaryColor, accentColor, backgroundColor],
    );
    return NextResponse.json({ message: "Marca atualizada. A nova identidade será aplicada ao portal do cliente.", logoUpdated: Boolean(logoStorageKey) });
  } catch (error) {
    console.error("Erro ao atualizar marca do cliente", error);
    return NextResponse.json({ error: "Não foi possível salvar a personalização.", hint: "Verifique se a migration 013_tenant_branding.sql foi executada." }, { status: 500 });
  }
}
