# frozen_string_literal: true

require "nsrr/models/all"
require "nsrr/helpers/authorization"
require "nsrr/helpers/color"

module Nsrr
  module Commands
    # Downloads a folder or a file from the NSRR webserver. Folders can be
    # downloaded recursively.
    class Download
      class << self
        def run(*args)
          new(*args).run
        end
      end

      attr_reader :token, :dataset_slug, :full_path, :file_comparison, :depth

      def initialize(argv)
        (@token, argv) = parse_parameter_with_value(argv, ["token"], "")
        (@file_comparison, argv) = parse_parameter(argv, ["fast", "fresh", "md5"], "md5")
        (@depth, argv) = parse_parameter(argv, ["shallow", "recursive"], "recursive")
        @dataset_slug = argv[1].to_s.split("/").first
        @full_path = (argv[1].to_s.split("/")[1..-1] || []).join("/")
      end

      # Run with Authorization
      def run
        if @dataset_slug.nil?
          puts "Please specify a dataset: " + "nsrr download DATASET".white
          puts "Read more on the download command here:"
          puts "  " + "https://github.com/nsrr/nsrr-gem".bg_gray.blue.underline
        else
          @token = Nsrr::Helpers::Authorization.get_token(@token) if @token.to_s == ""
          @dataset = Dataset.find(@dataset_slug, @token)
          if @dataset
            @dataset.download(@full_path, depth: @depth, method: @file_comparison)
          else
            puts "\nThe dataset " + @dataset_slug.white + " was not found."
            datasets = all_datasets
            return if datasets.empty?

            puts "Did you mean one of: #{datasets.collect { |d| d["slug"].white }.sort.join(", ")}"
          end
        end
      rescue Interrupt
        puts "\nINTERRUPTED".red
      end

      private

      def all_datasets
        datasets = []
        page = 1
        loop do
          new_datasets = datasets_on_page(page)
          datasets += new_datasets
          page += 1
          break unless new_datasets.size == 10
        end
        datasets
      end

      def datasets_on_page(page)
        params = { auth_token: @token, page: page }
        (datasets, _status) = Nsrr::Helpers::JsonRequest.get("#{Nsrr::WEBSITE}/api/v1/datasets.json", params)
        datasets || []
      end

      def parse_parameter(argv, options, default)
        result = default
        options.each do |option|
          result = option if argv.delete "--#{option}"
        end
        [result, argv]
      end

      def parse_parameter_with_value(argv, options, default)
        result = default
        options.each do |option|
          argv.each do |arg|
            result = arg.gsub(/^--#{option}=/, "") if arg =~ /^--#{option}=\w/
          end
        end
        [result, argv]
      end
    end
  end
end