# SPDX-License-Identifier: Apache-2.0
#
# The OpenSearch Contributors require contributions made to
# this file be licensed under the Apache-2.0 license or a
# compatible open source license.
#
# Modifications Copyright OpenSearch Contributors. See
# GitHub history for details.
#
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

require_relative "../benchmarking"

namespace :benchmark do

  namespace :simple do

    desc "Run the \'ping\' benchmark test"
    task :ping do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Simple.new(run)
        puts "#{'*' * 5} PING #{'*' * 5} \n"
        puts "#{task.run(:ping)}"
      end
    end

    desc "Run the \'create index\' benchmark test"
    task :create_index do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Simple.new(run)
        puts "#{'*' * 5} CREATE INDEX #{'*' * 5} \n"
        puts "#{task.run(:create_index)}"
      end
    end

    desc "Run the \'index smal document\' benchmark test with patron adapter"
    task :index_document_small_patron do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        begin
          require 'patron'
        rescue LoadError
          puts "Patron not loaded, skipping test"
        else
          task = OpenSearch::Benchmarking::Simple.new(run, :patron)
          puts "#{'*' * 5} INDEX SMALL DOCUMENT, PATRON #{'*' * 5} \n"
          puts "#{task.run(:index_document_small)}"
        end
      end
    end

    desc "Run the \'index small document\' benchmark test"
    task :index_document_small do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Simple.new(run)
        puts "#{'*' * 5} INDEX SMALL DOCUMENT #{'*' * 5} \n"
        puts "#{task.run(:index_document_small)}"
      end
    end

    desc "Run the \'index large document\' benchmark test"
    task :index_document_large do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Simple.new(run)
        puts "#{'*' * 5} INDEX LARGE DOCUMENT #{'*' * 5} \n"
        puts "#{task.run(:index_document_large)}"
      end
    end

    desc "Run the \'get small document\' benchmark test"
    task :get_document_small do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Simple.new(run)
        puts "#{'*' * 5} GET SMALL DOCUMENT #{'*' * 5} \n"
        puts "#{task.run(:get_document_small)}"
      end
    end

    desc "Run the \'get large document\' benchmark test"
    task :get_document_large do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Simple.new(run)
        puts "#{'*' * 5} GET LARGE DOCUMENT #{'*' * 5} \n"
        puts "#{task.run(:get_document_large)}"
      end
    end

    desc "Run the \'search small document\' benchmark test"
    task :search_document_small do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Simple.new(run)
        puts "#{'*' * 5} SEARCH SMALL DOCUMENT #{'*' * 5} \n"
        puts "#{task.run(:search_document_small)}"
      end
    end

    desc "Run the \'search small document\' benchmark test"
    task :search_document_large do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Simple.new(run)
        puts "#{'*' * 5} SEARCH LARGE DOCUMENT #{'*' * 5} \n"
        puts "#{task.run(:search_document_large)}"
      end
    end

    desc "Run the \'update document\' benchmark test"
    task :update_document do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Simple.new(run)
        puts "#{'*' * 5} UPDATE DOCUMENT #{'*' * 5} \n"
        puts "#{task.run(:update_document)}"
      end
    end

    desc "Run all simple benchmark tests"
    task :all, [:matrix] do |t, args|
      %w[ benchmark:simple:ping
          benchmark:simple:create_index
          benchmark:simple:index_document_small
          benchmark:simple:index_document_large
          benchmark:simple:get_document_small
          benchmark:simple:get_document_large
          benchmark:simple:search_document_small
          benchmark:simple:search_document_large
          benchmark:simple:update_document
        ].each do |task_name|
        begin
          require 'opensearch'
          Rake::Task[task_name].invoke(*args)
        rescue => ex
          puts "Error in task [#{task_name}], #{ex.inspect}"
          next
        end
      end
    end

    # namespace :noop do
    #
    #   desc "Run the \'search small document\' benchmark test with the noop plugin"
    #   task :search_document_small do
    #     puts "SIMPLE REQUEST BENCHMARK:: SEARCH SMALL DOCUMENT WITH NOOP PLUGIN"
    #     OpenSearch::Benchmarking::Simple.new.run(:search_document_small, noop: true)
    #   end
    # end
  end

  namespace :complex do

    task :download_dataset do
      current_path = File.expand_path(File.dirname(__FILE__))
      data_path = [current_path, 'data'].join('/')
      unless File.exist?([data_path, 'stackoverflow.json'].join('/'))
        `gsutil cp gs://clients-team-files/stackoverflow.json "#{data_path}/"`
      end
    end

    desc "Run the \'index documents\' benchmark test"
    task :index_documents => :download_dataset do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Complex.new(run)
        puts "#{'*' * 5} INDEX DOCUMENTS #{'*' * 5} \n"
        puts "#{task.run(:index_documents)}"
      end
    end

    desc "Run the \'search documents\' benchmark test"
    task :search_documents do
      require 'opensearch'
      OpenSearch::Benchmarking.each_run(ENV['matrix']) do |run|
        task = OpenSearch::Benchmarking::Complex.new(run)
        puts "#{'*' * 5} SEARCH DOCUMENTS #{'*' * 5} \n"
        puts "#{task.run(:search_documents)}"
      end
    end

    desc "Run all complex benchmark test"
    task :all do
      %w[ benchmark:complex:index_documents
        ].each do |task_name|
        require 'opensearch'
        Rake::Task[task_name].invoke
      end
    end
  end
end
