#!/usr/bin/env ruby

# ---------------------------------------------------------------------------- #
# Copyright 2010-2015, C12G Labs S.L                                           #
#                                                                              #
# Licensed 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.                                               #
# ---------------------------------------------------------------------------- #

ONE_LOCATION=ENV["ONE_LOCATION"]

if !ONE_LOCATION
    RUBY_LIB_LOCATION="/usr/lib/one/ruby"
else
    RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby"
    TEMPLATES_LOCATION=ONE_LOCATION+"/etc/occi_templates"
    CONF_LOCATION=ONE_LOCATION+"/etc"
end

$: << RUBY_LIB_LOCATION
$: << RUBY_LIB_LOCATION+"/cloud"

require 'marketplace/marketplace_client'

require 'cli/command_parser'
require 'cli/cli_helper'

require 'rubygems'
require 'json'

USER_AGENT = "CLI"

#
# Options
#

DEFAULT_OPTIONS = [
    ENDPOINT = {
        :name => "server",
        :short => "-s url",
        :large => "--server url",
        :format => String,
        :description => "Marketplace endpoint"
    },
    USERNAME={
        :name => "username",
        :short => "-u name",
        :large => "--username name",
        :format => String,
        :description => "User name"
    },
    PASSWORD={
        :name => "password",
        :short => "-p pass",
        :large => "--password pass",
        :format => String,
        :description => "User password"
    }
]

JSON_FORMAT={
    :name => "json",
    :short => "-j",
    :large => "--json",
    :description => "Show in JSON format"
}

#
# Table
#

TABLE = CLIHelper::ShowTable.new(nil, self) do
    column :ID, "Appliance", :size=>25 do |d|
        d["_id"]["$oid"]
    end

    column :NAME, "Name", :size=>50 do |d|
        d["name"]
    end

    column :PUBLISHER, "Publisher", :size=>15 do |d|
        d["publisher"]
    end

    default :ID, :NAME, :PUBLISHER
end

#
# Commands
#

cmd=CommandParser::CmdParser.new(ARGV) do
    usage "`onemarket` <command> [<args>] [<options>]"

    set :option, DEFAULT_OPTIONS

    #
    # List
    #

    list_desc = <<-EOT.unindent
        List the available appliances in the Marketplace
    EOT

    command :list, list_desc, :options => JSON_FORMAT do
        client = Market::ApplianceClient.new(
                    options[:username],
                    options[:password],
                    options[:server],
                    USER_AGENT)

        response = client.list

        if CloudClient::is_error?(response)
            [response.code.to_i, response.to_s]
        else
            if options[:json]
                [0,response.body]
            else
                array_list = JSON.parse(response.body)
                TABLE.show(array_list['appliances'])
                0
            end
        end
    end

    #
    # Create
    #

    create_desc = <<-EOT.unindent
        Create a new appliance in the Marketplace
    EOT

    command :create, create_desc, :file do
        client = Market::ApplianceClient.new(
                    options[:username],
                    options[:password],
                    options[:server],
                    USER_AGENT)

        response = client.create(File.read(args[0]))

        if CloudClient::is_error?(response)
            [response.code.to_i, response.to_s]
        else
            [0, response.body]
        end
    end

    #
    # Show
    #

    show_desc = <<-EOT.unindent
        Show detailed information of a given appliance
    EOT

    command :show, show_desc, :id, :options => JSON_FORMAT do
        client = Market::ApplianceClient.new(
                    options[:username],
                    options[:password],
                    options[:server],
                    USER_AGENT)

        response = client.show(args[0])

        if CloudClient::is_error?(response)
            [response.code.to_i, response.to_s]
        else
            [0,response.body]
        end
    end
end
