#!/usr/bin/env python 

"""
Dummy sbig server. 
"""

import os
import os.path as op
import sys
import numpy as np 
import time
import struct
import datetime
from exceptions import Exception 

import inspect
import xmlrpc.client
#xmlrpclib.Marshaller.dispatch[type(0L)] = \
#    lambda _, v, w: w("<value><i8>%d</i8></value>" % v)
from xmlrpc.server import SimpleXMLRPCServer, list_public_methods

import logging 
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s: %(message)s')

DEFAULT_HOSTNAME = "127.0.0.1" ### To change
DEFAULT_PORT     = 8888
SERVER_HOSTNAME = DEFAULT_HOSTNAME
SERVER_PORT = DEFAULT_PORT

# Global vars
filter_position  = 0
temp_mode = 0
temp_setpoint = 12

def status():
    logging.info('SBIG status !')
    r = np.random.choice([2,3])

def server_open():
    logging.info('SBIG open !')
    time.sleep(0.1)
    return True

def close():
    logging.info('SBIG close !')
    time.sleep(1)
    return True

def image(exposure=12., autofreeze=True, pixels=None):
    time.sleep(exposure)
    utcnow = datetime.datetime.utcnow()
    if pixels is None:
        pixels = np.random.normal(size=765*510, loc=10000., scale=100.).astype(np.int16)
    data = {
        # FITS keys
        'DATE-OBS': utcnow.isoformat(),
        'EXPTIME': exposure,
        'FILTER': filter_position,
        'INSTRUM': 'SBIG ST-7 Dual CCD Camera',
        # temperature information (Peltier module)
        'TAMBIENT': np.random.uniform(0., 30.),
        'REG-TCCD': np.random.uniform(0., 30.),
        'REG-ENAB': 1,
        'REG-FROZ': 0,
        'REG-POWR': np.random.uniform(0., 1000.),
        'REG-SETP': np.random.uniform(-10., 10.),
        # Image
        'shape': (765,510),
        'binarydata': xmlrpc.client.Binary(pixels)}
    return data
    
def dark(exposure=1, autofreeze=True):
    pixels = np.random.normal(size=765*510, loc=0., scale=10.).astype(np.int16)
    r = image(exposure=exposure, pixels=pixels)
    return r

def set_filter(position):
    global filter_position
    filter_position = position
    return True

def get_filter():
    return filter_position

def get_temperature():
    temp_status = {
        "enabled": 0,
        "frozen": 1,
        "setpoint_ad": 1., 
        "setpoint_celsius": -25.,
        "ccd_ad": 0,
        "ccd_celsius": -20,
        "ambient_ad": 25,
        "ambient_celsius": 25,
        "power": 12.
        }
    return temp_status


def set_temperature(mode, setpoint):
    global temp_model
    global temp_setpoint
    
    temp_model = mode
    temp_setpoint = setpoint
    
    return True
    
def server_quit():
    sys.exit(0)

if __name__ == '__main__':
    # create the server 
    sbigServer = SimpleXMLRPCServer((SERVER_HOSTNAME, SERVER_PORT), allow_none=True)
    
    # general control functions 
    sbigServer.register_function(status,       "status")
    sbigServer.register_function(server_open,  "open")
    sbigServer.register_function(close,        "close")
    sbigServer.register_function(image,             "image")
    sbigServer.register_function(dark,             "dark")
    sbigServer.register_function(set_filter,        "set_filter")
    sbigServer.register_function(get_filter,        "get_filter")
    sbigServer.register_function(get_temperature,   "get_temperature")
    sbigServer.register_function(set_temperature,   "set_temperature")
    sbigServer.register_function(server_quit,       "quit")

    logging.info("Sbig: listening on port %s:%d. Waiting for commands." % 
                 (SERVER_HOSTNAME, SERVER_PORT) )
    
    sbigServer.serve_forever()
    
