export type WebhookTemplateVariable = {
  token: string
  label: string
  description: string
  example?: string
}

import type { AutomationDomain } from './domains'

export type WebhookTemplateVariableGroup = {
  id: string
  label: string
  description: string
  domain: AutomationDomain | 'universal'
  variables: WebhookTemplateVariable[]
}

/** Variables interpolées côté backend (`internal/mail/webhooks/executor.go`). */
export const WEBHOOK_TEMPLATE_VARIABLE_GROUPS: WebhookTemplateVariableGroup[] = [
  {
    id: "event",
    label: "Événement",
    description: "Métadonnées communes à tout type d'automatisation.",
    domain: "universal",
    variables: [
      {
        token: "$event.type",
        label: "Type",
        description: "Type d'événement déclencheur (ex. message_received, drive_file_created).",
        example: "drive_file_created",
      },
      {
        token: "$event.domain",
        label: "Domaine",
        description: "Domaine source : mail, drive, contacts ou agenda.",
        example: "drive",
      },
      {
        token: "$date",
        label: "Date",
        description: "Horodatage ISO 8601 de l'événement.",
        example: "2026-05-22T10:00:00Z",
      },
    ],
  },
  {
    id: "sender",
    label: "Expéditeur",
    description: "Identité de l'expéditeur du message déclencheur.",
    domain: "mail",
    variables: [
      {
        token: "$sender.name",
        label: "Nom",
        description: "Nom affiché de l'expéditeur.",
        example: "Alice Example",
      },
      {
        token: "$sender.email",
        label: "E-mail",
        description: "Adresse e-mail de l'expéditeur.",
        example: "alice@example.com",
      },
    ],
  },
  {
    id: "message",
    label: "Message",
    description: "Métadonnées principales du mail.",
    domain: "mail",
    variables: [
      {
        token: "$subject",
        label: "Objet",
        description: "Objet du message.",
        example: "Hello World",
      },
      {
        token: "$message_id",
        label: "Identifiant",
        description: "Identifiant interne Ultimail du message.",
        example: "msg-123",
      },
    ],
  },
  {
    id: "body",
    label: "Contenu",
    description: "Corps du message, en texte ou HTML.",
    domain: "mail",
    variables: [
      {
        token: "$body.textContent",
        label: "Texte brut",
        description: "Corps du message sans mise en forme.",
        example: "Plain body",
      },
      {
        token: "$body.htmlContent",
        label: "HTML",
        description: "Corps du message avec balises HTML.",
        example: "<p>HTML body</p>",
      },
    ],
  },
  {
    id: "recipients",
    label: "Destinataires",
    description: "Adresses en copie directe (To).",
    domain: "mail",
    variables: [
      {
        token: "$recipients.to",
        label: "To",
        description: "Liste des destinataires, séparés par des virgules.",
        example: "bob@example.com, carol@example.com",
      },
    ],
  },
  {
    id: "drive",
    label: "Fichier Drive",
    description: "Métadonnées du fichier ou dossier déclencheur.",
    domain: "drive",
    variables: [
      {
        token: "$drive.file_name",
        label: "Nom",
        description: "Nom du fichier ou dossier.",
        example: "rapport.pdf",
      },
      {
        token: "$drive.file_path",
        label: "Chemin",
        description: "Chemin complet dans le Drive.",
        example: "/Documents/rapport.pdf",
      },
      {
        token: "$drive.mime_type",
        label: "Type MIME",
        description: "Type MIME du fichier.",
        example: "application/pdf",
      },
      {
        token: "$drive.file_size",
        label: "Taille",
        description: "Taille en octets.",
        example: "102400",
      },
      {
        token: "$drive.is_folder",
        label: "Dossier",
        description: "true si l'élément est un dossier.",
        example: "false",
      },
    ],
  },
  {
    id: "contact",
    label: "Contact",
    description: "Métadonnées du contact déclencheur.",
    domain: "contacts",
    variables: [
      {
        token: "$contact.name",
        label: "Nom",
        description: "Nom affiché du contact.",
        example: "Alice Example",
      },
      {
        token: "$contact.email",
        label: "E-mail",
        description: "Adresse e-mail principale.",
        example: "alice@example.com",
      },
      {
        token: "$contact.phone",
        label: "Téléphone",
        description: "Numéro de téléphone principal.",
        example: "+33 6 00 00 00 00",
      },
      {
        token: "$contact.org",
        label: "Organisation",
        description: "Entreprise ou organisation.",
        example: "Example Corp",
      },
      {
        token: "$contact.id",
        label: "Identifiant",
        description: "Identifiant interne du contact.",
        example: "contact-42",
      },
    ],
  },
  {
    id: "calendar",
    label: "Événement agenda",
    description: "Métadonnées de l'événement déclencheur.",
    domain: "agenda",
    variables: [
      {
        token: "$calendar.event_title",
        label: "Titre",
        description: "Titre ou objet de l'événement.",
        example: "Réunion équipe",
      },
      {
        token: "$calendar.event_location",
        label: "Lieu",
        description: "Lieu ou salle de l'événement.",
        example: "Salle A",
      },
      {
        token: "$calendar.event_organizer",
        label: "Organisateur",
        description: "Adresse e-mail de l'organisateur.",
        example: "alice@example.com",
      },
      {
        token: "$calendar.event_start",
        label: "Début",
        description: "Date/heure de début (ISO 8601).",
        example: "2026-06-15T10:00:00Z",
      },
      {
        token: "$calendar.event_end",
        label: "Fin",
        description: "Date/heure de fin (ISO 8601).",
        example: "2026-06-15T11:00:00Z",
      },
      {
        token: "$calendar.event_all_day",
        label: "Journée entière",
        description: "true si l'événement dure toute la journée.",
        example: "false",
      },
      {
        token: "$calendar.calendar_id",
        label: "Agenda",
        description: "Identifiant de l'agenda source.",
        example: "work",
      },
      {
        token: "$calendar.event_uid",
        label: "Identifiant",
        description: "UID CalDAV de l'événement.",
        example: "team-sync-2026-06-15",
      },
      {
        token: "$calendar.meet_url",
        label: "Lien visio",
        description: "URL de visioconférence associée, le cas échéant.",
        example: "https://meet.example.com/abc-def",
      },
    ],
  },
]

export const WEBHOOK_TEMPLATE_VARIABLES = WEBHOOK_TEMPLATE_VARIABLE_GROUPS.flatMap(
  (group) => group.variables
)

export function webhookVariableGroupsForDomains(
  domains: AutomationDomain[],
  includeUniversal = true
): WebhookTemplateVariableGroup[] {
  const allowed = new Set<AutomationDomain | 'universal'>(domains)
  if (includeUniversal) allowed.add('universal')
  return WEBHOOK_TEMPLATE_VARIABLE_GROUPS.filter((g) => allowed.has(g.domain))
}

export const WEBHOOK_DEFAULT_TEMPLATES: Record<AutomationDomain, string> = {
  mail: '{"text":"Nouveau mail de $sender.name : $subject"}',
  drive: '{"text":"Fichier Drive $drive.file_name ajouté dans $drive.file_path"}',
  contacts: '{"text":"Contact $contact.name ($contact.email) mis à jour"}',
  agenda: '{"text":"Événement $calendar.event_title le $calendar.event_start"}',
}
