"""
Verbrauchsanzeige fuer Nutzer ohne Mietvertrag.

Seit der Sync Verbrauchsrahmen ueber PersonenID + REUID zuordnet, haben
Eigentuemer-Rahmen keine MietVID. service.py suchte Dashcards und Diagramm-
werte aber ueber den Mietvertrag - fuer Eigentuemer blieb die Seite leer.
"""
from datetime import date

from django.db import connection
from django.test import TestCase

from app_nutzer.models import ReuMietV, User
from app_real_estate.models import RealEstate, RealEstateUnit
from app_verbrauch import service
from app_verbrauch.models import (
    VISysRefVerbrauchsDS, VISysVerbrauchRahmen, VISysVerbrauchsDS,
)

# managed=False – im Test gibt es die Tabellen sonst nicht.
UNMANAGED = (VISysVerbrauchRahmen, VISysVerbrauchsDS,
             VISysRefVerbrauchsDS)

JAHR = date.today().year


class VerbrauchOhneMietvertragTest(TestCase):
    @classmethod
    def setUpClass(cls):
        # Vor super(): der SQLite-Schema-Editor laeuft nicht in einer Transaktion.
        with connection.schema_editor() as editor:
            for model in UNMANAGED:
                editor.create_model(model)
        super().setUpClass()

    @classmethod
    def tearDownClass(cls):
        super().tearDownClass()
        with connection.schema_editor() as editor:
            for model in UNMANAGED:
                editor.delete_model(model)

    def setUp(self):
        re = RealEstate.objects.create(REID=92, Street='Kelterbach', HouseNumber='20',
                                       City='Echternacherbrück')
        self.reu = RealEstateUnit.objects.create(REUID=185, REID=re, REUDesc='KG')
        self.et = User(PersonenID=613, email='et@test.de', SalutationID=1, lastname='Muster')
        self.et.set_unusable_password()
        self.et.save()
        # Eigentuemer-Rahmen: REUID + PersonenID, keine MietVID
        rahmen = VISysVerbrauchRahmen.objects.create(
            PersonenID=self.et, REUID=self.reu, MietVID=None,
            Jahr=JAHR, VISysVerbrauchsArtID=service.DIAGRAMM_TYPES[0],
        )
        for monat, wert in ((1, 10.0), (2, 12.5)):
            VISysVerbrauchsDS.objects.create(
                VerBrDatID=monat, VerBrID=rahmen.VISysVerbrauchsID, VerBrWert=wert,
                VerBrSD=date(JAHR, monat, 1), VerBrED=date(JAHR, monat, 28),
            )

    def test_dashcards_fuer_eigentuemer(self):
        self.assertFalse(ReuMietV.objects.exists())
        cards = service.get_all_dash_cards_data(185, 613)
        self.assertEqual(len(cards), 1)
        self.assertEqual(cards[0]['Verbrauchswert'], '12,50')
        self.assertEqual(cards[0]['VerbrauchswertVM'], '10,00')

    def test_dashcard_monat_und_jahr_des_datensatzes(self):
        """Monatsname war um eins verschoben (Feb. als 'März'); Dezember stürzte ab."""
        card = service.get_all_dash_cards_data(185, 613)[0]
        self.assertEqual((card['MonatName'], card['Jahr']), ('Februar', JAHR))
        rahmen = VISysVerbrauchRahmen.objects.get(REUID=self.reu, Jahr=JAHR)
        VISysVerbrauchsDS.objects.create(
            VerBrDatID=12, VerBrID=rahmen.VISysVerbrauchsID, VerBrWert=5.0,
            VerBrSD=date(JAHR, 12, 1), VerBrED=date(JAHR, 12, 31),
        )
        card = service.get_all_dash_cards_data(185, 613)[0]
        self.assertEqual(card['MonatName'], 'Dezember')
        # November fehlt: der Februar ist nicht der Vormonat.
        self.assertTrue(card['VerbrauchswertVM_nv'])

    def test_diagrammwerte_fuer_eigentuemer(self):
        rows = service._fetch_verbrauchswerte(service.DIAGRAMM_TYPES[0], JAHR, 185, 613)
        self.assertEqual([r[0] for r in rows], [10.0, 12.5])

    def test_fremde_person_sieht_nichts(self):
        self.assertEqual(service.get_all_dash_cards_data(185, 999), [])
        self.assertEqual(
            service._fetch_verbrauchswerte(service.DIAGRAMM_TYPES[0], JAHR, 185, 999), [])

    def test_normierte_ansicht_ohne_ww_volumen(self):
        """111 hat keine normierte Darstellung (kein TextSpez, keine NormA-Referenz)."""
        rahmen = VISysVerbrauchRahmen.objects.create(
            PersonenID=self.et, REUID=self.reu, Jahr=JAHR, VISysVerbrauchsArtID=111)
        VISysVerbrauchsDS.objects.create(
            VerBrDatID=99, VerBrID=rahmen.VISysVerbrauchsID, VerBrWert=1.0,
            VerBrWertNormA=0.01, VerBrSD=date(JAHR, 1, 1), VerBrED=date(JAHR, 1, 31))
        arten_normiert = [c['ChartType'] for c in service.get_all_chart_data_spez(185, 613)]
        arten_absolut = [c['ChartType'] for c in service.get_all_chart_data(185, 613)]
        self.assertNotIn(111, arten_normiert)
        self.assertIn(111, arten_absolut)
