import { HttpTypes } from "@medusajs/types";
import { env } from "@/lib/env";

const LOCAL_PICKUP_HINTS = ["retrait", "sur place", "pickup", "click and collect", "collecte"];

function asRecord(value: unknown): Record<string, unknown> | null {
  if (!value || typeof value !== "object") {
    return null;
  }

  return value as Record<string, unknown>;
}

function asString(value: unknown) {
  return typeof value === "string" ? value.trim() : "";
}

function parseConfiguredOptionIds() {
  return new Set(
    env.localPickupShippingOptionIds
      .split(",")
      .map((value) => value.trim())
      .filter(Boolean),
  );
}

function methodMatchesLocalPickup(method: unknown) {
  const configuredOptionIds = parseConfiguredOptionIds();
  const methodRecord = asRecord(method);
  if (!methodRecord) {
    return false;
  }

  const optionId = asString(methodRecord.shipping_option_id);
  if (optionId && configuredOptionIds.has(optionId)) {
    return true;
  }

  const shippingOptionRecord = asRecord(methodRecord.shipping_option);
  const shippingOptionData = asRecord(shippingOptionRecord?.data);
  const labels = [
    asString(methodRecord.name),
    asString(shippingOptionRecord?.name),
    asString(shippingOptionRecord?.service_zone_name),
    asString(shippingOptionData?.provider_id),
  ]
    .map((value) => value.toLowerCase())
    .filter(Boolean);

  return labels.some((value) => LOCAL_PICKUP_HINTS.some((hint) => value.includes(hint)));
}

export function isLocalPickupShippingOption(option: { id?: string; name?: string | null; data?: Record<string, unknown> | null } | undefined) {
  const configuredOptionIds = parseConfiguredOptionIds();
  const optionId = asString(option?.id);
  if (optionId && configuredOptionIds.has(optionId)) {
    return true;
  }

  const labels = [asString(option?.name), asString(option?.data?.id)]
    .map((value) => value.toLowerCase())
    .filter(Boolean);

  return labels.some((value) => LOCAL_PICKUP_HINTS.some((hint) => value.includes(hint)));
}

export function isLocalPickupShippingMethod(cart: HttpTypes.StoreCart) {
  const shippingMethods = (cart as { shipping_methods?: unknown[] }).shipping_methods;
  if (!Array.isArray(shippingMethods)) {
    return false;
  }

  return shippingMethods.some(methodMatchesLocalPickup);
}
