#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""CentralLogger device server receiving logs from SendingDS server"""
import sys
import time
import logging
from PyTango import server, DeviceProxy, Database, DbDevInfo, DevState, DebugIt, AttrQuality, AttrWriteType, DispLevel 
from PyTango.server import Device, DeviceMeta, attribute, command, run, device_property


"""CentralLogger device server class"""
class CentralLogger(Device):
    __metaclass__ = DeviceMeta

    def init_device(self):
        Device.init_device(self)
        self.set_state(DevState.STANDBY)
        self.info_stream("Init CentralLogger Device.")

    @command(dtype_in='DevVarLongStringArray', dtype_out=None)
    def SetCentralLoggingLevel(self, element_devices_and_levels):
        CentralLoggingLevel = element_devices_and_levels[0][:]
        CentralLoggingDevice = element_devices_and_levels[1][:]
        i = 0
        while i < len(CentralLoggingLevel[:]):
            self.info_stream("%s,%s", CentralLoggingLevel[i], CentralLoggingDevice[i])
            dev1 = DeviceProxy(CentralLoggingDevice[i])
            dev1.centralLoggingLevel = CentralLoggingLevel[i]
            property_names = ["logging_level",
                              "logging_target",
                             ]
            dev_properties = dev1.get_property(property_names)
            dev_properties["logging_level"] = ["DEBUG"]
            dev_properties["logging_target"].append("device::central/cdev/cdev1")
            dev1.put_property(dev_properties)
            dev1.add_logging_target("device::central/cdev/cdev1")
            i+=1

    """Logs are received from all element devices at all levels.
       Filtering happens within the log function depending upon
       CentralLoggingLevel of each element device.
       NOTE : This fiteration logic is still under consideration."""
    @command(dtype_in='DevVarStringArray', dtype_out=None)
    def log(self, details):
        cmessage = details[3]
        clevel = details[1]
        tango_log_level = {"FATAL": 1, "ERROR": 2, "WARN": 3, "INFO": 4, "DEBUG": 5}
        level_number = tango_log_level[clevel]
        clogsource = details[2]
        if clogsource == details[2]:
            device = DeviceProxy(clogsource)
            deviceLogLevel = device.centralLoggingLevel

            if clevel == "FATAL" and level_number <= deviceLogLevel:
                self.fatal_stream("%s : %s", clogsource, cmessage)
            elif clevel == "ERROR" and level_number <= deviceLogLevel:
                self.error_stream("%s : %s", clogsource, cmessage)
            elif clevel == "WARN" and level_number <= deviceLogLevel:
                self.warn_stream("%s : %s", clogsource, cmessage)
            elif clevel == "INFO" and level_number <= deviceLogLevel:
                self.info_stream("%s : %s", clogsource, cmessage)
            elif clevel == "DEBUG" and level_number <= deviceLogLevel:
                self.debug_stream("%s : %s", clogsource, cmessage)
            else:
                pass
        else:
            pass

run((CentralLogger,))