import "dotenv/config";
import type { LlmProvider } from "@skola/shared";

export interface LlmRuntimeConfig {
  provider: LlmProvider;
  model: string;
  apiKey: string;
  temperature: number;
  maxTokens: number;
}

export interface DatabaseConfig {
  host: string;
  port: number;
  user: string;
  password: string;
  database: string;
  connectionLimit: number;
}

export interface AuthEmailConfig {
  fromEmail: string;
  adminEmail: string;
  baseUrl: string;
  smtpHost: string;
  smtpPort: number;
  smtpSecure: boolean;
  smtpUser: string;
  smtpPass: string;
}

export interface ApiConfig {
  port: number;
  corsOrigin: string[];
  llm: LlmRuntimeConfig;
  database: DatabaseConfig;
  authEmail: AuthEmailConfig;
  authSecret: string;
  crossrefMailto: string;
  openalexEmail: string;
}

function normalizeProvider(value: string | undefined): LlmProvider | undefined {
  const normalized = value?.trim().toLowerCase();
  if (normalized === "openai" || normalized === "chatgpt") return "openai";
  if (normalized === "anthropic" || normalized === "claude") return "anthropic";
  return undefined;
}

function numberFromEnv(value: string | undefined, fallback: number): number {
  const parsed = Number(value);
  return Number.isFinite(parsed) ? parsed : fallback;
}

function booleanFromEnv(value: string | undefined, fallback: boolean): boolean {
  if (value === undefined) return fallback;
  const normalized = value.trim().toLowerCase();
  if (normalized === "1" || normalized === "true" || normalized === "yes") return true;
  if (normalized === "0" || normalized === "false" || normalized === "no") return false;
  return fallback;
}

export function getConfig(): ApiConfig {
  const port = Number(process.env.API_PORT ?? "4000");
  const corsOrigin = (process.env.CORS_ORIGIN ?? "https://localhost:3000")
    .split(",")
    .map((v) => v.trim())
    .filter(Boolean);
  const openaiApiKey = process.env.OPENAI_API_KEY ?? "";
  const anthropicApiKey = process.env.ANTHROPIC_API_KEY ?? "";
  const provider =
    normalizeProvider(process.env.SKOLA_LLM_PROVIDER) ??
    (openaiApiKey ? "openai" : anthropicApiKey ? "anthropic" : "openai");
  const defaultModel = provider === "anthropic" ? "claude-haiku-4-5-20251001" : "gpt-4o-mini";
  const model = process.env.SKOLA_LLM_MODEL?.trim() || defaultModel;
  const authEmail = process.env.SKOLA_AUTH_EMAIL?.trim() || "RahoshiL@gmail.com";

  return {
    port,
    corsOrigin,
    llm: {
      provider,
      model,
      apiKey: provider === "openai" ? openaiApiKey : anthropicApiKey,
      temperature: numberFromEnv(process.env.SKOLA_LLM_TEMPERATURE, 0.2),
      maxTokens: numberFromEnv(process.env.SKOLA_LLM_MAX_TOKENS, 4096)
    },
    database: {
      host: process.env.SKOLA_DB_HOST?.trim() || "127.0.0.1",
      port: numberFromEnv(process.env.SKOLA_DB_PORT, 3306),
      user: process.env.SKOLA_DB_USER?.trim() || "root",
      password: process.env.SKOLA_DB_PASSWORD ?? "",
      database: process.env.SKOLA_DB_NAME?.trim() || "skola",
      connectionLimit: numberFromEnv(process.env.SKOLA_DB_CONNECTION_LIMIT, 10)
    },
    authEmail: {
      fromEmail: process.env.SKOLA_AUTH_FROM_EMAIL?.trim() || authEmail,
      adminEmail: process.env.SKOLA_AUTH_ADMIN_EMAIL?.trim() || authEmail,
      baseUrl: process.env.SKOLA_AUTH_BASE_URL?.trim() || `http://localhost:${port}`,
      smtpHost: process.env.SKOLA_SMTP_HOST?.trim() || "smtp.gmail.com",
      smtpPort: numberFromEnv(process.env.SKOLA_SMTP_PORT, 465),
      smtpSecure: booleanFromEnv(process.env.SKOLA_SMTP_SECURE, true),
      smtpUser: process.env.SKOLA_SMTP_USER?.trim() || authEmail,
      smtpPass: process.env.SKOLA_SMTP_PASS ?? ""
    },
    authSecret: process.env.SKOLA_AUTH_SECRET ?? "skola-dev-secret",
    crossrefMailto: process.env.CROSSREF_MAILTO ?? "",
    openalexEmail: process.env.OPENALEX_EMAIL ?? "",
  };
}
