require "mysql2"

module Support
  module Helpers
    class RoyaltiesDB
      def clear_db
        client.query("SET FOREIGN_KEY_CHECKS=0;")

        %w[ payee account abacus_state account_payee sales_file
            accounting_period accounting_run contract exchange_rate
            sales_file payee_contact payment_hold payment_hold_history
            payment_group payment_group_payment payment_group_payment_payee
            abacus_event run_controller run_controller_contract contract_term
            contract_term_condition mechanical_deduction adjustment ledger_account
            ledger_account_current_balance ledger_accounting_run_balance
            account_payment_term ].each do |table|
          client.query("TRUNCATE TABLE #{table};")
        end

        client.query("SET FOREIGN_KEY_CHECKS=1;")
      end

      def clear_dynamodb
        dynamodb = Aws::DynamoDB::Client.new
        table_name = "qa_ows-payee-payee-ci-cd"
        scan_params = {
          table_name: table_name
        }
        result = dynamodb.scan(scan_params)
        result.items.each do |item|
          delete_params = { table_name: table_name,
                            key: {
                              'owner': item["owner"],
                              'revision': item["revision"]
                            } }
          dynamodb.delete_item(delete_params)
        end
      end

      def select_accounting_run_items
        statement = "SELECT * FROM accounting_run;"
        client.query(statement)
      end

      def select_contract_items
        statement = "SELECT * FROM contract;"
        client.query(statement)
      end

      def update_payee_count(accounting_run_id)
        statement = "UPDATE accounting_run
                    SET payee_count = 1
                    WHERE accounting_run_id = #{accounting_run_id};"
        client.query(statement)
      end

      # there's currently no way to create a run summary item in a DB as a fixture
      def create_run_summary_item(accounting_run_id, contract_id, amount, total_adjustment_amount)
        statement = "INSERT INTO run_summary_item (
          created_at,
          accounting_run_id,
          contract_id,
          amount,
          total_adjustment_amount
        ) VALUES (
          'Wed Oct 23 05:35:27 PDT 2019',
          #{accounting_run_id},
          #{contract_id},
          #{amount},
          #{total_adjustment_amount}
        );"
        client.query(statement)
      end

      private

      def client
        @client ||= Mysql2::Client.new(
          host:     ENV["MYSQL_DB_HOST"],
          username: ENV["MYSQL_DB_USER"],
          password: ENV["MYSQL_DB_PASS"],
          database: ENV["MYSQL_DB_NAME"],
          port:     ENV["MYSQL_DB_PORT"]
        )
      end
    end
  end
end
