import {
  createAvenant,
  listAvenants,
  listAvenantsByContratBusinessId,
} from "@/services/avenants.service";
import { getContratByBusinessId, getContratById } from "@/services/contrats.service";
import { omitInternalId, omitInternalIdList, toPublicContract } from "@/server/public-entity";
import type { PublicAvenant, PublicContrat, PublicFeed } from "@/types";
import type { AvenantCreateInput } from "@/validators/avenants";

export async function getAvenantsFeed(limit: number, offset: number): Promise<PublicFeed<PublicAvenant>> {
  const avenants = await listAvenants(limit, offset);

  return {
    items: omitInternalIdList(avenants),
    count: avenants.length,
  };
}

export async function createAvenantFeed(data: AvenantCreateInput): Promise<{ avenant: PublicAvenant | null; error: "CONTRAT_NOT_FOUND" | null }> {
  const contratByTechnicalId = await getContratById(data.id_contrat);
  const contratByBusinessId = contratByTechnicalId
    ? null
    : await getContratByBusinessId(data.id_contrat);
  const contrat = contratByTechnicalId ?? contratByBusinessId;

  if (!contrat) {
    return {
      avenant: null,
      error: "CONTRAT_NOT_FOUND" as const,
    };
  }

  const resolvedBusinessId = contrat.ID_Contrat ?? contrat.id;
  const avenant = await createAvenant({
    ...data,
    id_contrat: resolvedBusinessId,
  });

  return {
    avenant,
    error: null,
  };
}

export async function getAvenantsByContratIdFeed(contractId: number): Promise<{
  contrat: PublicContrat | null | undefined;
  items: PublicAvenant[];
  count: number;
}> {
  const contrat =
  (await getContratById(contractId)) ??
  (await getContratByBusinessId(contractId));

  if (!contrat) {
    return {
      contrat: null,
      items: [] as Awaited<ReturnType<typeof listAvenantsByContratBusinessId>>,
      count: 0,
    };
  }

  const businessContractId = contrat.ID_Contrat ?? contractId;
  const avenants = await listAvenantsByContratBusinessId(businessContractId);

  return {
    contrat: toPublicContract(contrat),
    items: avenants,
    count: avenants.length,
  };
}
