﻿type AomWebhookPayload = {
  eventId: string;
  eventType: string;
  sourceSystem: 'AOM';
  sourceRequestId?: string;
  sourceTicketId?: string;
  aomTicketId?: string;
  aomTicketCode?: string;
  aomWorkOrderId?: string;
  aomWorkOrderCode?: string;
  aomProjectId?: string;
  aomProjectCode?: string;
  aomAssetId?: string;
  aomAssetCode?: string;
  statusBefore?: string;
  statusAfter?: string;
  status?: string;
  changedFields?: string[];
  message?: string;
  updatedAt: string;
  deepLink?: string;
};

function getWebhookUrl(): string {
  return process.env.CSM_WEBHOOK_URL || '';
}

function getWebhookToken(): string {
  return process.env.CSM_WEBHOOK_TOKEN || '';
}

function buildDeepLink(resource: string, id: string): string {
  const base = (process.env.CSM_AOM_DEEP_LINK_BASE_URL || process.env.AOM_BASE_URL || 'https://aom.vuphong.com').replace(/\/+$/, '');
  return `${base}/${resource}/${encodeURIComponent(id)}`;
}

export async function sendCsmWebhook(payload: AomWebhookPayload): Promise<void> {
  const url = getWebhookUrl();
  const token = getWebhookToken();
  if (!url || !token) return;

  const res = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${token}`,
    },
    body: JSON.stringify(payload),
  });

  if (!res.ok) {
    const text = await res.text().catch(() => '');
    throw new Error(`CSM webhook failed ${res.status}: ${text.slice(0, 300)}`);
  }
}

export function buildTicketWebhookPayload(ticket: any, oldTicket: any, changedFields: string[]): AomWebhookPayload | null {
  const sourceTicketId = ticket?.sourceTicketId || oldTicket?.sourceTicketId;
  const sourceRequestId = ticket?.sourceRequestId || oldTicket?.sourceRequestId;
  if (!sourceTicketId && !sourceRequestId && ticket?.sourceSystem !== 'CSM' && oldTicket?.sourceSystem !== 'CSM') return null;

  const id = String(ticket?._id || oldTicket?._id || '');
  return {
    eventId: `aom-ticket-${id}-${Date.now()}`,
    eventType: 'ticket.updated',
    sourceSystem: 'AOM',
    sourceRequestId: sourceRequestId ? String(sourceRequestId) : undefined,
    sourceTicketId: sourceTicketId ? String(sourceTicketId) : undefined,
    aomTicketId: id,
    aomTicketCode: ticket?.ticketCode || oldTicket?.ticketCode,
    aomProjectId: ticket?.projectId ? String(ticket.projectId?._id || ticket.projectId) : undefined,
    aomAssetId: ticket?.assetId ? String(ticket.assetId?._id || ticket.assetId) : undefined,
    statusBefore: oldTicket?.status,
    statusAfter: ticket?.status,
    status: ticket?.status,
    changedFields,
    message: `AOM ticket ${ticket?.ticketCode || id} updated`,
    updatedAt: new Date().toISOString(),
    deepLink: id ? buildDeepLink('tickets', id) : undefined,
  };
}

export function buildWorkOrderWebhookPayload(workOrder: any, oldWorkOrder: any, changedFields: string[]): AomWebhookPayload | null {
  const sourceTicketId = workOrder?.sourceTicketId || oldWorkOrder?.sourceTicketId;
  const sourceRequestId = workOrder?.sourceRequestId || oldWorkOrder?.sourceRequestId;
  if (!sourceTicketId && !sourceRequestId && workOrder?.sourceSystem !== 'CSM' && oldWorkOrder?.sourceSystem !== 'CSM') return null;

  const id = String(workOrder?._id || oldWorkOrder?._id || '');
  return {
    eventId: `aom-work-order-${id}-${Date.now()}`,
    eventType: 'work_order.updated',
    sourceSystem: 'AOM',
    sourceRequestId: sourceRequestId ? String(sourceRequestId) : undefined,
    sourceTicketId: sourceTicketId ? String(sourceTicketId) : undefined,
    aomTicketId: workOrder?.ticketId ? String(workOrder.ticketId?._id || workOrder.ticketId) : undefined,
    aomWorkOrderId: id,
    aomWorkOrderCode: workOrder?.woCode || oldWorkOrder?.woCode,
    aomProjectId: workOrder?.projectId ? String(workOrder.projectId?._id || workOrder.projectId) : undefined,
    aomAssetId: workOrder?.assetId ? String(workOrder.assetId?._id || workOrder.assetId) : undefined,
    statusBefore: oldWorkOrder?.status,
    statusAfter: workOrder?.status,
    status: workOrder?.status,
    changedFields,
    message: `AOM work order ${workOrder?.woCode || id} updated`,
    updatedAt: new Date().toISOString(),
    deepLink: id ? buildDeepLink('work-orders', id) : undefined,
  };
}

export async function sendCsmWebhookSafely(payload: AomWebhookPayload | null): Promise<void> {
  if (!payload) return;
  try {
    await sendCsmWebhook(payload);
  } catch (error: any) {
    console.error('[CSM Webhook]', error?.message || error);
  }
}
