// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

import { APIResource } from '../../resource';
import { isRequestOptions } from '../../core';
import * as Core from '../../core';
import * as MitigationsAPI from './mitigations';
import {
  MitigationListParams,
  MitigationListResponse,
  MitigationListResponsesV4PagePagination,
  MitigationReviewParams,
  MitigationReviewResponse,
  MitigationReviewResponsesSinglePage,
  Mitigations,
} from './mitigations';
import { V4PagePagination, type V4PagePaginationParams } from '../../pagination';

export class AbuseReports extends APIResource {
  mitigations: MitigationsAPI.Mitigations = new MitigationsAPI.Mitigations(this._client);

  /**
   * Submit the Abuse Report of a particular type
   */
  create(
    reportParam: string,
    params: AbuseReportCreateParams,
    options?: Core.RequestOptions,
  ): Core.APIPromise<AbuseReportCreateResponse> {
    const { account_id = this._client.accountId, ...body } = params;
    return (
      this._client.post(`/accounts/${account_id}/abuse-reports/${reportParam}`, {
        body,
        ...options,
      }) as Core.APIPromise<{ result: AbuseReportCreateResponse }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * List the abuse reports for a given account
   */
  list(
    params?: AbuseReportListParams,
    options?: Core.RequestOptions,
  ): Core.PagePromise<AbuseReportListResponsesV4PagePagination, AbuseReportListResponse>;
  list(
    options?: Core.RequestOptions,
  ): Core.PagePromise<AbuseReportListResponsesV4PagePagination, AbuseReportListResponse>;
  list(
    params: AbuseReportListParams | Core.RequestOptions = {},
    options?: Core.RequestOptions,
  ): Core.PagePromise<AbuseReportListResponsesV4PagePagination, AbuseReportListResponse> {
    if (isRequestOptions(params)) {
      return this.list({}, params);
    }
    const { account_id = this._client.accountId, ...query } = params;
    return this._client.getAPIList(
      `/accounts/${account_id}/abuse-reports`,
      AbuseReportListResponsesV4PagePagination,
      { query, ...options },
    );
  }

  /**
   * Retrieve the details of an abuse report.
   */
  get(
    reportParam: string,
    params?: AbuseReportGetParams,
    options?: Core.RequestOptions,
  ): Core.APIPromise<AbuseReportGetResponse>;
  get(reportParam: string, options?: Core.RequestOptions): Core.APIPromise<AbuseReportGetResponse>;
  get(
    reportParam: string,
    params: AbuseReportGetParams | Core.RequestOptions = {},
    options?: Core.RequestOptions,
  ): Core.APIPromise<AbuseReportGetResponse> {
    if (isRequestOptions(params)) {
      return this.get(reportParam, {}, params);
    }
    const { account_id = this._client.accountId } = params;
    return (
      this._client.get(`/accounts/${account_id}/abuse-reports/${reportParam}`, options) as Core.APIPromise<{
        result: AbuseReportGetResponse;
      }>
    )._thenUnwrap((obj) => obj.result);
  }
}

export class AbuseReportListResponsesV4PagePagination extends V4PagePagination<AbuseReportListResponse> {}

/**
 * The result should be 'success' for successful response
 */
export type AbuseReportCreateResponse = string;

export interface AbuseReportListResponse {
  reports: Array<AbuseReportListResponse.Report>;
}

export namespace AbuseReportListResponse {
  export interface Report {
    /**
     * Public facing ID of abuse report, aka abuse_rand.
     */
    id: string;

    /**
     * Creation date of report. Time in RFC 3339 format
     * (https://www.rfc-editor.org/rfc/rfc3339.html)
     */
    cdate: string;

    /**
     * Domain that relates to the report.
     */
    domain: string;

    /**
     * A summary of the mitigations related to this report.
     */
    mitigation_summary: Report.MitigationSummary;

    /**
     * An enum value that represents the status of an abuse record
     */
    status: 'accepted' | 'in_review';

    /**
     * The abuse report type
     */
    type: 'PHISH' | 'GEN' | 'THREAT' | 'DMCA' | 'EMER' | 'TM' | 'REG_WHO' | 'NCSEI' | 'NETWORK';

    /**
     * Justification for the report.
     */
    justification?: string;

    /**
     * Original work / Targeted brand in the alleged abuse.
     */
    original_work?: string;

    /**
     * Information about the submitter of the report.
     */
    submitter?: Report.Submitter;

    urls?: Array<string>;
  }

  export namespace Report {
    /**
     * A summary of the mitigations related to this report.
     */
    export interface MitigationSummary {
      /**
       * How many of the reported URLs were confirmed as abusive.
       */
      accepted_url_count: number;

      /**
       * How many mitigations are active.
       */
      active_count: number;

      /**
       * Whether the report has been forwarded to an external hosting provider.
       */
      external_host_notified: boolean;

      /**
       * How many mitigations are under review.
       */
      in_review_count: number;

      /**
       * How many mitigations are pending their effective date.
       */
      pending_count: number;
    }

    /**
     * Information about the submitter of the report.
     */
    export interface Submitter {
      company?: string;

      email?: string;

      name?: string;

      telephone?: string;
    }
  }
}

export interface AbuseReportGetResponse {
  /**
   * Public facing ID of abuse report, aka abuse_rand.
   */
  id: string;

  /**
   * Creation date of report. Time in RFC 3339 format
   * (https://www.rfc-editor.org/rfc/rfc3339.html)
   */
  cdate: string;

  /**
   * Domain that relates to the report.
   */
  domain: string;

  /**
   * A summary of the mitigations related to this report.
   */
  mitigation_summary: AbuseReportGetResponse.MitigationSummary;

  /**
   * An enum value that represents the status of an abuse record
   */
  status: 'accepted' | 'in_review';

  /**
   * The abuse report type
   */
  type: 'PHISH' | 'GEN' | 'THREAT' | 'DMCA' | 'EMER' | 'TM' | 'REG_WHO' | 'NCSEI' | 'NETWORK';

  /**
   * Justification for the report.
   */
  justification?: string;

  /**
   * Original work / Targeted brand in the alleged abuse.
   */
  original_work?: string;

  /**
   * Information about the submitter of the report.
   */
  submitter?: AbuseReportGetResponse.Submitter;

  urls?: Array<string>;
}

export namespace AbuseReportGetResponse {
  /**
   * A summary of the mitigations related to this report.
   */
  export interface MitigationSummary {
    /**
     * How many of the reported URLs were confirmed as abusive.
     */
    accepted_url_count: number;

    /**
     * How many mitigations are active.
     */
    active_count: number;

    /**
     * Whether the report has been forwarded to an external hosting provider.
     */
    external_host_notified: boolean;

    /**
     * How many mitigations are under review.
     */
    in_review_count: number;

    /**
     * How many mitigations are pending their effective date.
     */
    pending_count: number;
  }

  /**
   * Information about the submitter of the report.
   */
  export interface Submitter {
    company?: string;

    email?: string;

    name?: string;

    telephone?: string;
  }
}

export type AbuseReportCreateParams =
  | AbuseReportCreateParams.AbuseReportsDmcaReport
  | AbuseReportCreateParams.AbuseReportsTrademarkReport
  | AbuseReportCreateParams.AbuseReportsGeneralReport
  | AbuseReportCreateParams.AbuseReportsPhishingReport
  | AbuseReportCreateParams.AbuseReportsCsamReport
  | AbuseReportCreateParams.AbuseReportsThreatReport
  | AbuseReportCreateParams.AbuseReportsRegistrarWhoisReport
  | AbuseReportCreateParams.AbuseReportsNcseiReport;

export declare namespace AbuseReportCreateParams {
  export interface AbuseReportsDmcaReport {
    /**
     * Path param: Cloudflare Account ID
     */
    account_id?: string;

    /**
     * Body param: The report type for submitted reports.
     */
    act: 'abuse_dmca';

    /**
     * Body param: Text not exceeding 100 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    address1: string;

    /**
     * Body param: The name of the copyright holder. Text not exceeding 60 characters.
     * This field may be released by Cloudflare to third parties such as the Lumen
     * Database (https://lumendatabase.org/).
     */
    agent_name: string;

    /**
     * Body param: Can be `0` for false or `1` for true. Must be value: 1 for DMCA
     * reports
     */
    agree: 1;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    city: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    country: string;

    /**
     * Body param: A valid email of the abuse reporter. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    email: string;

    /**
     * Body param: Should match the value provided in `email`
     */
    email2: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    host_notification: 'send';

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    name: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    original_work: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    owner_notification: 'send';

    /**
     * Body param: Required for DMCA reports, should be same as Name. An affirmation
     * that all information in the report is true and accurate while agreeing to the
     * policies of Cloudflare's abuse reports
     */
    signature: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    state: string;

    /**
     * Body param: A list of valid URLs separated by ‘\n’ (new line character). The
     * list of the URLs should not exceed 250 URLs. All URLs should have the same
     * hostname. Each URL should be unique. This field may be released by Cloudflare to
     * third parties such as the Lumen Database (https://lumendatabase.org/).
     */
    urls: string;

    /**
     * Body param: Any additional comments about the infringement not exceeding 2000
     * characters
     */
    comments?: string;

    /**
     * Body param: Text not exceeding 100 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    company?: string;

    /**
     * Body param: Text containing 2 characters
     */
    reported_country?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    reported_user_agent?: string;

    /**
     * Body param: Text not exceeding 20 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    tele?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    title?: string;
  }

  export interface AbuseReportsTrademarkReport {
    /**
     * Path param: Cloudflare Account ID
     */
    account_id?: string;

    /**
     * Body param: The report type for submitted reports.
     */
    act: 'abuse_trademark';

    /**
     * Body param: A valid email of the abuse reporter. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    email: string;

    /**
     * Body param: Should match the value provided in `email`
     */
    email2: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    host_notification: 'send';

    /**
     * Body param: A detailed description of the infringement, including any necessary
     * access details and the exact steps needed to view the content, not exceeding
     * 5000 characters.
     */
    justification: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    name: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    owner_notification: 'send';

    /**
     * Body param: Text not exceeding 1000 characters
     */
    trademark_number: string;

    /**
     * Body param: Text not exceeding 1000 characters
     */
    trademark_office: string;

    /**
     * Body param: Text not exceeding 1000 characters
     */
    trademark_symbol: string;

    /**
     * Body param: A list of valid URLs separated by ‘\n’ (new line character). The
     * list of the URLs should not exceed 250 URLs. All URLs should have the same
     * hostname. Each URL should be unique. This field may be released by Cloudflare to
     * third parties such as the Lumen Database (https://lumendatabase.org/).
     */
    urls: string;

    /**
     * Body param: Any additional comments about the infringement not exceeding 2000
     * characters
     */
    comments?: string;

    /**
     * Body param: Text not exceeding 100 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    company?: string;

    /**
     * Body param: Text containing 2 characters
     */
    reported_country?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    reported_user_agent?: string;

    /**
     * Body param: Text not exceeding 20 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    tele?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    title?: string;
  }

  export interface AbuseReportsGeneralReport {
    /**
     * Path param: Cloudflare Account ID
     */
    account_id?: string;

    /**
     * Body param: The report type for submitted reports.
     */
    act: 'abuse_general';

    /**
     * Body param: A valid email of the abuse reporter. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    email: string;

    /**
     * Body param: Should match the value provided in `email`
     */
    email2: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    host_notification: 'send' | 'send-anon';

    /**
     * Body param: A detailed description of the infringement, including any necessary
     * access details and the exact steps needed to view the content, not exceeding
     * 5000 characters.
     */
    justification: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    name: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    owner_notification: 'send' | 'send-anon';

    /**
     * Body param: A list of valid URLs separated by ‘\n’ (new line character). The
     * list of the URLs should not exceed 250 URLs. All URLs should have the same
     * hostname. Each URL should be unique. This field may be released by Cloudflare to
     * third parties such as the Lumen Database (https://lumendatabase.org/).
     */
    urls: string;

    /**
     * Body param: Any additional comments about the infringement not exceeding 2000
     * characters
     */
    comments?: string;

    /**
     * Body param: Text not exceeding 100 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    company?: string;

    /**
     * Body param: A list of IP addresses separated by ‘\n’ (new line character). The
     * list of destination IPs should not exceed 30 IP addresses. Each one of the IP
     * addresses ought to be unique.
     */
    destination_ips?: string;

    /**
     * Body param: A comma separated list of ports and protocols e.g. 80/TCP, 22/UDP.
     * The total size of the field should not exceed 2000 characters. Each individual
     * port/protocol should not exceed 100 characters. The list should not have more
     * than 30 unique ports and protocols.
     */
    ports_protocols?: string;

    /**
     * Body param: Text containing 2 characters
     */
    reported_country?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    reported_user_agent?: string;

    /**
     * Body param: A list of IP addresses separated by ‘\n’ (new line character). The
     * list of source IPs should not exceed 30 IP addresses. Each one of the IP
     * addresses ought to be unique.
     */
    source_ips?: string;

    /**
     * Body param: Text not exceeding 20 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    tele?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    title?: string;
  }

  export interface AbuseReportsPhishingReport {
    /**
     * Path param: Cloudflare Account ID
     */
    account_id?: string;

    /**
     * Body param: The report type for submitted reports.
     */
    act: 'abuse_phishing';

    /**
     * Body param: A valid email of the abuse reporter. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    email: string;

    /**
     * Body param: Should match the value provided in `email`
     */
    email2: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    host_notification: 'send' | 'send-anon';

    /**
     * Body param: A detailed description of the infringement, including any necessary
     * access details and the exact steps needed to view the content, not exceeding
     * 5000 characters.
     */
    justification: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    name: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    owner_notification: 'send' | 'send-anon';

    /**
     * Body param: A list of valid URLs separated by ‘\n’ (new line character). The
     * list of the URLs should not exceed 250 URLs. All URLs should have the same
     * hostname. Each URL should be unique. This field may be released by Cloudflare to
     * third parties such as the Lumen Database (https://lumendatabase.org/).
     */
    urls: string;

    /**
     * Body param: Any additional comments about the infringement not exceeding 2000
     * characters
     */
    comments?: string;

    /**
     * Body param: Text not exceeding 100 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    company?: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    original_work?: string;

    /**
     * Body param: Text containing 2 characters
     */
    reported_country?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    reported_user_agent?: string;

    /**
     * Body param: Text not exceeding 20 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    tele?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    title?: string;
  }

  export interface AbuseReportsCsamReport {
    /**
     * Path param: Cloudflare Account ID
     */
    account_id?: string;

    /**
     * Body param: The report type for submitted reports.
     */
    act: 'abuse_children';

    /**
     * Body param: A valid email of the abuse reporter. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    email: string;

    /**
     * Body param: Should match the value provided in `email`
     */
    email2: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    host_notification: 'send' | 'send-anon';

    /**
     * Body param: A detailed description of the infringement, including any necessary
     * access details and the exact steps needed to view the content, not exceeding
     * 5000 characters.
     */
    justification: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    name: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    ncmec_notification: 'send' | 'send-anon';

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    owner_notification: 'send' | 'send-anon' | 'none';

    /**
     * Body param: A list of valid URLs separated by ‘\n’ (new line character). The
     * list of the URLs should not exceed 250 URLs. All URLs should have the same
     * hostname. Each URL should be unique. This field may be released by Cloudflare to
     * third parties such as the Lumen Database (https://lumendatabase.org/).
     */
    urls: string;

    /**
     * Body param: Any additional comments about the infringement not exceeding 2000
     * characters
     */
    comments?: string;

    /**
     * Body param: Text not exceeding 100 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    company?: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    country?: string;

    /**
     * Body param: Text containing 2 characters
     */
    reported_country?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    reported_user_agent?: string;

    /**
     * Body param: Text not exceeding 20 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    tele?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    title?: string;
  }

  export interface AbuseReportsThreatReport {
    /**
     * Path param: Cloudflare Account ID
     */
    account_id?: string;

    /**
     * Body param: The report type for submitted reports.
     */
    act: 'abuse_threat';

    /**
     * Body param: A valid email of the abuse reporter. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    email: string;

    /**
     * Body param: Should match the value provided in `email`
     */
    email2: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    host_notification: 'send' | 'send-anon';

    /**
     * Body param: A detailed description of the infringement, including any necessary
     * access details and the exact steps needed to view the content, not exceeding
     * 5000 characters.
     */
    justification: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    name: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    owner_notification: 'send' | 'send-anon';

    /**
     * Body param: A list of valid URLs separated by ‘\n’ (new line character). The
     * list of the URLs should not exceed 250 URLs. All URLs should have the same
     * hostname. Each URL should be unique. This field may be released by Cloudflare to
     * third parties such as the Lumen Database (https://lumendatabase.org/).
     */
    urls: string;

    /**
     * Body param: Any additional comments about the infringement not exceeding 2000
     * characters
     */
    comments?: string;

    /**
     * Body param: Text not exceeding 100 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    company?: string;

    /**
     * Body param: Text containing 2 characters
     */
    reported_country?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    reported_user_agent?: string;

    /**
     * Body param: Text not exceeding 20 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    tele?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    title?: string;
  }

  export interface AbuseReportsRegistrarWhoisReport {
    /**
     * Path param: Cloudflare Account ID
     */
    account_id?: string;

    /**
     * Body param: The report type for submitted reports.
     */
    act: 'abuse_registrar_whois';

    /**
     * Body param: A valid email of the abuse reporter. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    email: string;

    /**
     * Body param: Should match the value provided in `email`
     */
    email2: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    name: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    owner_notification: 'send' | 'send-anon' | 'none';

    /**
     * Body param: A list of valid URLs separated by ‘\n’ (new line character). The
     * list of the URLs should not exceed 250 URLs. All URLs should have the same
     * hostname. Each URL should be unique. This field may be released by Cloudflare to
     * third parties such as the Lumen Database (https://lumendatabase.org/).
     */
    urls: string;

    /**
     * Body param: Any additional comments about the infringement not exceeding 2000
     * characters
     */
    comments?: string;

    /**
     * Body param: Text not exceeding 100 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    company?: string;

    /**
     * Body param: RDP-mandated fields for registrar WHOIS data disclosure requests.
     */
    reg_who_request?: AbuseReportsRegistrarWhoisReport.RegWhoRequest;

    /**
     * Body param: Text containing 2 characters
     */
    reported_country?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    reported_user_agent?: string;

    /**
     * Body param: Text not exceeding 20 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    tele?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    title?: string;
  }

  export namespace AbuseReportsRegistrarWhoisReport {
    /**
     * RDP-mandated fields for registrar WHOIS data disclosure requests.
     */
    export interface RegWhoRequest {
      /**
       * Affirmation that the request is made in good faith per RDP 10.2.4. Must be true.
       */
      reg_who_good_faith_affirmation: boolean;

      /**
       * Agreement to process data lawfully per RDP 10.2.5. Must be true.
       */
      reg_who_lawful_processing_agreement: boolean;

      /**
       * Legal rights and rationale for the request per RDP 10.2.3. Required for all
       * WHOIS requests.
       */
      reg_who_legal_basis: string;

      /**
       * The type of WHOIS data request per RDP procedure.
       */
      reg_who_request_type: 'disclosure' | 'invalid_whois';

      /**
       * The specific WHOIS data elements being requested per RDP 10.2.2. Required for
       * all WHOIS requests.
       */
      reg_who_requested_data_elements: Array<
        | 'registrant_name'
        | 'registrant_organization'
        | 'registrant_email'
        | 'registrant_phone'
        | 'registrant_address'
        | 'registrant_address_country'
        | 'registrant_address_postal_code'
        | 'admin_name'
        | 'admin_organization'
        | 'admin_email'
        | 'admin_phone'
        | 'admin_address'
        | 'tech_name'
        | 'tech_organization'
        | 'tech_email'
        | 'tech_phone'
        | 'tech_address'
      >;

      /**
       * Optional authorization statement or power of attorney per RDP 10.2.1.3.
       */
      reg_who_authorization_statement?: string;

      /**
       * The nature of the requestor per RDP 10.2.1.2.
       */
      reg_who_requestor_type?: 'government' | 'corporation' | 'individual';
    }
  }

  export interface AbuseReportsNcseiReport {
    /**
     * Path param: Cloudflare Account ID
     */
    account_id?: string;

    /**
     * Body param: The report type for submitted reports.
     */
    act: 'abuse_ncsei';

    /**
     * Body param: A valid email of the abuse reporter. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    email: string;

    /**
     * Body param: Should match the value provided in `email`
     */
    email2: string;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    host_notification: 'send' | 'send-anon';

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    name: string;

    /**
     * Body param: If the submitter is the target of NCSEI in the URLs of the abuse
     * report.
     */
    ncsei_subject_representation: boolean;

    /**
     * Body param: Notification type based on the abuse type. NOTE: Copyright (DMCA)
     * and Trademark reports cannot be anonymous.
     */
    owner_notification: 'send' | 'send-anon' | 'none';

    /**
     * Body param: A list of valid URLs separated by ‘\n’ (new line character). The
     * list of the URLs should not exceed 250 URLs. All URLs should have the same
     * hostname. Each URL should be unique. This field may be released by Cloudflare to
     * third parties such as the Lumen Database (https://lumendatabase.org/).
     */
    urls: string;

    /**
     * Body param: Any additional comments about the infringement not exceeding 2000
     * characters
     */
    comments?: string;

    /**
     * Body param: Text not exceeding 100 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    company?: string;

    /**
     * Body param: Text not exceeding 255 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    country?: string;

    /**
     * Body param: Text containing 2 characters
     */
    reported_country?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    reported_user_agent?: string;

    /**
     * Body param: Text not exceeding 20 characters. This field may be released by
     * Cloudflare to third parties such as the Lumen Database
     * (https://lumendatabase.org/).
     */
    tele?: string;

    /**
     * Body param: Text not exceeding 255 characters
     */
    title?: string;
  }
}

export interface AbuseReportListParams extends V4PagePaginationParams {
  /**
   * Path param: Cloudflare Account ID
   */
  account_id?: string;

  /**
   * Query param: Returns reports created after the specified date
   */
  created_after?: string;

  /**
   * Query param: Returns reports created before the specified date
   */
  created_before?: string;

  /**
   * Query param: Filter by domain name related to the abuse report
   */
  domain?: string;

  /**
   * Query param: Filter reports that have any mitigations in the given status.
   */
  mitigation_status?: 'pending' | 'active' | 'in_review' | 'cancelled' | 'removed';

  /**
   * Query param: A property to sort by, followed by the order (id, cdate, domain,
   * type, status)
   */
  sort?: string;

  /**
   * Query param: Filter by the status of the report.
   */
  status?: 'accepted' | 'in_review';

  /**
   * Query param: Filter by the type of the report.
   */
  type?: 'PHISH' | 'GEN' | 'THREAT' | 'DMCA' | 'EMER' | 'TM' | 'REG_WHO' | 'NCSEI' | 'NETWORK';
}

export interface AbuseReportGetParams {
  /**
   * Cloudflare Account ID
   */
  account_id?: string;
}

AbuseReports.AbuseReportListResponsesV4PagePagination = AbuseReportListResponsesV4PagePagination;
AbuseReports.Mitigations = Mitigations;
AbuseReports.MitigationListResponsesV4PagePagination = MitigationListResponsesV4PagePagination;
AbuseReports.MitigationReviewResponsesSinglePage = MitigationReviewResponsesSinglePage;

export declare namespace AbuseReports {
  export {
    type AbuseReportCreateResponse as AbuseReportCreateResponse,
    type AbuseReportListResponse as AbuseReportListResponse,
    type AbuseReportGetResponse as AbuseReportGetResponse,
    AbuseReportListResponsesV4PagePagination as AbuseReportListResponsesV4PagePagination,
    type AbuseReportCreateParams as AbuseReportCreateParams,
    type AbuseReportListParams as AbuseReportListParams,
    type AbuseReportGetParams as AbuseReportGetParams,
  };

  export {
    Mitigations as Mitigations,
    type MitigationListResponse as MitigationListResponse,
    type MitigationReviewResponse as MitigationReviewResponse,
    MitigationListResponsesV4PagePagination as MitigationListResponsesV4PagePagination,
    MitigationReviewResponsesSinglePage as MitigationReviewResponsesSinglePage,
    type MitigationListParams as MitigationListParams,
    type MitigationReviewParams as MitigationReviewParams,
  };
}
