import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
import { ContainerRegistrationKeys } from "@medusajs/framework/utils";

interface MerchantProduct {
  id: string;
  title: string;
  description: string;
  link: string;
  image_link: string;
  price: string;
  availability: "in stock" | "out of stock";
  brand: string;
  condition: string;
  shipping_weight?: string;
}

function escapeCSVField(field: string): string {
  if (!field) return "";
  if (field.includes(",") || field.includes('"') || field.includes("\n")) {
    return `"${field.replace(/"/g, '""')}"`;
  }
  return field;
}

function toCSVRow(product: MerchantProduct): string {
  return [
    escapeCSVField(product.id),
    escapeCSVField(product.title),
    escapeCSVField(product.description),
    escapeCSVField(product.link),
    escapeCSVField(product.image_link),
    escapeCSVField(product.price),
    escapeCSVField(product.availability),
    escapeCSVField(product.brand),
    escapeCSVField(product.condition),
    escapeCSVField(product.shipping_weight || ""),
  ].join(",");
}

async function getAllMedusaProducts(container: any): Promise<any[]> {
  try {
    const query = container.resolve(ContainerRegistrationKeys.QUERY);
    const products: any[] = [];
    let skip = 0;
    const take = 100;

    while (true) {
      const { data } = await query.graph({
        entity: "product",
        fields: ["id", "title", "handle", "description", "images.url", "variants.calculated_price.calculated_amount"],
        filters: {
          status: "published",
        },
        pagination: { take, skip },
      });

      if (!data || data.length === 0) {
        break;
      }

      products.push(...data);
      skip += take;

      if (products.length > 10000) {
        break;
      }
    }

    return products;
  } catch (error) {
    console.error("[google-merchant-feed] Error fetching Medusa products:", error);
    return [];
  }
}

function convertToMerchantProduct(medusaProduct: any, siteUrl: string): MerchantProduct | null {
  try {
    const handle = medusaProduct.handle || "";
    if (!handle) return null;

    const price = medusaProduct.variants?.[0]?.calculated_price?.calculated_amount || 0;
    const priceEUR = `${(price / 100).toFixed(2)} EUR`;

    const description = (medusaProduct.description || "")
      .replace(/\n/g, " ")
      .trim()
      .substring(0, 5000) || "Produit personnalisé Stylunique";

    const imageUrl = medusaProduct.images?.[0]?.url || "";

    const availability: "in stock" | "out of stock" =
      medusaProduct.variants && medusaProduct.variants.length > 0 ? "in stock" : "out of stock";

    return {
      id: medusaProduct.id,
      title: medusaProduct.title?.substring(0, 150) || "",
      description,
      link: `${siteUrl}/produits/${handle}`,
      image_link: imageUrl,
      price: priceEUR,
      availability,
      brand: "Stylunique",
      condition: "new",
      shipping_weight: "0.5 kg",
    };
  } catch (error) {
    console.warn(`[google-merchant-feed] Error converting product (${medusaProduct.id}):`, error);
    return null;
  }
}

export async function GET(req: MedusaRequest, res: MedusaResponse) {
  try {
    const siteUrl = process.env.STOREFRONT_URL || "https://stylunique.fr";

    const products = await getAllMedusaProducts(req.scope);

    const merchantProducts: MerchantProduct[] = [];
    for (const product of products) {
      const converted = convertToMerchantProduct(product, siteUrl);
      if (converted) {
        merchantProducts.push(converted);
      }
    }

    if (merchantProducts.length === 0) {
      const csv = "id,title,description,link,image_link,price,availability,brand,condition,shipping_weight";
      return res
        .header("Content-Type", "text/csv; charset=utf-8")
        .header("Content-Disposition", 'attachment; filename="stylunique-products.csv"')
        .header("Cache-Control", "public, max-age=300, s-maxage=3600")
        .status(200)
        .send(csv);
    }

    const csvRows = [
      "id,title,description,link,image_link,price,availability,brand,condition,shipping_weight",
      ...merchantProducts.map(toCSVRow),
    ];
    const csv = csvRows.join("\n");

    return res
      .header("Content-Type", "text/csv; charset=utf-8")
      .header("Content-Disposition", 'attachment; filename="stylunique-products.csv"')
      .header("Cache-Control", "public, max-age=300, s-maxage=3600")
      .status(200)
      .send(csv);
  } catch (error) {
    console.error("[google-merchant-feed] Error generating feed:", error);
    return res.status(500).json({ error: "Failed to generate merchant feed" });
  }
}
