export type ClientAddress = {
  id: string;
  label?: string | null;
  recipient_name?: string | null;
  phone?: string | null;
  zip?: string | null;
  street?: string | null;
  number?: string | null;
  complement?: string | null;
  neighborhood?: string | null;
  city?: string | null;
  state?: string | null;
  reference?: string | null;
  is_default?: boolean | null;
  created_at?: string | null;
  updated_at?: string | null;
};

export type ClientAddressInput = {
  label?: string | null;
  recipient_name?: string | null;
  phone?: string | null;
  zip?: string | null;
  street?: string | null;
  number?: string | null;
  complement?: string | null;
  neighborhood?: string | null;
  city?: string | null;
  state?: string | null;
  reference?: string | null;
  is_default?: boolean | null;
};

function normalizeText(value: unknown) {
  return String(value || "").trim();
}

function digitsOnly(value: unknown) {
  return String(value || "").replace(/\D/g, "");
}

export function formatZipCode(value: string | null | undefined) {
  const digits = digitsOnly(value).slice(0, 8);
  if (digits.length <= 5) return digits;
  return `${digits.slice(0, 5)}-${digits.slice(5)}`;
}

export function formatPhone(value: string | null | undefined) {
  const digits = digitsOnly(value).slice(0, 11);
  if (digits.length <= 2) return digits ? `(${digits}` : "";
  if (digits.length <= 7) return `(${digits.slice(0, 2)}) ${digits.slice(2)}`;
  if (digits.length <= 10) return `(${digits.slice(0, 2)}) ${digits.slice(2, 6)}-${digits.slice(6)}`;
  return `(${digits.slice(0, 2)}) ${digits.slice(2, 7)}-${digits.slice(7)}`;
}

export function normalizeClientAddressInput(input: ClientAddressInput | null | undefined): ClientAddressInput {
  return {
    label: normalizeText(input?.label) || null,
    recipient_name: normalizeText(input?.recipient_name) || null,
    phone: digitsOnly(input?.phone).slice(0, 11) || null,
    zip: digitsOnly(input?.zip).slice(0, 8) || null,
    street: normalizeText(input?.street) || null,
    number: normalizeText(input?.number) || null,
    complement: normalizeText(input?.complement) || null,
    neighborhood: normalizeText(input?.neighborhood) || null,
    city: normalizeText(input?.city) || null,
    state: normalizeText(input?.state).slice(0, 2).toUpperCase() || null,
    reference: normalizeText(input?.reference) || null,
    is_default: Boolean(input?.is_default),
  };
}

export function isClientAddressComplete(input: ClientAddressInput | ClientAddress | null | undefined) {
  const address = normalizeClientAddressInput(input || null);
  return Boolean(
    address.zip &&
      address.street &&
      address.number &&
      address.neighborhood &&
      address.city &&
      address.state
  );
}

export function getAddressSummary(address: ClientAddressInput | ClientAddress | null | undefined) {
  if (!address) return "";
  return [
    [address.street, address.number].filter(Boolean).join(", "),
    address.complement || "",
    address.neighborhood || "",
    [address.city, address.state].filter(Boolean).join(" / "),
    address.zip ? `CEP ${formatZipCode(address.zip)}` : "",
  ]
    .filter(Boolean)
    .join(" • ");
}

export function getPreferredClientAddress(addresses: ClientAddress[] | null | undefined) {
  const list = Array.isArray(addresses) ? addresses : [];
  return list.find((address) => address.is_default) || list[0] || null;
}

export function applyPreferredAddressToClient<T extends Record<string, unknown>>(
  client: T,
  addresses: ClientAddress[] | null | undefined
): T & {
  addresses: ClientAddress[];
  address_zip: string | null;
  address_street: string | null;
  address_number: string | null;
  address_complement: string | null;
  address_neighborhood: string | null;
  address_city: string | null;
  address_state: string | null;
} {
  const preferred = getPreferredClientAddress(addresses);
  const legacy = client as T & {
    address_zip?: string | null;
    address_street?: string | null;
    address_number?: string | null;
    address_complement?: string | null;
    address_neighborhood?: string | null;
    address_city?: string | null;
    address_state?: string | null;
  };

  return {
    ...client,
    addresses: Array.isArray(addresses) ? addresses : [],
    address_zip: preferred?.zip || legacy.address_zip || null,
    address_street: preferred?.street || legacy.address_street || null,
    address_number: preferred?.number || legacy.address_number || null,
    address_complement: preferred?.complement || legacy.address_complement || null,
    address_neighborhood: preferred?.neighborhood || legacy.address_neighborhood || null,
    address_city: preferred?.city || legacy.address_city || null,
    address_state: preferred?.state || legacy.address_state || null,
  };
}

export function getAddressRecipient(address: ClientAddress | null | undefined, fallbackName?: string | null) {
  return normalizeText(address?.recipient_name) || normalizeText(fallbackName) || "Nao informado";
}
