import { ARCAEmail, ARCAResponse, ARCAResult, ARCATelephone } from "../types";

const DEFAULT_STRING = "";

const normalizeString = (value: unknown): string => {
  return typeof value === "string" ? value : DEFAULT_STRING;
};

const adaptEmail = (email: unknown): ARCAEmail | null => {
  if (!email || typeof email !== "object") {
    return null;
  }

  const item = email as Record<string, unknown>;

  const direccion = normalizeString(item.direccion);

  // Si considerás que un email sin dirección no sirve
  if (!direccion) {
    return null;
  }

  return {
    direccion,
    estado: normalizeString(item.estado),
    tipoEmail: normalizeString(item.tipoEmail),
  };
};

const adaptTelephone = (telephone: unknown): ARCATelephone | null => {
  if (!telephone || typeof telephone !== "object") {
    return null;
  }

  const item = telephone as Record<string, unknown>;

  const numero = normalizeString(item.numero);

  if (!numero) {
    return null;
  }

  return {
    numero,
    tipoLinea: normalizeString(item.tipoLinea),
    tipoTelefono: normalizeString(item.tipoTelefono),
  };
};

const adaptResult = (result: unknown): ARCAResult => {
  if (!result || typeof result !== "object") {
    throw new Error("ARCA result inválido");
  }

  const data = result as Record<string, unknown>;

  const emails = Array.isArray(data.emails)
    ? data.emails
        .map(adaptEmail)
        .filter((email): email is ARCAEmail => email !== null)
    : [];

  const telefonos = Array.isArray(data.telefonos)
    ? data.telefonos
        .map(adaptTelephone)
        .filter((phone): phone is ARCATelephone => phone !== null)
    : [];

  return {
    cuit: normalizeString(data.cuit),
    apellido: normalizeString(data.apellido),
    nombre: normalizeString(data.nombre),
    emails,
    telefonos,
  };
};

export const adaptARCAResponse = (response: unknown): ARCAResponse => {
  if (!response || typeof response !== "object") {
    throw new Error("Respuesta ARCA inválida");
  }

  const data = response as Record<string, unknown>;

  return {
    result: adaptResult(data.result),

    time: typeof data.time === "number" ? data.time : 0,

    url: normalizeString(data.url),
    status: normalizeString(data.status),

    statusCode: typeof data.statusCode === "number" ? data.statusCode : 0,
  };
};
