require 'json'
require 'logger'
require 'trace-component'
require 'pathname'
require 'helper-run-class'
require 'prepare-environment'

class PlanStep
    def initialize ()
        @basePath = "#{Pathname.new(Canzea::config[:catalog_location]).realpath}/catalog"
        @log = Logger.new(Canzea::config[:logging_root] + '/plans.log')
    end

    def runPhaseInstall (role, solution, test, task)

        plan = JSON.parse("{ \"plan\": [ { \"role\": \"#{role}\", \"solution\": \"#{solution}\" } ] }")

        n = Worker.new
        n.test ( test )

        start = Integer(task)
        lines = 1

        cmd = "undefined"

        begin

            plan['plan'].each do |item|
                @log.info(item['solution'])

                root = "#{@basePath}/roles/#{item['role']}/#{item['solution']}"
                if File.exist?(root) == false
                    puts "-- ERROR #{root} does not exist!"
                    raise "#{root} does not exist!"
                end

                cmd = "#{@basePath}/roles/#{item['role']}/#{item['solution']}/install.sh"
                if File.exist?(cmd)
                    lines = n.run cmd, start, lines - 1

                    @log.info "#{ lines } lines read"
                end
            end
        rescue => exception
            @log.error(cmd)
            @log.error(exception.to_s)
            @log.error(exception.backtrace)
            abort()
        end
    end

    def runPhaseConfigure (role, solution, test, task, ref="")

        plan = JSON.parse("{ \"plan\": [ { \"role\": \"#{role}\", \"solution\": \"#{solution}\" } ] }")

        n = Worker.new
        n.test ( test )

        start = Integer(task)
        lines = 1

        cmd = "undefined"

        begin

            plan['plan'].each do |item|

                root = "#{@basePath}/roles/#{item['role']}/#{item['solution']}"
                if File.exist?(root) == false
                    log "-- ERROR #{root} does not exist!"
                    raise "#{root} does not exist!"
                end

                if (test == false)
                    # Register the service with Consul, if consul is ready
                    # If metadata.json exists, then use the information to register
                    cmd = "#{@basePath}/roles/#{item['role']}/#{item['solution']}/metadata.json"
                    if File.exist?(cmd)
                        md = File.read(cmd)
                        md = JSON.parse(md)
                        if (md['services'].size() > 0)
                            svc = md['services'][0]

                            adef = {"listener"=>svc['listener'], "service"=>svc['name'], "tags"=>[ item['role'] ], "port"=>svc['port']}
                            log "-- Registering #{svc['name']}"
                            h = HelperRun.new
                            h.run "consul", "register_service", JSON.generate(adef)
                        end
                    end

                    envScript = "#{@basePath}/roles/#{item['role']}/#{item['solution']}/environment.json"
                    if File.exist?(envScript)
                        envPush = PrepareEnvironment.new
                        envPush.addToEnv "#{envScript}"
                    end

                end

                cmd = "#{@basePath}/roles/#{item['role']}/#{item['solution']}/configure.sh"
                if File.exist?(cmd)
                  lines = n.run cmd, start, lines - 1, false, ref
                end

                cmd = "#{@basePath}/roles/#{item['role']}/#{item['solution']}/enable.sh"
                if File.exist?(cmd)
                  lines = n.run cmd, start, lines - 1, false, ref
                end

                cmd = "#{@basePath}/roles/#{item['role']}/#{item['solution']}/status.sh"
                if File.exist?(cmd)
                  lines = n.run cmd, start, lines - 1, true, ref
                end

            end
        rescue => exception
            @log.error(cmd)
            @log.error(exception.to_s)
            @log.error(exception.backtrace)
            abort()
        end
    end

    def log (msg)
        puts msg
        @log.info(msg)
    end

end