require "digicert/cli/order"
require "digicert/cli/order_reissuer"
require "digicert/cli/order_creator"
require "digicert/cli/order_duplicator"

module Digicert
  module CLI
    module Commands
      class Order < Thor
        class_option :debug, type: "boolean", desc: "Enable debug mode"

        desc "list", "List digicert orders"
        method_option :filter, type: :hash, desc: "Specify filter options"

        def list
          say(order_instance.list)
        end

        desc "find", "Find a digicert order"
        method_option :filter, type: :hash, desc: "Specify filter options"
        option :quiet, type: :boolean, aliases: "-q", desc: "Retrieve only id"

        def find
          say(order_instance.find)
        end

        desc "reissue ORDER_ID", "Reissue digicert order"
        option :csr, desc: "The CSR content from a file"
        method_option :common_name, desc: "Certificate Common Name"
        method_option :signature_hash, desc: "Certificate signature hash"
        option :output, aliases: "-o", desc: "Path to download certificates"

        def reissue(order_id)
          say(reissue_an_order(order_id))
        end

        desc "create", "Create a new order"
        method_option :csr, desc: "The CSR content from a file"
        method_option :common_name, desc: "Certificate Common Name"
        method_option :signature_hash, desc: "Certificate signature hash"
        method_option :organization_id, desc: "The Organization ID"
        method_option :validity_years, desc: "Validity years for certificate"
        method_option :comments, desc: "Comments about the certificate order"
        method_option :payment_method, desc: "Speicfy the payment method"

        method_option :disable_renewal_notifications, type: :boolean
        method_option :server_platform_id, desc: "Server Platform Id"
        method_option :profile_option, desc: "Specify certificate profile"
        method_option :organization_units, type: :array, desc: "organization_units"
        method_option :custom_expiration_date, desc: "Expiry Date in YYY-MM-DD"
        method_option :renewal_of_order_id, desc: "Id for renewalable Order"
        method_option :disable_ct, type: :boolean, desc: "Disable CT logging"

        def create(name_id)
          order = create_new_order(name_id, options)
          say("New Order Created! Oder Id: #{order.id}.")

        rescue Digicert::Errors::RequestError => error
          say("Request Error: #{error}.")
        end

        desc "duplicate ORDER_ID", "Duplicate digicert order"
        option :csr, desc: "The CSR content from a file"
        method_option :common_name, desc: "Certificate Common Name"
        method_option :signature_hash, desc: "Certificate signature hash"
        option :output, aliases: "-o", desc: "Path to download certificate"

        def duplicate(order_id)
          say(duplicate_an_order(order_id))
        end

        private

        def order_instance
          Digicert::CLI::Order.new(options)
        end

        def reissue_an_order(order_id)
          Digicert::CLI::OrderReissuer.new(
            options.merge(order_id: order_id),
          ).create
        end

        def create_new_order(name_id, options)
          Digicert::CLI::OrderCreator.create(name_id, options)
        end

        def duplicate_an_order(order_id)
          Digicert::CLI::OrderDuplicator.new(
            options.merge(order_id: order_id),
          ).create
        end
      end
    end
  end
end