type TicketEmailInput = {
  orderId: number;
  attendeeName: string;
  attendeeEmail: string;
  eventTitle: string;
  eventStartsAt: Date;
  eventLocation: string;
  ticketType: string;
  quantity: number;
  qrTokens: string[];
};

export function getEmailJsConfig() {
  return {
    serviceId: process.env.VITE_EMAILJS_SERVICE_ID,
    templateId: process.env.VITE_EMAILJS_TEMPLATE_ID,
    publicKey: process.env.VITE_EMAILJS_PUBLIC_KEY,
    privateKey: process.env.EMAILJS_PRIVATE_KEY,
  };
}

export function buildTicketEmailParams(input: TicketEmailInput) {
  return {
    to_email: input.attendeeEmail,
    toEmail: input.attendeeEmail,
    email: input.attendeeEmail,
    user_email: input.attendeeEmail,
    recipient: input.attendeeEmail,
    recipients: input.attendeeEmail,
    to: input.attendeeEmail,
    to_name: input.attendeeName,
    event_title: input.eventTitle,
    event_date: input.eventStartsAt.toLocaleString([], { dateStyle: "full", timeStyle: "short" }),
    event_location: input.eventLocation,
    ticket_type: input.ticketType,
    quantity: String(input.quantity),
    order_id: String(input.orderId),
    ticket_codes: input.qrTokens.join(", "),
    ticket_code: input.qrTokens[0] ?? "",
  };
}

export async function sendTicketEmail(input: TicketEmailInput): Promise<boolean> {
  const { serviceId, templateId, publicKey, privateKey } = getEmailJsConfig();
  if (!serviceId || !templateId || !publicKey || !privateKey) {
    console.warn("[EmailJS] Ticket email skipped because EmailJS is not configured");
    return false;
  }

  try {
    const response = await fetch("https://api.emailjs.com/api/v1.0/email/send", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      signal: AbortSignal.timeout(10_000),
      body: JSON.stringify({
        service_id: serviceId,
        template_id: templateId,
        user_id: publicKey,
        accessToken: privateKey,
        template_params: buildTicketEmailParams(input),
      }),
    });

    if (!response.ok) {
      const detail = await response.text().catch(() => "");
      throw new Error(`EmailJS returned ${response.status}${detail ? `: ${detail}` : ""}`);
    }

    return true;
  } catch (error) {
    console.error("[EmailJS] Could not send ticket email:", error);
    return false;
  }
}
