import { URL } from "../types";

export const NOTIFICATION_PROVIDERS = ["webhook", "gotify", "ntfy"] as const;

export type NotificationProvider = (typeof NOTIFICATION_PROVIDERS)[number];

export type NotificationConfig = {
  /* Name of the notification provider */
  name: string;
  /* URL of the notification provider */
  url: URL;
};

export interface GotifyConfig extends NotificationConfig {
  provider: "gotify";
  /* Gotify token */
  token: string;
}

export const NTFY_MSG_STYLES = ["markdown", "plain"];
export type NtfyStyle = (typeof NTFY_MSG_STYLES)[number];

export interface NtfyConfig extends NotificationConfig {
  provider: "ntfy";
  topic: string;
  token?: string;
  style?: NtfyStyle;
}

export const WEBHOOK_TEMPLATES = ["", "discord"] as const;
export const WEBHOOK_METHODS = ["POST", "GET", "PUT"] as const;
export const WEBHOOK_MIME_TYPES = [
  "application/json",
  "application/x-www-form-urlencoded",
  "text/plain",
  "text/markdown",
] as const;
export const WEBHOOK_COLOR_MODES = ["hex", "dec"] as const;

export type WebhookTemplate = (typeof WEBHOOK_TEMPLATES)[number];
export type WebhookMethod = (typeof WEBHOOK_METHODS)[number];
export type WebhookMimeType = (typeof WEBHOOK_MIME_TYPES)[number];
export type WebhookColorMode = (typeof WEBHOOK_COLOR_MODES)[number];

export interface WebhookConfig extends NotificationConfig {
  provider: "webhook";
  /**
   * Webhook template
   *
   * @default "discord"
   */
  template?: WebhookTemplate;
  /* Webhook token */
  token?: string;
  /**
   * Webhook message (usally JSON),
   * required when template is not defined
   */
  payload?: string;
  /**
   * Webhook method
   *
   * @default "POST"
   */
  method?: WebhookMethod;
  /**
   * Webhook mime type
   *
   * @default "application/json"
   */
  mime_type?: WebhookMimeType;
  /**
   * Webhook color mode
   *
   * @default "hex"
   */
  color_mode?: WebhookColorMode;
}
