import logging
from typing import Dict
from common.orm.fields.EnumeratedField import EnumeratedField
from common.orm.fields.FloatField import FloatField
from common.orm.fields.ForeignKeyField import ForeignKeyField
from common.orm.fields.PrimaryKeyField import PrimaryKeyField
from common.orm.fields.StringField import StringField
from common.orm.model.Model import Model
from .DeviceModel import DeviceModel
from .EndPointModel import EndPointModel
from .KpiSampleType import ORM_KpiSampleType

LOGGER = logging.getLogger(__name__)

class KpiModel(Model):
    pk = PrimaryKeyField()
    kpi_uuid = StringField(required=True, allow_empty=False)
    kpi_description = StringField(required=False, allow_empty=True)
    kpi_sample_type = EnumeratedField(ORM_KpiSampleType, required=True)
    device_fk = ForeignKeyField(DeviceModel)
    endpoint_fk = ForeignKeyField(EndPointModel)
    sampling_duration = FloatField(min_value=0, required=True)
    sampling_interval = FloatField(min_value=0, required=True)

    def dump_id(self) -> Dict:
        return {'kpi_id': {'uuid': self.kpi_uuid}}

    def dump_descriptor(self) -> Dict:
        result = {
            'kpi_description': self.kpi_description,
            'kpi_sample_type': self.kpi_sample_type.value,
        }
        if self.device_fk is not None:
            result['device_id'] = DeviceModel(self.database, self.device_fk).dump_id()
        if self.endpoint_fk is not None:
            result['endpoint_id'] = EndPointModel(self.database, self.endpoint_fk).dump_id()
        return result

    def dump(self) -> Dict:
        return {
            'kpi_id': self.dump_id(),
            'kpi_descriptor': self.dump_descriptor(),
            'sampling_duration_s': self.sampling_duration,
            'sampling_interval_s': self.sampling_interval,
        }
