import { InvalidArgumentError } from '@ai-sdk/provider';
import {
  isValidHostnamePart,
  loadOptionalSetting,
  withoutTrailingSlash,
} from '@ai-sdk/provider-utils';

const AWS_PARTITION_DNS_SUFFIXES = [
  { regionPrefix: 'cn-', dnsSuffix: 'amazonaws.com.cn' },
  { regionPrefix: 'us-iso-', dnsSuffix: 'c2s.ic.gov' },
  { regionPrefix: 'us-isob-', dnsSuffix: 'sc2s.sgov.gov' },
  { regionPrefix: 'eu-isoe-', dnsSuffix: 'cloud.adc-e.uk' },
  { regionPrefix: 'us-isof-', dnsSuffix: 'csp.hci.ic.gov' },
  { regionPrefix: 'eusc-', dnsSuffix: 'amazonaws.eu' },
] as const;

export function resolveAmazonBedrockBaseURL({
  baseURL,
  getRegion,
  service,
  serviceEndpointUrlEnvironmentVariableName,
}: {
  baseURL: string | undefined;
  getRegion: () => string;
  service: 'bedrock-runtime' | 'bedrock-agent-runtime';
  serviceEndpointUrlEnvironmentVariableName:
    | 'AWS_ENDPOINT_URL_BEDROCK_RUNTIME'
    | 'AWS_ENDPOINT_URL_BEDROCK_AGENT_RUNTIME';
}): string {
  const resolvedBaseURL =
    baseURL ??
    loadOptionalSetting({
      settingValue: undefined,
      environmentVariableName: serviceEndpointUrlEnvironmentVariableName,
    }) ??
    loadOptionalSetting({
      settingValue: undefined,
      environmentVariableName: 'AWS_ENDPOINT_URL',
    });

  if (resolvedBaseURL != null) {
    return withoutTrailingSlash(resolvedBaseURL) ?? resolvedBaseURL;
  }

  const region = getRegion();
  if (!isValidHostnamePart(region)) {
    throw new InvalidArgumentError({
      argument: 'region',
      message:
        'Invalid AWS region. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints.',
    });
  }
  const dnsSuffix =
    AWS_PARTITION_DNS_SUFFIXES.find(({ regionPrefix }) =>
      region.startsWith(regionPrefix),
    )?.dnsSuffix ?? 'amazonaws.com';
  const generatedBaseURL = `https://${service}.${region}.${dnsSuffix}`;

  return withoutTrailingSlash(generatedBaseURL) ?? generatedBaseURL;
}
