import { Request } from 'express';
import { env } from '../config/env';
import { AuthOAuthProvider } from '../config/authOAuth';

function requestHost(req?: Request): string {
  if (!req) return '';
  return (req.get('x-forwarded-host') || req.get('host') || '').split(',')[0].trim();
}

function requestProtocol(req?: Request): string {
  if (!req) return 'https';
  return (req.get('x-forwarded-proto') || req.protocol || 'https').split(',')[0].trim();
}

function isLocalHost(host: string): boolean {
  const h = host.toLowerCase();
  return !h || h.startsWith('localhost') || h.startsWith('127.0.0.1');
}

/** Browser-facing path prefix: /api behind Apache, empty for direct local API. */
export function publicApiPathPrefix(req?: Request): string {
  const host = requestHost(req);
  if (isLocalHost(host)) {
    return '';
  }
  return '/api';
}

/** Origin as seen by the browser (e.g. https://calendar.gventure.info). */
export function publicApiOrigin(req?: Request): string {
  const host = requestHost(req);
  if (host && !isLocalHost(host)) {
    return `${requestProtocol(req)}://${host}`;
  }

  if (env.GOOGLE_AUTH_REDIRECT_URI) {
    try {
      return new URL(env.GOOGLE_AUTH_REDIRECT_URI).origin;
    } catch {
      /* fall through */
    }
  }

  try {
    return new URL(env.APP_URL).origin;
  } catch {
    return env.API_URL.replace(/\/api\/?$/, '').replace(/\/$/, '');
  }
}

export function resolveAuthOAuthRedirectUri(
  provider: AuthOAuthProvider,
  req?: Request,
): string {
  const configured =
    provider === 'google' ? env.GOOGLE_AUTH_REDIRECT_URI : env.LINKEDIN_AUTH_REDIRECT_URI;
  if (configured) {
    return configured;
  }

  const prefix = publicApiPathPrefix(req);
  return `${publicApiOrigin(req)}${prefix}/v1/auth/oauth/callback/${provider}`;
}
