import type {
  PublicAbsence,
  PublicContrat,
  PublicSanction,
} from "@/types/public-api";

type EntityWithOptionalId = Record<string, unknown> & {
  id?: unknown;
};

type ContractEntity = EntityWithOptionalId & {
  ID_Contrat?: unknown;
  Id_Salarie?: unknown;
};

type AbsenceEntity = EntityWithOptionalId & {
  num_salarie?: unknown;
};

type SanctionEntity = EntityWithOptionalId & {
  num_salarie?: unknown;
};

function toNullableNumber(value: unknown): number | null {
  if (typeof value === "number" && Number.isFinite(value)) {
    return value;
  }

  if (typeof value === "string" && value.trim() !== "") {
    const parsed = Number(value);

    return Number.isFinite(parsed) ? parsed : null;
  }

  return null;
}

export function omitInternalId<T extends EntityWithOptionalId>(entity: T | null | undefined) {
  if (!entity) {
    return null;
  }

  const { id: _id, ...publicEntity } = entity;

  return publicEntity;
}

export function omitInternalIdList<T extends EntityWithOptionalId>(items: T[] | null | undefined) {
  if (!items) {
    return [];
  }

  return items
    .map((item) => omitInternalId(item))
    .filter((item): item is T => item !== null);
}

export function toPublicContract<T extends ContractEntity>(entity: T | null | undefined): PublicContrat | null {
  if (!entity) {
    return null;
  }

  const { id, ID_Contrat, Id_Salarie, ...rest } = entity;

return {
  ...rest,
  id: typeof id === "number" ? id : Number(id),
  id_contrat: toNullableNumber(ID_Contrat),
  id_salarie: toNullableNumber(Id_Salarie),
};
}

export function toPublicContractList<T extends ContractEntity>(items: T[] | null | undefined) {
  if (!items) {
    return [];
  }

  return items
    .map((item) => toPublicContract(item))
    .filter((item): item is PublicContrat => item !== null);
}

export function toPublicAbsence<T extends AbsenceEntity>(entity: T | null | undefined): PublicAbsence | null {
  if (!entity) {
    return null;
  }

  const { id: _id, num_salarie, ...rest } = entity;

  return {
    ...rest,
    id_salarie: toNullableNumber(num_salarie),
  };
}

export function toPublicAbsenceList<T extends AbsenceEntity>(items: T[] | null | undefined) {
  if (!items) {
    return [];
  }

  return items
    .map((item) => toPublicAbsence(item))
    .filter((item): item is PublicAbsence => item !== null);
}

export function toPublicSanction<T extends SanctionEntity>(entity: T | null | undefined): PublicSanction | null {
  if (!entity) {
    return null;
  }

  const { id: _id, num_salarie, ...rest } = entity;
  const idSalarie = toNullableNumber(num_salarie);

  return {
    ...rest,
    id_salarie: idSalarie,
  };
}

export function toPublicSanctionList<T extends SanctionEntity>(items: T[] | null | undefined) {
  if (!items) {
    return [];
  }

  return items
    .map((item) => toPublicSanction(item))
    .filter((item): item is PublicSanction => item !== null);
}
