import { $module } from "alepha";
import { $email } from "./primitives/$email.ts";
import { EmailProvider } from "./providers/EmailProvider.ts";
import { LocalEmailProvider } from "./providers/LocalEmailProvider.ts";
import { MemoryEmailProvider } from "./providers/MemoryEmailProvider.ts";

// Exports
export * from "./errors/EmailError.ts";
export * from "./primitives/$email.ts";
export * from "./providers/EmailProvider.ts";
export * from "./providers/LocalEmailProvider.ts";
export * from "./providers/MemoryEmailProvider.ts";

// Hook declarations
declare module "alepha" {
  interface Hooks {
    "email:sending": {
      to: string | string[];
      template: string;
      variables: Record<string, unknown>;
      provider: EmailProvider;
      abort(): void;
    };
    "email:sent": {
      to: string | string[];
      template: string;
      provider: EmailProvider;
    };
  }
}

/**
 * Email delivery over pluggable providers.
 *
 * **Features:**
 * - `$email` declares a named send channel; the name is surfaced to the
 *   `email:sending` / `email:sent` hooks (as their `template` field) for
 *   auditing and interception
 * - Multiple recipients
 * - Local file provider for development
 * - Memory provider for testing
 *
 * There is **no template rendering**: `send()` takes an already-rendered
 * `subject` and `body` — bring your own templating if you need it.
 *
 * For SMTP support, use `AlephaEmailSmtp` from `alepha/email/smtp`.
 * For Brevo support, use `AlephaEmailBrevo` from `alepha/email/brevo`.
 *
 * @module alepha.email
 */
export const AlephaEmail = $module({
  name: "alepha.email",
  primitives: [$email],
  services: [EmailProvider],
  variants: [MemoryEmailProvider, LocalEmailProvider],
  register: (alepha) => {
    if (alepha.isTest()) {
      alepha.with({
        optional: true,
        provide: EmailProvider,
        use: MemoryEmailProvider,
      });
    } else {
      alepha.with({
        optional: true,
        provide: EmailProvider,
        use: LocalEmailProvider,
      });
    }
  },
});
