import { BaseResource } from '@gitbeaker/requester-utils';
import { RequestHelper } from '../infrastructure';
import type { BaseRequestOptions, GitlabAPIResponse, ShowExpanded, Sudo } from '../infrastructure';

export interface ApplicationSettingsSchema extends Record<string, unknown> {
  admin_mode?: boolean;
  admin_notification_email?: string;
  abuse_notification_email?: string;
  after_sign_out_path?: string;
  after_sign_up_text?: string;
  akismet_api_key?: string;
  akismet_enabled?: boolean;
  allow_group_owners_to_manage_ldap?: boolean;
  allow_local_requests_from_hooks_and_services?: boolean;
  allow_local_requests_from_system_hooks?: boolean;
  allow_local_requests_from_web_hooks_and_services?: boolean;
  allow_runner_registration_token?: boolean;
  archive_builds_in_human_readable?: string;
  asset_proxy_enabled?: boolean;
  asset_proxy_secret_key?: string;
  asset_proxy_url?: string;
  asset_proxy_whitelist?: string | string[];
  asset_proxy_allowlist?: string | string[];
  authorized_keys_enabled?: boolean;
  auto_devops_domain?: string;
  auto_devops_enabled?: boolean;
  automatic_purchased_storage_allocation?: boolean;
  bulk_import_enabled?: boolean;
  can_create_group?: boolean;
  check_namespace_plan?: boolean;
  commit_email_hostname?: string;
  container_expiration_policies_enable_historic_entries?: boolean;
  container_registry_cleanup_tags_service_max_list_size?: number;
  container_registry_delete_tags_service_timeout?: number;
  container_registry_expiration_policies_caching?: boolean;
  container_registry_expiration_policies_worker_capacity?: number;
  container_registry_token_expire_delay?: number;
  package_registry_cleanup_policies_worker_capacity?: number;
  deactivate_dormant_users?: boolean;
  deactivate_dormant_users_period?: number;
  default_artifacts_expire_in?: string;
  default_branch_name?: string;
  default_branch_protection?: number;
  default_ci_config_path?: string;
  default_group_visibility?: string;
  default_preferred_language?: string;
  default_project_creation?: number;
  default_project_visibility?: string;
  default_projects_limit?: number;
  default_snippet_visibility?: string;
  default_syntax_highlighting_theme?: number;
  delayed_project_deletion?: boolean;
  delayed_group_deletion?: boolean;
  deletion_adjourned_period?: number;
  diff_max_patch_bytes?: number;
  diff_max_files?: number;
  diff_max_lines?: number;
  disable_admin_oauth_scopes?: boolean;
  disable_feed_token?: boolean;
  disable_personal_access_token?: boolean;
  disabled_oauth_sign_in_sources?: string[];
  dns_rebinding_protection_enabled?: boolean;
  domain_denylist_enabled?: boolean;
  domain_denylist?: string[];
  domain_allowlist?: string[];
  dsa_key_restriction?: number;
  ecdsa_key_restriction?: number;
  ecdsa_sk_key_restriction?: number;
  ed25519_key_restriction?: number;
  ed25519_sk_key_restriction?: number;
  eks_access_key_id?: string;
  eks_account_id?: string;
  eks_integration_enabled?: boolean;
  eks_secret_access_key?: string;
  elasticsearch_aws_access_key?: string;
  elasticsearch_aws_region?: string;
  elasticsearch_aws_secret_access_key?: string;
  elasticsearch_aws?: boolean;
  elasticsearch_indexed_field_length_limit?: number;
  elasticsearch_indexed_file_size_limit_kb?: number;
  elasticsearch_indexing?: boolean;
  elasticsearch_limit_indexing?: boolean;
  elasticsearch_max_bulk_concurrency?: number;
  elasticsearch_max_bulk_size_mb?: number;
  elasticsearch_namespace_ids?: number[];
  elasticsearch_project_ids?: number[];
  elasticsearch_search?: boolean;
  elasticsearch_url?: string;
  elasticsearch_username?: string;
  elasticsearch_password?: string;
  email_additional_text?: string;
  email_author_in_body?: boolean;
  email_confirmation_setting?: string;
  enabled_git_access_protocol?: string;
  enforce_namespace_storage_limit?: boolean;
  enforce_terms?: boolean;
  external_auth_client_cert?: string;
  external_auth_client_key_pass?: string;
  external_auth_client_key?: string;
  external_authorization_service_default_label?: string;
  external_authorization_service_enabled?: boolean;
  external_authorization_service_timeout?: number;
  external_authorization_service_url?: string;
  external_pipeline_validation_service_url?: string;
  external_pipeline_validation_service_token?: string;
  external_pipeline_validation_service_timeout?: number;
  file_template_project_id?: number;
  first_day_of_week?: number;
  geo_node_allowed_ips?: string;
  geo_status_timeout?: number;
  git_two_factor_session_expiry?: number;
  gitaly_timeout_default?: number;
  gitaly_timeout_fast?: number;
  gitaly_timeout_medium?: number;
  gitlab_dedicated_instance?: boolean;
  grafana_enabled?: boolean;
  grafana_url?: string;
  gravatar_enabled?: boolean;
  group_owners_can_manage_default_branch_protection?: boolean;
  hashed_storage_enabled?: boolean;
  help_page_hide_commercial_content?: boolean;
  help_page_support_url?: string;
  help_page_text?: string;
  help_text?: string;
  hide_third_party_offers?: boolean;
  home_page_url?: string;
  housekeeping_enabled?: boolean;
  housekeeping_optimize_repository_period?: number;
  html_emails_enabled?: boolean;
  import_sources?: string[];
  in_product_marketing_emails_enabled?: boolean;
  invisible_captcha_enabled?: boolean;
  issues_create_limit?: number;
  keep_latest_artifact?: boolean;
  local_markdown_version?: number;
  mailgun_signing_key?: string;
  mailgun_events_enabled?: boolean;
  maintenance_mode_message?: string;
  maintenance_mode?: boolean;
  max_artifacts_size?: number;
  max_attachment_size?: number;
  max_export_size?: number;
  max_import_size?: number;
  max_pages_size?: number;
  max_personal_access_token_lifetime?: number;
  max_ssh_key_lifetime?: number;
  max_terraform_state_size_bytes?: number;
  metrics_method_call_threshold?: number;
  max_number_of_repository_downloads?: number;
  max_number_of_repository_downloads_within_time_period?: number;
  git_rate_limit_users_allowlist?: string[];
  git_rate_limit_users_alertlist?: number[];
  auto_ban_user_on_excessive_projects_download?: boolean;
  mirror_available?: boolean;
  mirror_capacity_threshold?: number;
  mirror_max_capacity?: number;
  mirror_max_delay?: number;
  maven_package_requests_forwarding?: boolean;
  npm_package_requests_forwarding?: boolean;
  pypi_package_requests_forwarding?: boolean;
  outbound_local_requests_whitelist?: string[];
  pages_domain_verification_enabled?: boolean;
  password_authentication_enabled_for_git?: boolean;
  password_authentication_enabled_for_web?: boolean;
  password_number_required?: boolean;
  password_symbol_required?: boolean;
  password_uppercase_required?: boolean;
  password_lowercase_required?: boolean;
  performance_bar_allowed_group_path?: string;
  personal_access_token_prefix?: string;
  pipeline_limit_per_project_user_sha?: number;
  plantuml_enabled?: boolean;
  plantuml_url?: string;
  polling_interval_multiplier?: number;
  project_export_enabled?: boolean;
  projects_api_rate_limit_unauthenticated?: number;
  prometheus_metrics_enabled?: boolean;
  protected_ci_variables?: boolean;
  push_event_activities_limit?: number;
  push_event_hooks_limit?: number;
  rate_limiting_response_text?: string;
  raw_blob_request_limit?: number;
  search_rate_limit?: number;
  search_rate_limit_unauthenticated?: number;
  recaptcha_enabled?: boolean;
  recaptcha_private_key?: string;
  recaptcha_site_key?: string;
  receive_max_input_size?: number;
  repository_checks_enabled?: boolean;
  repository_size_limit?: number;
  repository_storages_weighted?: Record<string, number>;
  repository_storages?: string[];
  require_admin_approval_after_user_signup?: boolean;
  require_two_factor_authentication?: boolean;
  restricted_visibility_levels?: string[];
  rsa_key_restriction?: number;
  session_expire_delay?: number;
  shared_runners_enabled?: boolean;
  shared_runners_minutes?: number;
  shared_runners_text?: string;
  sidekiq_job_limiter_mode?: string;
  sidekiq_job_limiter_compression_threshold_bytes?: number;
  sidekiq_job_limiter_limit_bytes?: number;
  sign_in_text?: string;
  signup_enabled?: boolean;
  slack_app_enabled?: boolean;
  slack_app_id?: string;
  slack_app_secret?: string;
  slack_app_signing_secret?: string;
  slack_app_verification_token?: string;
  snippet_size_limit?: number;
  snowplow_app_id?: string;
  snowplow_collector_hostname?: string;
  snowplow_cookie_domain?: string;
  snowplow_enabled?: boolean;
  sourcegraph_enabled?: boolean;
  sourcegraph_public_only?: boolean;
  sourcegraph_url?: string;
  spam_check_endpoint_enabled?: boolean;
  spam_check_endpoint_url?: string;
  spam_check_api_key?: string;
  suggest_pipeline_enabled?: boolean;
  terminal_max_session_time?: number;
  terms?: string;
  throttle_authenticated_api_enabled?: boolean;
  throttle_authenticated_api_period_in_seconds?: number;
  throttle_authenticated_api_requests_per_period?: number;
  throttle_authenticated_packages_api_enabled?: boolean;
  throttle_authenticated_packages_api_period_in_seconds?: number;
  throttle_authenticated_packages_api_requests_per_period?: number;
  throttle_authenticated_web_enabled?: boolean;
  throttle_authenticated_web_period_in_seconds?: number;
  throttle_authenticated_web_requests_per_period?: number;
  throttle_unauthenticated_api_enabled?: boolean;
  throttle_unauthenticated_api_period_in_seconds?: number;
  throttle_unauthenticated_api_requests_per_period?: number;
  throttle_unauthenticated_packages_api_enabled?: boolean;
  throttle_unauthenticated_packages_api_period_in_seconds?: number;
  throttle_unauthenticated_packages_api_requests_per_period?: number;
  throttle_unauthenticated_web_enabled?: boolean;
  throttle_unauthenticated_web_period_in_seconds?: number;
  throttle_unauthenticated_web_requests_per_period?: number;
  time_tracking_limit_to_hours?: boolean;
  two_factor_grace_period?: number;
  unique_ips_limit_enabled?: boolean;
  unique_ips_limit_per_user?: number;
  unique_ips_limit_time_window?: number;
  usage_ping_enabled?: boolean;
  user_deactivation_emails_enabled?: boolean;
  user_default_external?: boolean;
  user_default_internal_regex?: string;
  user_defaults_to_private_profile?: boolean;
  user_oauth_applications?: boolean;
  user_show_add_ssh_key_message?: boolean;
  version_check_enabled?: boolean;
  whats_new_variant?: string;
  wiki_page_max_content_bytes?: number;
  jira_connect_application_key?: string;
  jira_connect_proxy_url?: string;
}

export class ApplicationSettings<C extends boolean = false> extends BaseResource<C> {
  show<E extends boolean = false>(
    options?: Sudo & ShowExpanded<E>,
  ): Promise<GitlabAPIResponse<ApplicationSettingsSchema, C, E, void>> {
    return RequestHelper.get<ApplicationSettingsSchema>()(this, 'application/settings', options);
  }

  edit<E extends boolean = false>(
    options?: BaseRequestOptions<E>,
  ): Promise<GitlabAPIResponse<ApplicationSettingsSchema, C, E, void>> {
    return RequestHelper.put<ApplicationSettingsSchema>()(this, 'application/settings', options);
  }
}
