/*
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 */

import { securityAddBypassIp } from "../funcs/securityAddBypassIp.js";
import { securityCreateSecurityFirewallConfigByConfigVersionActivate } from "../funcs/securityCreateSecurityFirewallConfigByConfigVersionActivate.js";
import { securityDeleteSecurityFirewallConfigByConfigVersion } from "../funcs/securityDeleteSecurityFirewallConfigByConfigVersion.js";
import { securityGenerateFirewallRule } from "../funcs/securityGenerateFirewallRule.js";
import { securityGetActiveAttackStatus } from "../funcs/securityGetActiveAttackStatus.js";
import { securityGetBypassIp } from "../funcs/securityGetBypassIp.js";
import { securityGetFirewallConfig } from "../funcs/securityGetFirewallConfig.js";
import { securityGetSecurityFirewallConfig } from "../funcs/securityGetSecurityFirewallConfig.js";
import { securityGetSecurityFirewallEvents } from "../funcs/securityGetSecurityFirewallEvents.js";
import { securityPutFirewallConfig } from "../funcs/securityPutFirewallConfig.js";
import { securityRemoveBypassIp } from "../funcs/securityRemoveBypassIp.js";
import { securityUpdateAttackChallengeMode } from "../funcs/securityUpdateAttackChallengeMode.js";
import { securityUpdateFirewallConfig } from "../funcs/securityUpdateFirewallConfig.js";
import { ClientSDK, RequestOptions } from "../lib/sdks.js";
import {
  AddBypassIpRequest,
  AddBypassIpResponseBody,
} from "../models/addbypassipop.js";
import {
  CreateSecurityFirewallConfigByConfigVersionActivateRequest,
  CreateSecurityFirewallConfigByConfigVersionActivateResponseBody,
} from "../models/createsecurityfirewallconfigbyconfigversionactivateop.js";
import {
  DeleteSecurityFirewallConfigByConfigVersionRequest,
  DeleteSecurityFirewallConfigByConfigVersionResponseBody,
} from "../models/deletesecurityfirewallconfigbyconfigversionop.js";
import {
  GenerateFirewallRuleRequest,
  GenerateFirewallRuleResponseBody,
} from "../models/generatefirewallruleop.js";
import {
  GetActiveAttackStatusRequest,
  GetActiveAttackStatusResponseBody,
} from "../models/getactiveattackstatusop.js";
import {
  GetBypassIpRequest,
  GetBypassIpResponseBody,
} from "../models/getbypassipop.js";
import {
  GetFirewallConfigRequest,
  GetFirewallConfigResponseBody,
} from "../models/getfirewallconfigop.js";
import { GetSecurityFirewallConfigResponseBody } from "../models/getsecurityfirewallconfigresponsebody.js";
import {
  GetSecurityFirewallEventsRequest,
  GetSecurityFirewallEventsResponseBody,
} from "../models/getsecurityfirewalleventsop.js";
import {
  PutFirewallConfigRequest,
  PutFirewallConfigResponseBody,
} from "../models/putfirewallconfigop.js";
import {
  RemoveBypassIpRequest,
  RemoveBypassIpResponseBody,
} from "../models/removebypassipop.js";
import {
  UpdateAttackChallengeModeRequest,
  UpdateAttackChallengeModeResponseBody,
} from "../models/updateattackchallengemodeop.js";
import {
  UpdateFirewallConfigRequest,
  UpdateFirewallConfigResponseBody,
} from "../models/updatefirewallconfigop.js";
import { unwrapAsync } from "../types/fp.js";

export class Security extends ClientSDK {
  /**
   * Update Attack Challenge mode
   *
   * @remarks
   * Update the setting for determining if the project has Attack Challenge mode enabled.
   */
  async updateAttackChallengeMode(
    request: UpdateAttackChallengeModeRequest,
    options?: RequestOptions,
  ): Promise<UpdateAttackChallengeModeResponseBody> {
    return unwrapAsync(securityUpdateAttackChallengeMode(
      this,
      request,
      options,
    ));
  }

  /**
   * Returns activated WAF config
   *
   * @remarks
   * Lists WAF configs for a project
   */
  async getSecurityFirewallConfig(
    options?: RequestOptions,
  ): Promise<GetSecurityFirewallConfigResponseBody> {
    return unwrapAsync(securityGetSecurityFirewallConfig(
      this,
      options,
    ));
  }

  /**
   * Put Firewall Configuration
   *
   * @remarks
   * Set the firewall configuration to provided rules and settings. Creates or overwrite the existing firewall configuration.
   */
  async putFirewallConfig(
    request: PutFirewallConfigRequest,
    options?: RequestOptions,
  ): Promise<PutFirewallConfigResponseBody> {
    return unwrapAsync(securityPutFirewallConfig(
      this,
      request,
      options,
    ));
  }

  /**
   * Update Firewall Configuration
   *
   * @remarks
   * Process updates to modify the existing firewall config for a project
   */
  async updateFirewallConfig(
    request: UpdateFirewallConfigRequest,
    options?: RequestOptions,
  ): Promise<UpdateFirewallConfigResponseBody> {
    return unwrapAsync(securityUpdateFirewallConfig(
      this,
      request,
      options,
    ));
  }

  /**
   * Read Firewall Configuration
   *
   * @remarks
   * Retrieve the specified firewall configuration for a project. The deployed configVersion will be `active`
   */
  async getFirewallConfig(
    request: GetFirewallConfigRequest,
    options?: RequestOptions,
  ): Promise<GetFirewallConfigResponseBody> {
    return unwrapAsync(securityGetFirewallConfig(
      this,
      request,
      options,
    ));
  }

  /**
   * Returns activated WAF config
   *
   * @remarks
   * Promotes a draft WAF config to an active config
   */
  async deleteSecurityFirewallConfigByConfigVersion(
    request: DeleteSecurityFirewallConfigByConfigVersionRequest,
    options?: RequestOptions,
  ): Promise<DeleteSecurityFirewallConfigByConfigVersionResponseBody> {
    return unwrapAsync(securityDeleteSecurityFirewallConfigByConfigVersion(
      this,
      request,
      options,
    ));
  }

  /**
   * Returns activated WAF config
   *
   * @remarks
   * Promotes a draft WAF config to an active config
   */
  async createSecurityFirewallConfigByConfigVersionActivate(
    request: CreateSecurityFirewallConfigByConfigVersionActivateRequest,
    options?: RequestOptions,
  ): Promise<CreateSecurityFirewallConfigByConfigVersionActivateResponseBody> {
    return unwrapAsync(
      securityCreateSecurityFirewallConfigByConfigVersionActivate(
        this,
        request,
        options,
      ),
    );
  }

  /**
   * Read active attack data
   *
   * @remarks
   * Retrieve active attack data within the last N days (default: 1 day)
   */
  async getActiveAttackStatus(
    request: GetActiveAttackStatusRequest,
    options?: RequestOptions,
  ): Promise<GetActiveAttackStatusResponseBody> {
    return unwrapAsync(securityGetActiveAttackStatus(
      this,
      request,
      options,
    ));
  }

  /**
   * Read System Bypass
   *
   * @remarks
   * Retrieve the system bypass rules configured for the specified project
   */
  async getBypassIp(
    request: GetBypassIpRequest,
    options?: RequestOptions,
  ): Promise<GetBypassIpResponseBody> {
    return unwrapAsync(securityGetBypassIp(
      this,
      request,
      options,
    ));
  }

  /**
   * Create System Bypass Rule
   *
   * @remarks
   * Create new system bypass rules
   */
  async addBypassIp(
    request: AddBypassIpRequest,
    options?: RequestOptions,
  ): Promise<AddBypassIpResponseBody> {
    return unwrapAsync(securityAddBypassIp(
      this,
      request,
      options,
    ));
  }

  /**
   * Remove System Bypass Rule
   *
   * @remarks
   * Remove system bypass rules
   */
  async removeBypassIp(
    request: RemoveBypassIpRequest,
    options?: RequestOptions,
  ): Promise<RemoveBypassIpResponseBody> {
    return unwrapAsync(securityRemoveBypassIp(
      this,
      request,
      options,
    ));
  }

  /**
   * Read Firewall Actions by Project
   *
   * @remarks
   * Retrieve firewall actions for a project Rule names are resolved against the project's *current* active firewall configuration and the team's active rulesets, so a rule that has since been renamed reports its new name and one that has been deleted reports `null`. System rules such as `sys_dos_mitigation` and `ip_blocking` have no configured name and always report `null`.
   */
  async getSecurityFirewallEvents(
    request: GetSecurityFirewallEventsRequest,
    options?: RequestOptions,
  ): Promise<GetSecurityFirewallEventsResponseBody> {
    return unwrapAsync(securityGetSecurityFirewallEvents(
      this,
      request,
      options,
    ));
  }

  /**
   * Generate a firewall rule from natural language
   *
   * @remarks
   * Generate a firewall rule from a natural language description.
   */
  async generateFirewallRule(
    request: GenerateFirewallRuleRequest,
    options?: RequestOptions,
  ): Promise<GenerateFirewallRuleResponseBody> {
    return unwrapAsync(securityGenerateFirewallRule(
      this,
      request,
      options,
    ));
  }
}
