import { existsSync } from "node:fs";
import { resolve } from "node:path";
import { config as loadEnv } from "dotenv";
import { z } from "zod";

const candidatePaths = [
  resolve(process.cwd(), ".env"),
  resolve(process.cwd(), "../../.env"),
];

for (const path of candidatePaths) {
  if (existsSync(path)) {
    loadEnv({ path });
    break;
  }
}

const envSchema = z.object({
  DATABASE_URL: z.string().min(1),
  PORT: z.coerce.number().default(3333),
  HOST: z.string().default("0.0.0.0"),
  FRONTEND_URL: z.string().url().default("http://localhost:5173"),
  API_BODY_LIMIT_MB: z.coerce.number().int().positive().default(1024),
  API_MULTIPART_FILE_LIMIT_MB: z.coerce.number().int().positive().default(150),
  API_MULTIPART_FILE_COUNT_LIMIT: z.coerce.number().int().positive().default(1000),
  API_MULTIPART_PARTS_LIMIT: z.coerce.number().int().positive().default(1200),
  JWT_SECRET: z.string().min(32),
  ENCRYPTION_KEY_HEX: z.string().regex(/^[0-9a-fA-F]{64}$/),
  COOKIE_NAME: z.string().min(1).default("neurav2_session"),
  COOKIE_SECURE: z
    .string()
    .optional()
    .transform((value) => value === "true"),
  IMAGEKIT_PRIVATE_KEY: z.string().optional().default(""),
  IMAGEKIT_PUBLIC_KEY: z.string().optional().default(""),
  IMAGEKIT_UPLOAD_ENDPOINT: z
    .string()
    .url()
    .optional()
    .default("https://upload.imagekit.io/api/v1/files/upload"),
  IMAGEKIT_URL_ENDPOINT: z.string().optional().default(""),
  IMAGEKIT_UPLOAD_FOLDER: z.string().optional().default("/workflow-forms"),
  NEURAHUB_DATABASE_URL: z.string().optional().default(""),
  NEURAHUB_ENV_FILE: z.string().optional().default(""),
  KOMMO_RETURN_URL_TIMEOUT_MS: z.coerce.number().int().positive().default(8000),
  KOMMO_RETURN_URL_MAX_ATTEMPTS: z.coerce.number().int().positive().default(5),
  KOMMO_RETURN_URL_IMMEDIATE_ATTEMPTS: z.coerce.number().int().positive().default(2),
  KOMMO_DEFAULT_CASE_TYPE_CODE: z.string().optional().default("kommo_lead"),
  KOMMO_DEFAULT_CASE_SUBTYPE_CODE: z.string().optional().default(""),
  KOMMO_DEFAULT_CASE_STATUS_CODE: z.string().optional().default("intake"),
  KOMMO_DEFAULT_CASE_PRIORITY_CODE: z.string().optional().default("normal"),
});

export const env = envSchema.parse(process.env);
