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

type ProductSyncMetadata = {
  sanity_document_id?: string
  sanity_revision?: string | null
  sanity_sync_status?: "pending" | "success" | "failed"
  sanity_sync_error?: string | null
  sanity_synced_at?: string | null
  sanity_synced_variant_count?: number
  sanity_synced_variants?: Array<{title?: string; amount?: number; currency_code?: string}>
}

export async function GET(req: MedusaRequest, res: MedusaResponse) {
  res.setHeader("Access-Control-Allow-Origin", "*")
  res.setHeader("Cache-Control", "no-store")

  const documentId = String(req.query.documentId || "").trim()
  const revision = String(req.query.revision || "").trim()

  if (!documentId || !revision) {
    return res.status(400).json({message: "documentId and revision are required."})
  }

  const query = req.scope.resolve(ContainerRegistrationKeys.QUERY) as any
  const {data} = await query.graph({
    entity: "product",
    fields: ["id", "handle", "metadata"],
    pagination: {take: 1000},
  })
  const product = (data || []).find((item: {metadata?: ProductSyncMetadata}) => item.metadata?.sanity_document_id === documentId)
  const metadata = (product?.metadata || {}) as ProductSyncMetadata

  if (!product || metadata.sanity_revision !== revision) {
    return res.status(202).json({status: "waiting", revision})
  }

  return res.status(metadata.sanity_sync_status === "failed" ? 409 : metadata.sanity_sync_status === "success" ? 200 : 202).json({
    status: metadata.sanity_sync_status || "pending",
    revision,
    handle: product.handle,
    syncedAt: metadata.sanity_synced_at || null,
    variantCount: metadata.sanity_synced_variant_count || 0,
    variants: metadata.sanity_synced_variants || [],
    error: metadata.sanity_sync_error || null,
  })
}
