#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Risks calculates all the risks associated to the health information
(healthInfo) of a person and created the output dictionary.
These risks are currently divided by categories:
  - analytic risks.
  - anthropometry risks.
  - cardiovascular risks.
  - hypertension risks.

@author: Vertigo BioSystems
"""
import logging

from ....src.vbs_riskmap.risk.AnalyticRisk import AnalyticRisk
from ....src.vbs_riskmap.risk.AnthropometryRisk import AnthropometryRisk
from ....src.vbs_riskmap.risk.BreastCancerRisk import BreastCancerRisk
from ....src.vbs_riskmap.risk.CardiovascularRisk import CardiovascularRisk
from ....src.vbs_riskmap.risk.DiabetesMellitusRisk import DiabetesMellitusRisk
from ....src.vbs_riskmap.risk.HypertensionRisk import HypertensionRisk
from ....src.vbs_riskmap.risk.LungCancerRisk import LungCancerRisk


class Risks:

    # Global scale values of the RISKS
    TOO_LOW = 0
    LOW = 10
    NORMAL = 20
    MEDIUM = 30
    HIGH = 40
    TOO_HIGH = 50

    # Keywords used for the risks
    # analytic_risk
    KEY_CALCIUM_TEST = "risk_calcium_test"
    KEY_IRON_TEST = "risk_iron_test"
    KEY_SODIUM_TEST = "risk_sodium_test"
    KEY_POTASSIUM_TEST = "risk_potassium_test"
    KEY_DVITAMIN_TEST = "risk_Dvitamin_test"
    KEY_HEMOGLOBINE_TEST = "risk_hemoglobine_test"
    KEY_LEUCOCYTES_TEST = "risk_leucocytes_test"
    KEY_B12VITAMIN_TEST = "risk_B12vitamin_test"
    KEY_CHOLESTEROL_HDL_TEST = "risk_cholesterol_hdl"
    KEY_CHOLESTEROL_LDL_TEST = "risk_cholesterol_ldl"
    KEY_URIC_ACID_TEST = "risk_uric_acid"
    KEY_TRYGLICERIDES_TEST = "risk_tryglicerides"
    # anthropometry_risk
    KEY_BMI = "risk_bmi"
    KEY_RESTING_ENERGY_EXPENDITURE = "risk_resting_energy_expenditure"
    KEY_WAIST_HIP = "risk_waist_hip"
    # cardiovascular_risk
    KEY_COX_CARDIOVASCULAR = "risk_cox_cardiovascular_test"
    KEY_FRAMINGHAM_TEST = "risk_framingham_test"
    KEY_HEART_AGE = "risk_heart_age"
    # diabetes_mellitus_risk
    KEY_DIABETES_M = "risk_diabetes_mellitus"
    KEY_DIABETES_M_REGRES = "risk_diabetes_mellitus_regression"
    # hypertension_risk
    KEY_HYPERTENSION_TEST = "risk_hypertension_test"
    KEY_BREAST_CANCER_TEST = "risk_breast_cancer_test"
    # lung_cancer_risk
    KEY_LUNG_CANCER_TEST_16 = "risk_lung_cancer_test_16_years"
    KEY_LUNG_CANCER_TEST_6 = "risk_lung_cancer_test_6_years"

    def __init__(self, health_info):
        self.health_info = health_info
        self.analytic_risk = AnalyticRisk(health_info)
        self.anthropometry_risk = AnthropometryRisk(health_info)
        self.breast_cancer_risk = BreastCancerRisk(health_info)
        self.cardiovascular_risk = CardiovascularRisk(health_info)
        self.diabetes_mellitus_risk = DiabetesMellitusRisk(health_info)
        self.hypertension_risk = HypertensionRisk(health_info)
        self.lung_cancer_risk = LungCancerRisk(health_info)

        self.output = {}  # dictionary with person's risks

        # all methods (cardiovascular_risk...) could be possible execute here

    @property
    def output(self):
        """Return a dictionary with all the risks calculated"""
        return self.__output

    @output.setter
    def output(self, output):
        """This ouput setter should not be used as a public function."""
        self.__output = output

    def label_output(self, output):
        """This function is used to return the key when it is a label/string"""
        return {"label": output}

    def value_output(self, output):
        """This function is used to return the key when it is a value/number"""
        return {"value": output}

    def all_risks(self):

        # Calculating ALL THE RISKS
        self.analytic_risks()
        self.anthropometry_risks()
        self.breast_cancer_risks()
        self.cardiovascular_risks()
        self.hypertension_risks()
        self.diabetes_mellitus_risks()
        self.lung_cancer_risks()

        logging.info("Risks: All RISKS calculated and ending successfully.")

    def analytic_risks(self):
        """
        Calculates analytic risks.

        """
        # risk_iron_test
        self.risk_iron_test = self.analytic_risk.risk_iron_test()
        self.output[self.KEY_IRON_TEST] = \
            self.label_output(self.risk_iron_test)
        self.output[self.KEY_IRON_TEST].update(self.value_output(self.health_info.analytics.iron))

        # risk_calcium_test
        self.risk_calcium_test = self.analytic_risk.risk_calcium_test()
        self.output[self.KEY_CALCIUM_TEST] = \
            self.label_output(self.risk_calcium_test)
        self.output[self.KEY_CALCIUM_TEST].update(self.value_output(self.health_info.analytics.calcium))

        # risk_sodium_test
        self.risk_sodium_test = self.analytic_risk.risk_sodium_test()
        self.output[self.KEY_SODIUM_TEST] = \
            self.label_output(self.risk_sodium_test)
        self.output[self.KEY_SODIUM_TEST].update(self.value_output(self.health_info.analytics.sodium))

        # risk_potassium_test
        self.risk_potassium_test = self.analytic_risk.risk_potassium_test()
        self.output[self.KEY_POTASSIUM_TEST] = \
            self.label_output(self.risk_potassium_test)
        self.output[self.KEY_POTASSIUM_TEST].update(self.value_output(self.health_info.analytics.potassium))

        # risk_Dvitamin_test
        self.risk_Dvitamin_test = self.analytic_risk.risk_Dvitamin_test()
        self.output[self.KEY_DVITAMIN_TEST] = \
            self.label_output(self.risk_Dvitamin_test)
        self.output[self.KEY_DVITAMIN_TEST].update(self.value_output(self.health_info.analytics.Dvitamin))

        # risk_hemoglobine_test
        self.risk_hemoglobine_test = self.analytic_risk.risk_hemoglobine_test()
        self.output[self.KEY_HEMOGLOBINE_TEST] = \
            self.label_output(self.risk_hemoglobine_test)
        self.output[self.KEY_HEMOGLOBINE_TEST].update(self.value_output(self.health_info.analytics.hemoglobine))

        # risk_leucocytes_test
        self.risk_leucocytes_test = self.analytic_risk.risk_leucocytes_test()
        self.output[self.KEY_LEUCOCYTES_TEST] = \
            self.label_output(self.risk_leucocytes_test)
        self.output[self.KEY_LEUCOCYTES_TEST].update(self.value_output(self.health_info.analytics.leucocytes))

        # risk_B12vitamin_test
        self.risk_B12vitamin_test = self.analytic_risk.risk_B12vitamin_test()
        self.output[self.KEY_B12VITAMIN_TEST] = \
            self.label_output(self.risk_B12vitamin_test)
        self.output[self.KEY_B12VITAMIN_TEST].update(self.value_output(self.health_info.analytics.B12vitamin))

        # risk_cholesterol_hdl_test
        self.risk_cholesterol_hdl_test = self.analytic_risk.\
            risk_cholesterol_hdl_test()
        self.output[self.KEY_CHOLESTEROL_HDL_TEST] = \
            self.label_output(self.risk_cholesterol_hdl_test)
        self.output[self.KEY_CHOLESTEROL_HDL_TEST].update(self.value_output(self.health_info.analytics.cholesterol_hdl))

        # risk_cholesterol_ldl_test
        self.risk_cholesterol_ldl_test = \
            self.analytic_risk.risk_cholesterol_ldl_test()
        self.output[self.KEY_CHOLESTEROL_LDL_TEST] = \
            self.label_output(self.risk_cholesterol_ldl_test)
        self.output[self.KEY_CHOLESTEROL_LDL_TEST].update(self.value_output(self.health_info.analytics.cholesterol_ldl))

        # risk_uric_acid
        self.risk_uric_acid_test = self.analytic_risk.risk_uric_acid_test()
        self.output[self.KEY_URIC_ACID_TEST] = \
            self.label_output(self.risk_uric_acid_test)
        self.output[self.KEY_URIC_ACID_TEST].update(self.value_output(self.health_info.analytics.uric_acid))

        # risk_tryglicerides_test
        self.risk_tryglicerides_test = \
            self.analytic_risk.risk_tryglicerides_test()
        self.output[self.KEY_TRYGLICERIDES_TEST] = \
            self.label_output(self.risk_tryglicerides_test)
        self.output[self.KEY_TRYGLICERIDES_TEST].update(self.value_output(self.health_info.analytics.triglycerides))

        logging.info("Risks: Analytic risks calculated.")

    def anthropometry_risks(self):
        """
        Calculates anthropometry risks.

        """
        # risk_bmi
        self.risk_bmi = self.anthropometry_risk.risk_bmi()
        self.output[self.KEY_BMI] = self.label_output(self.risk_bmi[0])
        self.output[self.KEY_BMI].update(self.value_output(self.risk_bmi[1]))

        # risk_resting_energy_expenditure
        self.risk_resting_energy_expenditure = self.anthropometry_risk.\
            risk_resting_energy_expenditure()
        self.output[self.KEY_RESTING_ENERGY_EXPENDITURE] = \
            self.value_output(self.risk_resting_energy_expenditure)

        # waist_hip_risk
        self.risk_waist_hip = self.anthropometry_risk.risk_waist_hip()
        self.output[self.KEY_WAIST_HIP] = \
            self.label_output(self.risk_waist_hip[0])
        self.output[self.KEY_WAIST_HIP].\
            update(self.value_output(self.risk_waist_hip[1]))

        logging.info("Risks: Anthropometry risks calculated.")

    def breast_cancer_risks(self):
        """
        Calculates breast cancer risks.

        """
        # breast_cancer_risk_test
        self.breast_cancer = self.breast_cancer_risk.risk_breast_cancer_test()
        self.output[self.KEY_BREAST_CANCER_TEST] = \
            self.value_output(self.breast_cancer)

        logging.info("Risks: Breast Cancer risks calculated.")

    def cardiovascular_risks(self):
        """
        Calculates cardiovascular risks.

        """
        # risk_cox_cardiovascular_test
        self.cox_cardiovascular = self.cardiovascular_risk.\
            risk_cox_cardiovascular_test()
        self.output[self.KEY_COX_CARDIOVASCULAR] = \
            self.value_output(self.cox_cardiovascular)

        # risk_framingham_test
        self.framingham_test = self.cardiovascular_risk.\
            risk_framingham_test()
        self.output[self.KEY_FRAMINGHAM_TEST] = \
            self.value_output(self.framingham_test)

        # risk_heart_age
        self.heart_age = self.cardiovascular_risk.risk_heart_age()
        self.output[self.KEY_HEART_AGE] = self.value_output(self.heart_age)

        logging.info("Risks: Cardiovascular risks calculated.")

    def hypertension_risks(self):
        """
        Calculates hypertension risks.

        """
        # hypertension_risk_test
        self.hypertension_test = \
            self.hypertension_risk.risk_hypertension_test()
        self.output[self.KEY_HYPERTENSION_TEST] = \
            self.value_output(self.hypertension_test)

        logging.info("Risks: Hypertension risks calculated.")

    def diabetes_mellitus_risks(self):
        """
        Calculates diabetes mellitus risks.

        """
        # diabetes_mellitus
        self.diabetes_m = self.diabetes_mellitus_risk.risk_diabetes_mellitus()
        self.output[self.KEY_DIABETES_M] = \
            self.value_output(self.diabetes_m)
        # diabetes_mellitus_regression
        self.diabetes_m_regression = \
            self.diabetes_mellitus_risk.risk_diabetes_mellitus_regression()
        self.output[self.KEY_DIABETES_M_REGRES] = \
            self.value_output(self.diabetes_m_regression)

        logging.info("Risks: Diabetes Mellitus risks calculated.")

    def lung_cancer_risks(self):
        """
        Calculates lung cancer risks.

        """
        # lung_cancer_test_16_years
        self.lung_cancer_test_16_years = \
            self.lung_cancer_risk.risk_lung_cancer_test_16_years()
        self.output[self.KEY_LUNG_CANCER_TEST_16] = \
            self.value_output(self.lung_cancer_test_16_years)
        # lung_cancer_test_6_years
        self.lung_cancer_test_6_years = \
            self.lung_cancer_risk.risk_lung_cancer_test_6_years()
        self.output[self.KEY_LUNG_CANCER_TEST_6] = \
            self.value_output(self.lung_cancer_test_6_years)

        logging.info("Risks: Lung Cancer risks calculated.")

