module DataHelpers
  class AccountingDBCleaner
    def clean_up(opts = {})
      items = items_to_delete(opts)
      items.each do |item|
        params = {
          table_name: "qa-accounting-statement-export",
          key: {
            user_id_type: item["user_id_type"],
            user_params: item["user_params"]
          }
        }
        dynamodb_client.delete_item(params)
        puts "  Removing #{item['user_params']} item."
      end
    end

    private

    def items_to_delete(opts = {})
      check_params(opts)
      user_statement_export_items(opts[:user_id_type]).select do |item|
        !item["user_params"].include?("AVRO") &&
          item["user_params"].include?(opts[:period_id].to_s) &&
          item["user_params"].include?(opts[:file_type]) &&
          item["user_params"].include?(opts[:number_format]) &&
          item["user_params"].match(report_type_matcher(opts[:report_type]))
      end
    end

    def check_params(give_params)
      required_params = %i[user_id_type period_id file_type number_format report_type]
      required_params.all? { |p| give_params.key?(p) } ||
        fail("You should specify all of the following params #{required_params}")
    end

    def user_statement_export_items(user_id_type)
      params = {
        table_name: "qa-accounting-statement-export",
        projection_expression: "#user_id_type, #user_params",
        key_condition_expression: "#user_id_type = :user_id_type",
        expression_attribute_names: {
          "#user_id_type" => "user_id_type",
          "#user_params" => "user_params"
        },
        expression_attribute_values: {
          ":user_id_type" => user_id_type
        }
      }
      dynamodb_client.query(params).items
    end

    def report_type_matcher(report_type)
      case report_type.to_sym
      when :full
        # "226,227,228__en_US__all__xls"
        /all/
      when :custom
        # "226,227,228__AS,AV,CL,MV,NR,PS,RB,RC,S,TD__en_US__xls"
        /.*__\D+,.*__/
      when :physical
        # "226,227,228__en_US__physical__xls"
        /physical/
      else
        fail "Unknown report type '#{report_type}'"
      end
    end

    def dynamodb_client
      @dynamodb_client ||= Support::DynamoDbClient.new.client
    end
  end
end
