import { ExecArgs } from "@medusajs/framework/types";
import { ContainerRegistrationKeys } from "@medusajs/framework/utils";

export default async function listShippingOptions({ container }: ExecArgs) {
  const logger = container.resolve(ContainerRegistrationKeys.LOGGER);
  const query = container.resolve(ContainerRegistrationKeys.QUERY);

  const { data } = await query.graph({
    entity: "shipping_option",
    fields: [
      "id",
      "name",
      "service_zone_id",
      "type.code",
      "type.label",
      "prices.amount",
      "prices.currency_code",
      "prices.region_id",
    ],
  });

  if (!data?.length) {
    logger.info("No shipping options found.");
    return;
  }

  for (const option of data as Array<Record<string, unknown>>) {
    const prices = ((option.prices as Array<Record<string, unknown>> | undefined) || [])
      .map((price) => {
        const currency = String(price.currency_code || "");
        const regionId = String(price.region_id || "");
        const amount = String(price.amount || "");
        return `${currency || `region:${regionId}`}=${amount}`;
      })
      .join(", ");

    logger.info(
      `shipping_option id=${String(option.id || "")} name=${String(
        option.name || ""
      )} code=${String(
        (option.type as { code?: string } | undefined)?.code || ""
      )} label=${String(
        (option.type as { label?: string } | undefined)?.label || ""
      )} prices=[${prices}]`
    );
  }
}
