import { sdk } from "@/lib/auth";

export type SavedAddress = {
  id: string;
  first_name?: string | null;
  last_name?: string | null;
  phone?: string | null;
  company?: string | null;
  address_1?: string | null;
  address_2?: string | null;
  city?: string | null;
  province?: string | null;
  postal_code?: string | null;
  country_code?: string | null;
  address_name?: string | null;
  is_default_shipping?: boolean | null;
  is_default_billing?: boolean | null;
  metadata?: Record<string, unknown> | null;
};

export type AddressInput = {
  firstName: string;
  lastName: string;
  phone: string;
  address: string;
  address2?: string;
  city: string;
  province: string;
  postalCode?: string;
  addressName?: string;
  notes?: string;
  isDefaultShipping?: boolean;
};

export function formatAddressLabel(addr: SavedAddress) {
  const name = [addr.first_name, addr.last_name].filter(Boolean).join(" ");
  const line = [addr.address_1, addr.city, addr.province].filter(Boolean).join(" · ");
  return addr.address_name || name || line || "Dirección";
}

export function addressToForm(addr: SavedAddress) {
  return {
    name: [addr.first_name, addr.last_name].filter(Boolean).join(" "),
    phone: addr.phone || "",
    address: addr.address_1 || "",
    address2: addr.address_2 || "",
    city: addr.city || "",
    province: addr.province || "",
    postalCode: addr.postal_code || "",
    notes: String(addr.metadata?.delivery_notes || ""),
  };
}

export async function listCustomerAddresses(): Promise<SavedAddress[]> {
  const { addresses } = await sdk.store.customer.listAddress({ limit: 50 });
  return (addresses || []) as SavedAddress[];
}

export async function createCustomerAddress(input: AddressInput) {
  const { customer } = await sdk.store.customer.createAddress({
    first_name: input.firstName,
    last_name: input.lastName,
    phone: input.phone,
    address_1: input.address,
    address_2: input.address2 || "",
    city: input.city,
    province: input.province,
    postal_code: input.postalCode || "000000",
    country_code: "co",
    address_name: input.addressName || "Envío",
    is_default_shipping: Boolean(input.isDefaultShipping),
    is_default_billing: Boolean(input.isDefaultShipping),
    metadata: {
      delivery_notes: input.notes || "",
    },
  });
  return customer;
}

export async function updateCustomerAddress(id: string, input: AddressInput) {
  const { customer } = await sdk.store.customer.updateAddress(id, {
    first_name: input.firstName,
    last_name: input.lastName,
    phone: input.phone,
    address_1: input.address,
    address_2: input.address2 || "",
    city: input.city,
    province: input.province,
    postal_code: input.postalCode || "000000",
    country_code: "co",
    address_name: input.addressName || "Envío",
    is_default_shipping: Boolean(input.isDefaultShipping),
    is_default_billing: Boolean(input.isDefaultShipping),
    metadata: {
      delivery_notes: input.notes || "",
    },
  });
  return customer;
}

export async function setDefaultShippingAddress(id: string) {
  const { customer } = await sdk.store.customer.updateAddress(id, {
    is_default_shipping: true,
    is_default_billing: true,
  });
  return customer;
}

export async function deleteCustomerAddress(id: string) {
  return sdk.store.customer.deleteAddress(id);
}

export function pickDefaultAddress(addresses: SavedAddress[]) {
  return (
    addresses.find((a) => a.is_default_shipping) ||
    addresses[0] ||
    null
  );
}
