import { NextResponse } from "next/server";
import { createClient, createAdminClient } from "@/lib/supabase-server";
import { canCompany, getCompanyContext } from "@/lib/company-context";
import { avisarLoja } from "@/lib/loja/avisar-loja";

/**
 * A hora de corte da produção.
 *
 * Guardada no perfil da loja porque é uma promessa da loja inteira, não de um
 * produto: "pedido fechado até as 16h entra na produção de hoje".
 */

const HORA_VALIDA = /^([01]\d|2[0-3]):([0-5]\d)$/;

async function entrar(permissao: "production.read" | "production.board.write") {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return { erro: NextResponse.json({ error: "Não autenticado." }, { status: 401 }) };

  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, permissao)) {
    return { erro: NextResponse.json({ error: "Sem permissão." }, { status: 403 }) };
  }
  const empresa = ctx.ownerId ?? ctx.companyId;
  if (!empresa) return { erro: NextResponse.json({ error: "Empresa não identificada." }, { status: 400 }) };
  return { empresa };
}

export async function GET() {
  const { erro, empresa } = await entrar("production.read");
  if (erro || !empresa) return erro!;

  const admin = createAdminClient();
  const { data } = await admin
    .from("profiles")
    .select("production_cutoff_enabled,production_cutoff_time")
    .eq("id", empresa)
    .maybeSingle();

  const linha = (data || {}) as { production_cutoff_enabled?: boolean; production_cutoff_time?: string | null };
  return NextResponse.json({
    ligado: linha.production_cutoff_enabled === true,
    hora: linha.production_cutoff_time || "16:00",
  });
}

export async function PUT(req: Request) {
  const { erro, empresa } = await entrar("production.board.write");
  if (erro || !empresa) return erro!;

  const corpo = (await req.json().catch(() => null)) as { ligado?: unknown; hora?: unknown } | null;
  const ligado = corpo?.ligado === true;
  const hora = String(corpo?.hora || "").trim();

  /* Hora inválida com o aviso ligado viraria uma promessa sem relógio na
     vitrine: melhor recusar aqui. */
  if (ligado && !HORA_VALIDA.test(hora)) {
    return NextResponse.json({ error: "Informe a hora no formato 16:00." }, { status: 400 });
  }

  const admin = createAdminClient();
  const { error } = await admin
    .from("profiles")
    .update({
      production_cutoff_enabled: ligado,
      production_cutoff_time: ligado ? hora : null,
    })
    .eq("id", empresa);

  if (error) return NextResponse.json({ error: error.message }, { status: 400 });
  /* O aviso do corte aparece na vitrine, que guarda o perfil por dois minutos. */
  avisarLoja(empresa, req);
  return NextResponse.json({ ok: true });
}
