#!/usr/bin/env python

'''
The deploy.tk Foreman server
'''

import sys
import os
import socket
import multiprocessing
import platform
import json
import logging

import deploytk
import pyaas

pyaas.argparser.add_argument('--manager', '-m',
    help='Specify the manager to connect to'
    )

class Application(pyaas.server.Application):
    def __init__(self):
        manager = pyaas.args.manager or pyaas.config.get('foreman', 'manager')

        self.jobs = dict()

        self.patterns = [
            ( r'/', pyaas.handlers.Protected, {'template':'foreman'} )
        ]

        pyaas.server.Application.__init__(self, 'foreman')

        self.dealer = deploytk.zmqsockets.Dealer(recv=self.OnCommand).Connect(host=manager, port=12001)

        self.Identify()

    def Identify(self):
        details = dict(
            id        = socket.getfqdn(),
            system    = platform.system(),
            cpu_count = multiprocessing.cpu_count(),
            )

        self.dealer.Send('Identify', json.dumps(details))

    def OnCommand(self, args):
        logging.info('Data: %s', args)

        # TODO: should probably verify the integrity of the message

        function = getattr(self, 'On_'+args[0], None)
        if not function:
            logging.error('Unknown action %s', args[0])
            return

        logging.debug('Command "%s"', args[0])

        function(*args[1:])

    def On_AddJobs(self, jobs):
        jobs = json.loads(jobs)
        print 'Add these jobs:', jobs
        #self.jobs[job['id']] = job
        #print 'Adding job', len(self.jobs), job

    def On_AddJob(self, job):
        job = json.loads(job)
        self.jobs[job['id']] = job
        print('Adding job', len(self.jobs), job)

    def On_StartJob(self, start):
        start = json.loads(start)
        if 'id' not in start:
            logging.error('Missing job id')
            return

        job = self.jobs.get(start['id'], None)
        if not job:
            logging.error('Unknown job: %s', start['id'])
            return

        print('Start job:', job)

def main():
    try:
        pyaas.util.setPrefix()
        pyaas.util.setNameSpace('deploytk')
        
        pyaas.settings.load('foreman')

        app = Application()

        try:
            app.Listen()
        except KeyboardInterrupt:
            app.Stop()

    except pyaas.error as e:
        sys.stderr.write('ERROR: %s: %s\n' % (sys.argv[0], e))
        sys.exit(-1)

if '__main__' == __name__:
    main()
