import { randomBytes } from "node:crypto";
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import type { AppConfig, MailboxConfig } from "../src/config.js";
import { hashPassword } from "../src/security/password.js";

export async function makeTestConfig(): Promise<{ config: AppConfig; cleanup: () => Promise<void> }> {
  const stateDir = await fs.mkdtemp(path.join(os.tmpdir(), "cpanel-mail-mcp-test-"));
  const mailbox: MailboxConfig = {
    id: "test-mailbox",
    label: "Test Mailbox",
    address: "mail@example.test",
    aliases: [],
    imap: {
      host: "mail.example.test",
      port: 993,
      secure: true,
      user: "mail@example.test",
      passwordEnv: "TEST_MAIL_PASSWORD",
    },
    smtp: {
      host: "mail.example.test",
      port: 465,
      secure: true,
      user: "mail@example.test",
      passwordEnv: "TEST_MAIL_PASSWORD",
    },
    folders: { sent: "Sent", drafts: "Drafts" },
    imapPassword: "not-a-real-password",
    smtpPassword: "not-a-real-password",
  };

  const config: AppConfig = {
    nodeEnv: "test",
    host: "127.0.0.1",
    port: 3000,
    baseUrl: new URL("http://localhost:39999/"),
    mcpUrl: new URL("http://localhost:39999/mcp"),
    mailboxesPath: path.join(stateDir, "mailboxes.json"),
    stateDir,
    profile: { id: "prf_test", name: "Test User", email: "test@example.test" },
    adminPasswordHash: await hashPassword("correct horse battery staple"),
    tokenSecret: new Uint8Array(randomBytes(48)),
    oauth: {
      allowDynamicRegistration: true,
      allowedRedirectHosts: ["chatgpt.com", "openai.com"],
    },
    features: { drafts: true, send: false },
    limits: {
      maxSearchResults: 50,
      maxMessageBytes: 8 * 1024 * 1024,
      maxAttachmentBytes: 8 * 1024 * 1024,
      maxBodyChars: 100_000,
      preparedEmailTtlSeconds: 900,
      accessTokenTtlSeconds: 3_600,
      refreshTokenTtlSeconds: 30 * 86_400,
    },
    mailboxes: [mailbox],
  };

  return {
    config,
    cleanup: () => fs.rm(stateDir, { recursive: true, force: true }),
  };
}
