import { randomUUID } from "node:crypto";
import { NextResponse } from "next/server";
import { getDbPool } from "@/db";
import { ensureCapitalTenant } from "@/lib/tenant";
import { getSession } from "@/lib/auth";
import { getPortalContext } from "@/lib/portal-context";

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

const vehicleTypes = ["light", "motorcycle", "heavy"] as const;
type VehicleType = (typeof vehicleTypes)[number];

function text(value: unknown) {
  return typeof value === "string" ? value.trim() : "";
}

function databaseError(error: unknown) {
  const code = typeof error === "object" && error && "code" in error ? String(error.code) : "";
  const message = error instanceof Error ? error.message : "";

  if (message.includes("Configuração de banco incompleta")) {
    return { error: "Banco de dados não configurado neste ambiente.", hint: "Use a versão do servidor ou configure as variáveis DATABASE_* para desenvolvimento local.", code: "DATABASE_CONFIG_MISSING", status: 503 };
  }
  if (["ECONNREFUSED", "ETIMEDOUT", "ENOTFOUND"].includes(code)) {
    return { error: "Não foi possível alcançar o banco de dados.", hint: "Verifique se o MySQL está ativo e se DATABASE_HOST e DATABASE_PORT estão corretos.", code, status: 503 };
  }
  if (code === "ER_ACCESS_DENIED_ERROR") {
    return { error: "O banco de dados recusou as credenciais da aplicação.", hint: "Confira DATABASE_USER, DATABASE_PASSWORD e as permissões do usuário no MySQL.", code, status: 503 };
  }
  if (["ER_NO_SUCH_TABLE", "ER_BAD_DB_ERROR"].includes(code)) {
    return { error: "A estrutura do banco de dados ainda não está pronta.", hint: "Verifique se o banco capital_autovistoria e as tabelas do arquivo database/schema.sql foram criados.", code, status: 503 };
  }
  return { error: "Ocorreu uma falha inesperada ao acessar o banco de dados.", hint: "Consulte os logs do container para o diagnóstico técnico.", code: code || "UNKNOWN", status: 500 };
}

function formatInspection(row: Record<string, unknown>) {
  const type = row.vehicle_type as VehicleType;
  const status = String(row.status);
  const statusMap: Record<string, [string, "cyan" | "orange" | "green" | "red" | "gray"]> = {
    received: ["Recebida", "gray"],
    pending_data: ["Dados pendentes", "orange"],
    link_sent: ["Link enviado", "gray"],
    in_progress: ["Em vistoria", "cyan"],
    retriage: ["Em retriagem", "orange"],
    ai_analysis: ["Em análise IA", "cyan"],
    human_review: ["Com apontamento · análise humana", "orange"],
    approved: ["Aprovada", "green"],
    approved_with_notes: ["Aprovada com apontamentos", "orange"],
    rejected: ["Reprovada", "red"],
    expired: ["Frustrada · link expirado", "red"],
    cancelled: ["Frustrada · cancelada", "red"],
  };
  const [stage, stageTone] = statusMap[status] ?? [status, "gray"];
  const typeMap: Record<VehicleType, "Leve" | "Moto" | "Pesado"> = {
    light: "Leve",
    motorcycle: "Moto",
    heavy: "Pesado",
  };

  return {
    id: String(row.external_id),
    vehicle: String(row.vehicle_description || "Veículo não informado"),
    plate: String(row.plate),
    type: typeMap[type],
    stage,
    stageTone,
    customer: String(row.tenant_name || "Capital Vistorias"),
    tenantId: String(row.tenant_id || ""),
    time: "agora",
    score: Number(row.risk_score ?? 0),
    createdAt: String(row.created_at ?? ""),
  };
}

export async function GET() {
  try {
    const session = await getSession();
    if (!session) return NextResponse.json({ error: "Não autenticado." }, { status: 401 });
    const db = getDbPool();
    const portal = await getPortalContext();
    const [rows] = portal
      ? await db.query(`SELECT i.external_id, i.vehicle_type, i.plate, i.vehicle_description, i.status, i.risk_score, i.created_at, i.tenant_id, t.name AS tenant_name FROM inspections i INNER JOIN tenants t ON t.id = i.tenant_id WHERE i.tenant_id = ? AND i.status <> 'trashed' ORDER BY i.created_at DESC LIMIT 25`, [portal.tenantId])
      : await db.query(`SELECT i.external_id, i.vehicle_type, i.plate, i.vehicle_description, i.status, i.risk_score, i.created_at, i.tenant_id, t.name AS tenant_name FROM inspections i INNER JOIN tenants t ON t.id = i.tenant_id WHERE i.status <> 'trashed' ORDER BY i.created_at DESC LIMIT 100`);
    return NextResponse.json({ items: (rows as Record<string, unknown>[]).map(formatInspection) });
  } catch (error) {
    console.error("Erro ao listar vistorias", error);
    const response = databaseError(error);
    return NextResponse.json(response, { status: response.status });
  }
}

export async function POST(request: Request) {
  try {
    const body = await request.json();
    const externalId = text(body.externalId);
    const vehicleType = text(body.vehicleType) as VehicleType;
    const plate = text(body.plate).toUpperCase();
    const chassis = text(body.chassis).toUpperCase();
    const vehicleDescription = text(body.vehicleDescription);
    const modelYear = Number.parseInt(text(body.modelYear).slice(0, 4), 10);
    const responsibleName = text(body.responsibleName);
    const responsiblePhone = text(body.responsiblePhone);
    const responsibleEmail = text(body.responsibleEmail).toLowerCase();

    if (!externalId || !plate || !vehicleDescription || !responsibleName || !responsiblePhone) {
      return NextResponse.json({ error: "Preencha proposta, veículo, placa e responsável." }, { status: 400 });
    }
    if (!vehicleTypes.includes(vehicleType)) {
      return NextResponse.json({ error: "Tipo de veículo inválido." }, { status: 400 });
    }

    const session = await getSession();
    if (!session) return NextResponse.json({ error: "Faça login para criar uma vistoria." }, { status: 401 });
    const portal = await getPortalContext();
    const tenantId = portal?.tenantId || await ensureCapitalTenant();
    const db = getDbPool();
    const id = randomUUID();
    await db.execute(
      `INSERT INTO inspections
       (id, tenant_id, external_id, vehicle_type, plate, chassis, vehicle_description, model_year, responsible_name, responsible_phone, responsible_email, status)
       VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'received')`,
      [id, tenantId, externalId, vehicleType, plate, chassis, vehicleDescription, Number.isNaN(modelYear) ? null : modelYear, responsibleName, responsiblePhone, responsibleEmail || null],
    );

    return NextResponse.json({ id, message: "Vistoria criada e pronta para a validação." }, { status: 201 });
  } catch (error: unknown) {
    console.error("Erro ao criar vistoria", error);
    if (typeof error === "object" && error && "code" in error && error.code === "ER_DUP_ENTRY") {
      return NextResponse.json({ error: "Já existe uma vistoria com esta proposta para este cliente." }, { status: 409 });
    }
    const response = databaseError(error);
    return NextResponse.json(response, { status: response.status });
  }
}
