"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 16.02.23

"""
from compensation.models import Compensation, EcoAccount
from compensation.utils.quality import CompensationQualityChecker, EcoAccountQualityChecker
from ema.models import Ema
from ema.utils.quality import EmaQualityChecker
from intervention.models import Intervention
from intervention.utils.quality import InterventionQualityChecker
from konova.management.commands.setup import BaseKonovaCommand
from user.models import User


class Command(BaseKonovaCommand):
    help = "Runs quality check on recorded entries"

    __interventions = []
    __compensations = []
    __ecoaccount = []
    __ema = []

    def handle(self, *args, **options):
        self.__get_objects()
        self.perform_quality_check()

    def __get_objects(self):
        _filter = {
            "recorded_id__isnull": False,
        }
        self.__interventions = Intervention.objects.filter(**_filter)
        self.__compensations = Compensation.objects.filter(
            intervention__recorded_id__isnull=False
        )
        self.__ecoaccount = EcoAccount.objects.filter(**_filter)
        self.__ema = Ema.objects.filter(**_filter)

    def perform_quality_check(self):
        """ Performs quality check and unrecords failing entries

        """

        _runs = [
            #(self.__interventions, InterventionQualityChecker),
            (self.__compensations, CompensationQualityChecker),
            #(self.__ecoaccount, EcoAccountQualityChecker),
            #(self.__ema, EmaQualityChecker),
        ]
        invalid_entries = set()
        admin_user = User.objects.get(
            username="kspRoot"
        )
        for run in _runs:
            entries = run[0]
            CheckerClass = run[1]
            for entry in entries:
                checker = CheckerClass(entry)
                checker.run_check()
                if not checker.valid and CheckerClass is CompensationQualityChecker:
                    invalid_entries.add(entry.intervention)
        for e in invalid_entries:
            e.set_unrecorded(user=admin_user)
            self._write_warning(e.identifier)
