require "resource_support/aws"

module MockAwsBillingReports
  class Empty < AwsBackendBase
    def describe_report_definitions(_query)
      Aws::CostandUsageReportService::Types::DescribeReportDefinitionsResponse.new(report_definitions: [])
    end
  end

  class Basic < AwsBackendBase
    def describe_report_definitions(_query)
      Aws::CostandUsageReportService::Types::DescribeReportDefinitionsResponse
        .new(report_definitions:
      [
        Aws::CostandUsageReportService::Types::ReportDefinition.new(
          report_name: "inspec1",
          time_unit: "HOURLY",
          format: "textORcsv",
          compression: "ZIP",
          s3_bucket: "inspec1-s3-bucket",
          s3_prefix: "inspec1/accounting",
          s3_region: "us-east-1"
        ),
        Aws::CostandUsageReportService::Types::ReportDefinition.new(
          report_name: "inspec2",
          time_unit: "DAILY",
          format: "textORcsv",
          compression: "GZIP",
          s3_bucket: "inspec2-s3-bucket",
          s3_prefix: "inspec2/accounting",
          s3_region: "us-west-1"
        ),
      ])
    end
  end

  # This backend will always repond with 5 reports, as if the `max_results` option was passed to
  # `#describe_report_definitions`. I chose 5 because when using `max_results` in the real world
  # it seems to only accept a value of 5.
  #
  # == Returns:
  # A Aws::CostandUsageReportService::Types::DescribeReportDefinitionsRespons object with two instance
  # properties:
  # `report_definitions` An Array that includes a single page of 5 Reports.
  # `next_token` A String set to the start of the next page. When `next_token` is nil, there are no more pages.
  #
  class Paginated < AwsBackendBase

    # Generate a set of report data, and shuffle their order.
    def generate_definitions
      definitions = []

      definitions << Aws::CostandUsageReportService::Types::ReportDefinition.new(
        report_name: "inspec1",
        time_unit: "HOURLY",
        format: "textORcsv",
        compression: "ZIP",
        s3_bucket: "inspec1-s3-bucket",
        s3_prefix: "inspec1/accounting",
        s3_region: "us-east-1")
      definitions << Aws::CostandUsageReportService::Types::ReportDefinition.new(
        report_name: "inspec2",
        time_unit: "DAILY",
        format: "textORcsv",
        compression: "GZIP",
        s3_bucket: "inspec2-s3-bucket",
        s3_prefix: "inspec2/accounting",
        s3_region: "us-west-1")

      (3..12).each do |i|
        definitions <<
          Aws::CostandUsageReportService::Types::ReportDefinition.new(
            report_name: "inspec#{i}",
            time_unit: %w{HOURLY DAILY}.sample,
            format: "textORcsv",
            compression: %w{ZIP GZIP}.sample,
            s3_bucket: "inspec#{i}-s3-bucket",
            s3_prefix: "inspec#{i}",
            s3_region: "us-east-1"
          )
      end

      definitions.shuffle
    end

    def describe_report_definitions(options = {})
      @definitions ||= generate_definitions

      starting_position = options.fetch(:next_token, 0)
      selected_definitions = @definitions.slice(starting_position, 5).compact
      next_token = starting_position + 5
      next_token = @definitions.count < next_token ? nil : next_token

      response = Aws::CostandUsageReportService::Types::DescribeReportDefinitionsResponse
      .new(report_definitions: selected_definitions)
      response.next_token = next_token
      response
    end
  end
end
