import { ConfigService } from '@nestjs/config';

const DEFAULT_API_PREFIX = 'api';
const DEFAULT_API_VERSION = '1';

export function apiPrefix(config: ConfigService) {
  return normalizePath(config.get<string>('API_PREFIX') ?? DEFAULT_API_PREFIX);
}

export function apiVersion(config: ConfigService) {
  return normalizeVersion(config.get<string>('API_VERSION') ?? DEFAULT_API_VERSION);
}

export function apiRoute(config: ConfigService, ...parts: string[]) {
  return joinPath(apiPrefix(config), ...parts);
}

export function apiPath(config: ConfigService, ...parts: string[]) {
  return `/${apiRoute(config, ...parts)}`;
}

export function versionedApiRoute(config: ConfigService, ...parts: string[]) {
  return apiRoute(config, `v${apiVersion(config)}`, ...parts);
}

export function versionedApiPath(config: ConfigService, ...parts: string[]) {
  return `/${versionedApiRoute(config, ...parts)}`;
}

export function docsRoute(config: ConfigService) {
  return apiRoute(config, 'docs');
}

export function docsPath(config: ConfigService) {
  return apiPath(config, 'docs');
}

export function docsJsonPath(config: ConfigService) {
  return apiPath(config, 'docs-json');
}

export function docsYamlPath(config: ConfigService) {
  return apiPath(config, 'docs-yaml');
}

export function consoleLoginPath(config: ConfigService) {
  return versionedApiPath(config, 'console', 'login');
}

export function sandboxPath(config: ConfigService) {
  return versionedApiPath(config, 'sandbox');
}

export function joinPath(...parts: string[]) {
  return parts.map((part) => normalizePath(part)).filter(Boolean).join('/');
}

function normalizePath(value: string) {
  return value
    .trim()
    .replace(/\\/g, '/')
    .replace(/^\/+|\/+$/g, '')
    .replace(/\/+/g, '/');
}

function normalizeVersion(value: string) {
  return value.trim().replace(/^v/i, '') || DEFAULT_API_VERSION;
}
