import axios from "axios";
import { GlobalFunctions } from "@/GlobalFunctions";

import { buildCommanderHeaders } from "./commanderHttp";
import { resolveCommanderBaseUrl } from "./fechamentoBaseUrl";
import { clearCommanderUnidadeIdCache, type UnidadeLookupRow } from "./unidadeContext";

async function buildLookupHeaders(): Promise<Record<string, string>> {
  const token = await GlobalFunctions.getToken();
  const apiKey = import.meta.env.VITE_API_KEY || "";
  return {
    "Content-Type": "application/json",
    ...(apiKey ? { apikey: apiKey } : {}),
    ...(token ? { Authorization: `Bearer ${token}` } : {}),
  };
}

function getUsuarioEmailParaCommander(): string {
  const email = GlobalFunctions.getUsuarioLogado().email?.trim();
  if (!email) {
    throw new Error("E-mail do usuário logado não disponível para cadastro de unidade.");
  }
  return email;
}

export type CriarUnidadeInput = {
  nome: string;
  estabelecimentoId: string;
};

export type AtualizarUnidadeInput = {
  nome?: string;
  estabelecimentoId?: string;
};

type UnidadeResponse = { data: UnidadeLookupRow & { criadoEm: string } };

class FechamentoUnidadesService {
  /**
   * `POST /unidades` sem `X-Unidade-Id`. Exige `usuarioEmail` na query (validação admin no Commander).
   */
  async createUnidade(input: CriarUnidadeInput): Promise<UnidadeLookupRow & { criadoEm: string }> {
    const baseUrl = resolveCommanderBaseUrl();
    const headers = await buildLookupHeaders();
    const usuarioEmail = getUsuarioEmailParaCommander();
    const response = await axios.post<UnidadeResponse>(
      `${baseUrl}/unidades`,
      {
        nome: input.nome.trim(),
        estabelecimentoId: input.estabelecimentoId.trim(),
      },
      {
        headers,
        params: { usuarioEmail },
      },
    );
    clearCommanderUnidadeIdCache();
    return response.data.data;
  }

  async updateUnidade(
    unidadeId: string,
    input: AtualizarUnidadeInput,
  ): Promise<UnidadeLookupRow & { criadoEm: string }> {
    const baseUrl = resolveCommanderBaseUrl();
    const headers = await buildCommanderHeaders();
    const body: Record<string, string> = {};
    if (input.nome !== undefined) body.nome = input.nome.trim();
    if (input.estabelecimentoId !== undefined) body.estabelecimentoId = input.estabelecimentoId.trim();

    const response = await axios.patch<UnidadeResponse>(`${baseUrl}/unidades/${unidadeId}`, body, {
      headers,
    });
    clearCommanderUnidadeIdCache();
    return response.data.data;
  }
}

export const fechamentoUnidadesService = new FechamentoUnidadesService();
