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

const SO_HEX = /^#[0-9A-Fa-f]{6}$/;

/**
 * Categorias da agenda.
 *
 * Lista traz do sistema e da empresa juntas — quem usa o filtro nao precisa
 * saber que sao duas origens diferentes por baixo. So a criacao distingue: o
 * banco recusa is_system=true vindo daqui (RLS cuida disso), entao nem
 * precisa checar de novo no codigo.
 */

export async function GET() {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return NextResponse.json({ error: "Nao autenticado." }, { status: 401 });

  const companyCtx = await getCompanyContext(supabase, user);
  if (!canCompany(companyCtx, user.id, "agenda.read")) {
    return NextResponse.json({ error: "Sem permissão para ver a agenda." }, { status: 403 });
  }

  const { data, error } = await supabase
    .from("agenda_categories")
    .select("id,name,color,is_system,system_key,sort_order")
    .order("is_system", { ascending: false })
    .order("sort_order", { ascending: true })
    .order("name", { ascending: true });

  if (error) return NextResponse.json({ error: "Não foi possível carregar as categorias." }, { status: 400 });
  return NextResponse.json({ categorias: data ?? [] });
}

export async function POST(req: Request) {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return NextResponse.json({ error: "Nao autenticado." }, { status: 401 });

  const companyCtx = await getCompanyContext(supabase, user);
  if (!canCompany(companyCtx, user.id, "agenda.board.write")) {
    return NextResponse.json({ error: "Sem permissão para criar categoria." }, { status: 403 });
  }

  const corpo = (await req.json().catch(() => null)) as { name?: unknown; color?: unknown } | null;
  const nome = String(corpo?.name ?? "").trim();
  if (!nome) return NextResponse.json({ error: "Dê um nome à categoria." }, { status: 400 });
  if (nome.length > 60) return NextResponse.json({ error: "Nome muito longo (máximo 60)." }, { status: 400 });

  const cor = String(corpo?.color ?? "").trim();
  if (!SO_HEX.test(cor)) return NextResponse.json({ error: "Escolha uma cor." }, { status: 400 });

  const companyId = companyCtx.ownerId ?? user.id;

  const { data, error } = await supabase
    .from("agenda_categories")
    .insert({ company_id: companyId, name: nome, color: cor, is_system: false })
    .select("id,name,color,is_system,system_key,sort_order")
    .maybeSingle();

  if (error) {
    if (error.code === "23505") {
      return NextResponse.json({ error: "Já existe uma categoria com esse nome." }, { status: 409 });
    }
    return NextResponse.json({ error: "Não foi possível criar a categoria." }, { status: 400 });
  }
  return NextResponse.json({ categoria: data });
}
