import fs from 'node:fs';
import path from 'node:path';
import { z } from 'zod';
import dotenv from 'dotenv';

const candidates = [
  process.env.ENV_FILE,
  process.env.DOTENV_CONFIG_PATH,
  process.env.NODE_ENV ? `.env.${process.env.NODE_ENV}` : undefined,
  process.env.NODE_ENV === 'production' ? '.env.prod' : undefined,
  process.env.NODE_ENV === 'prod' ? '.env.production' : undefined,
  '.env',
].filter((p): p is string => Boolean(p));

const envPath = candidates
  .map(p => path.resolve(p))
  .find(p => fs.existsSync(p));

if (envPath) {
  dotenv.config({ path: envPath });
} else {
  dotenv.config();
}

const schema = z.object({
  PORT: z.string().transform(Number).default(3000),
  PUBLIC_URL: z.string().url(),
  API_BASE_URL: z.string().url().default('https://api.proov-it.online'),
  PROOVIT_API_URL: z.string().url().optional(),
  OAUTH_AUTH_URL: z.string().url().optional(),
  OAUTH_TOKEN_URL: z.string().url().optional(),
  OAUTH_SCOPES: z.string().optional(),
  OAUTH_CLIENT_ID: z.string().min(1),
  OAUTH_CLIENT_SECRET: z.string().optional(), 
  PROOVIT_CHECKOUT_SUCCESS_URL: z.string().url().optional(),
  PROOVIT_CHECKOUT_CANCEL_URL: z.string().url().optional(),
  PROOVIT_COMPANY_TOKEN:z.string(),
  DOMAIN_WIDGET: z.string().url().optional()
});

const env = schema.parse(process.env);

const normalizeBaseUrl = (value: string) => value.replace(/\/$/, '');
const getOrigin = (value?: string) => {
  if (!value) return undefined;
  try {
    return new URL(value).origin;
  } catch {
    return undefined;
  }
};

const authOrigin =
  getOrigin(env.OAUTH_AUTH_URL) ||
  getOrigin(env.OAUTH_TOKEN_URL) ||
  normalizeBaseUrl(env.API_BASE_URL);

const authScopes = env.OAUTH_SCOPES
  ? env.OAUTH_SCOPES.split(/[ ,]+/).map(s => s.trim()).filter(Boolean)
  : undefined;

export const config = {
  port: env.PORT,
  publicUrl: normalizeBaseUrl(env.PUBLIC_URL),
  widgetDomain: normalizeBaseUrl(env.DOMAIN_WIDGET || env.PUBLIC_URL),
  proovit: {
    companyToken: env.PROOVIT_COMPANY_TOKEN,
    authUrl: authOrigin,
    apiUrl: normalizeBaseUrl(env.PROOVIT_API_URL || env.API_BASE_URL),
    clientId: env.OAUTH_CLIENT_ID,
    jwksUri: `${authOrigin}/oauth/keys`,
    authScopes,
    checkoutSuccessUrl: env.PROOVIT_CHECKOUT_SUCCESS_URL,
    checkoutCancelUrl: env.PROOVIT_CHECKOUT_CANCEL_URL,
  }
};
