import { MedusaContainer } from "@medusajs/framework/types";
import { ContainerRegistrationKeys, Modules } from "@medusajs/framework/utils";
import { getFromAddress, getReplyToAddress, getResendClient, isResendConfigured } from "../lib/resend";
import { escapeHtml, renderEmailLayout } from "../lib/email-template";

const REVIEW_DELAY_DAYS = 7;
const REVIEW_REQUEST_SENT_KEY = "review_request_sent_at";

type OrderItem = {
  title?: string | null;
};

type OrderRecord = {
  id: string;
  email?: string | null;
  metadata?: Record<string, unknown> | null;
  items?: OrderItem[];
};

function buildReviewRequestHtml(itemTitles: string[]) {
  const siteUrl = process.env.STOREFRONT_URL || "https://stylunique.fr";
  const itemsList = itemTitles.length
    ? `<ul style="margin:0 0 20px;padding-left:18px;font-size:14px;line-height:22px;">${itemTitles
        .map((title) => `<li>${escapeHtml(title)}</li>`)
        .join("")}</ul>`
    : "";

  const bodyHtml = `
    <p style="margin:0 0 16px;font-size:15px;">Bonjour,</p>
    <p style="margin:0 0 16px;font-size:15px;line-height:22px;">
      Nous espérons que votre commande vous a fait plaisir ! Vous avez commandé :
    </p>
    ${itemsList}
    <p style="margin:0 0 20px;font-size:15px;line-height:22px;">
      Votre avis compte beaucoup pour nous et pour les autres clients. Auriez-vous une minute pour le partager ?
    </p>
    <a href="${siteUrl}/boutique" style="display:inline-block;background:#7B7168;color:#ffffff;text-decoration:none;padding:12px 22px;border-radius:10px;font-size:14px;font-weight:600;">
      Laisser un avis
    </a>
  `;

  return renderEmailLayout({
    title: "Que pensez-vous de votre commande ?",
    preheader: "Partagez votre avis sur votre commande Styl'Unique.",
    bodyHtml,
  });
}

export default async function reviewRequestEmailsJob(container: MedusaContainer) {
  const logger = container.resolve(ContainerRegistrationKeys.LOGGER);

  if (!isResendConfigured()) {
    return;
  }

  const query = container.resolve(ContainerRegistrationKeys.QUERY);
  const orderModuleService = container.resolve(Modules.ORDER);

  const windowEnd = new Date(Date.now() - REVIEW_DELAY_DAYS * 24 * 60 * 60 * 1000);
  const windowStart = new Date(windowEnd.getTime() - 24 * 60 * 60 * 1000);

  const response = await query.graph({
    entity: "order",
    fields: ["id", "email", "metadata", "items.title", "created_at"],
    filters: {
      created_at: {
        $gte: windowStart.toISOString(),
        $lte: windowEnd.toISOString(),
      },
    },
  });

  const orders = (response.data || []) as OrderRecord[];
  const pending = orders.filter((order) => order.email && !order.metadata?.[REVIEW_REQUEST_SENT_KEY]);

  if (pending.length === 0) {
    return;
  }

  logger.info(`[review-request-emails] sending ${pending.length} review request email(s).`);

  for (const order of pending) {
    try {
      const itemTitles = (order.items || [])
        .map((item) => item.title?.trim())
        .filter((title): title is string => Boolean(title));

      await getResendClient().emails.send({
        from: getFromAddress(),
        to: order.email as string,
        replyTo: getReplyToAddress(),
        subject: "Votre avis nous intéresse !",
        html: buildReviewRequestHtml(itemTitles),
      });

      await orderModuleService.updateOrders(order.id, {
        metadata: { ...(order.metadata || {}), [REVIEW_REQUEST_SENT_KEY]: new Date().toISOString() },
      });
    } catch (error: any) {
      logger.error(`[review-request-emails] order ${order.id}: failed - ${error?.message || "unknown error"}`);
    }
  }
}

export const config = {
  name: "review-request-emails",
  schedule: "0 9 * * *",
};
