module Resources

  class ConfiguredUser < BaseResource
    include ThirdPartyPrompter
    include ServiceDefinitionPrompter
    include ConfiguredUserPrompter

    def list
      tp_id = third_party_id
      sd_id = service_definition_id
      result = get("services/third_parties/#{tp_id}/service_definitions/#{sd_id}/configured_users")
      puts "\nConfigured users for third party: #{tp_id}, service definition: #{sd_id}"
      table = Terminal::Table.new headings: [ 'Service Def ID', 'User ID', 'User Name', 'Enabled', 'Password', 'Token' ] do |t|
      result.each do | configured_user |
        t << [ configured_user['service_definition_id'],
               "#{configured_user['user_name']} (#{configured_user['user_id']})",
               configured_user['username'],
               configured_user['enabled'],
               configured_user['password'],
               configured_user['token'] ]
        end
      end
      prompter.say table.to_s
      puts
    end

    def show
      tp_id = third_party_id
      sd_id = service_definition_id
      cu_id = configured_user_id
      configured_user = get("services/third_parties/#{tp_id}/service_definitions/#{sd_id}/configured_users/#{cu_id}")
      @cu_user_id = configured_user['user_id']
      @cu_username = configured_user['username']
      @cu_enabled = configured_user['enabled']
      @cu_password = configured_user['password']
      @cu_token = configured_user['token']
      puts "\nConfigured user for third party: #{tp_id}/#{options[:id]}"
      table = Terminal::Table.new headings: [ 'Service Def Id', 'User ID', 'User Name', 'Enabled', 'Password', 'Token' ] do |t|
        t << [ configured_user['service_definition_id'],
               "#{configured_user['user_name']} (#{configured_user['user_id']})",
               configured_user['username'],
               configured_user['enabled'],
               configured_user['password'],
               configured_user['token'] ]
      end
      puts table
      puts
    end

    def create
      tp_id = third_party_id
      sd_id = service_definition_id
      params = { 
        configured_user: {
          user_id: prompter.ask("\nUser ID: ", Integer) { |q| q.validate = lambda { |a| is_valid_object?('User', a) }; q.responses[:ask_on_error] = :question; q.responses[:not_valid] = "\nNot a valid User ID" },
          username: prompter.ask("\nUser name: ") { |q| q.validate = /\A.{0,255}\z/; q.responses[:ask_on_error] = :question; q.responses[:not_valid] = "\nInvalid user name" },
          enabled: prompter.agree("\nEnabled? (y/n) ", true)  
        }
      }
      puts
      password = prompter.ask("\nPassword: ")
      token = prompter.ask("\nToken: ")
      if (password && password.size > 0) || (token && token.size > 0) 
        params[:credential] = {
        }
        params[:credential][:password] = password if password && password.size > 0
        params[:credential][:token] = token if token && token.size > 0
      end
      result = post("services/third_parties/#{tp_id}/service_definitions/#{sd_id}/configured_users", params)
      puts "\nID of new configured user: #{result['id']}"
      puts
    end

    def update
      clear_default = ->(field) { field == "^" ? '' : field }
      tp_id = third_party_id
      sd_id = service_definition_id
      cu_id = configured_user_id
      show
      params = { 
        configured_user: {
          user_id: prompter.ask("\nUser ID: ", Integer) { |q| q.default = @cu_user_id; q.validate = lambda { |a| is_valid_object?('User', a) }; q.responses[:ask_on_error] = :question; q.responses[:not_valid] = "\nNot a valid User ID" },
          username: prompter.ask("\nUser name (^ to clear): ", clear_default) { |q| q.default = @cu_username; q.validate = /\A.{0,255}\z/; q.responses[:ask_on_error] = :question; q.responses[:not_valid] = "\nInvalid user name" },
          enabled: prompter.agree("\nEnabled? ", true)  { |q| q.default = @cu_enabled }
        }
      }
      puts
      password = prompter.ask("\nPassword (^ to clear): ", clear_default) { |q| q.default = @cu_password }
      token = prompter.ask("\nToken (^ to clear): ", clear_default) { |q| q.default = @cu_token }
      if (password && password.size > 0) || (token && token.size > 0) 
        params[:credential] = {
        }
        params[:credential][:password] = password if password && password.size > 0
        params[:credential][:token] = token if token && token.size > 0
      end
      result = put("services/third_parties/#{tp_id}/service_definitions/#{sd_id}/configured_users/#{cu_id}", params)
      puts "\nID of updated configured user: #{result['id']}"
      puts
    end

    def destroy
      tp_id = third_party_id
      sd_id = service_definition_id
      cu_id = configured_user_id
      show
      if prompter.agree("\nAre you sure you want to destroy this configured user? (y/n) ", true)
        puts
        result = delete("services/third_parties/#{tp_id}/service_definitions/#{sd_id}/configured_users/#{cu_id}")
        puts "\nID of deleted configured user: #{result['id']}"
      else
        puts "\nCancelled deletion"
      end
      puts
    end

  end
end