from flask import render_template
from flask_login import current_user
from app.extensions import db
from app.models.lv import LVPosition

TEMPLATE = 'components/modul_sas_mecka.html'

def get_formular_html():
    return render_template(TEMPLATE)


def _lookup_pos(pos_nr):
    lv_pos = LVPosition.query.filter_by(
        company_id=current_user.company_id,
        pos_nr=pos_nr
    ).first()
    if lv_pos:
        return {'pos_nr': lv_pos.pos_nr, 'kurztext': lv_pos.kurztext,
                'einheit': lv_pos.einheit, 'einzelpreis': lv_pos.einzelpreis}
    return {'pos_nr': pos_nr, 'kurztext': f'Position {pos_nr}',
            'einheit': 'ST', 'einzelpreis': 0}


def _make_pos(pos_nr, faktor=1.0, laenge=0, breite=0, tiefe=0,
              menge=None, bemerkung='', abschnitt=''):
    lv = _lookup_pos(pos_nr)
    pos = {'pos_nr': pos_nr, 'kurztext': lv['kurztext'],
           'einheit': lv['einheit'], 'einzelpreis': lv['einzelpreis'],
           'faktor': faktor, 'laenge': laenge, 'breite': breite, 'tiefe': tiefe,
           'bemerkung': bemerkung, 'abschnitt': abschnitt}
    if menge is not None:
        pos['menge'] = menge
    return pos


def berechne(form_data):
    positionen = []
    abschnitt_ha = form_data.get('scan_name_ha', '')

    # ── HA (Hausanschluss) ──
    if form_data.get('ha_herstellen') == 'an':
        for pnr in ['01.06.0001', '01.06.0003', '01.06.0007']:
            positionen.append(_make_pos(pnr, faktor=1.0, menge=1,
                                        abschnitt=abschnitt_ha))

        anz_qkr = _float(form_data.get('anz_qkr', 0))
        anz_qst = _float(form_data.get('anz_qst', 0))
        if anz_qkr > 0:
            bem = "Siehe Bild: "
            positionen.append(_make_pos('01.03.0019',
                faktor=anz_qst if anz_qst > 0 else 1,
                laenge=1.0, menge=1.0, bemerkung=bem,
                abschnitt=abschnitt_ha))
            positionen.append(_make_pos('01.03.0020',
                faktor=anz_qkr, laenge=0.5, menge=0.5,
                bemerkung=bem, abschnitt=abschnitt_ha))

        trmeter = _float(form_data.get('trassenmeter', 0))
        strqm_ha = _float(form_data.get('strqm', 0))
        if trmeter > 0:
            positionen.append(_make_pos('01.06.0004',
                faktor=1.0, laenge=trmeter,
                abschnitt=abschnitt_ha))

            einzug10 = form_data.get('einzug_10er') == 'an'
            if einzug10:
                positionen.append(_make_pos('01.04.0003',
                    faktor=1.0, laenge=trmeter, menge=trmeter,
                    abschnitt=abschnitt_ha))
                positionen.append(_make_pos('01.06.0006',
                    faktor=1.0, laenge=trmeter, menge=trmeter,
                    abschnitt=abschnitt_ha))
            else:
                leange = trmeter + 1 + strqm_ha
                positionen.append(_make_pos('01.06.0006',
                    faktor=1.0, laenge=leange,
                    abschnitt=abschnitt_ha))

        kabelm_ha = _float(form_data.get('kabelmeter_ha', 0))
        if kabelm_ha > 0:
            bem = "Siehe Bild: "
            positionen.append(_make_pos('01.03.0019',
                faktor=1.0, laenge=kabelm_ha, menge=kabelm_ha,
                bemerkung=bem, abschnitt=abschnitt_ha))
            positionen.append(_make_pos('01.03.0020',
                faktor=1.0, laenge=kabelm_ha, menge=kabelm_ha,
                bemerkung=bem, abschnitt=abschnitt_ha))

        if strqm_ha > 0:
            positionen.append(_make_pos('01.03.0008',
                faktor=1.0, laenge=strqm_ha, menge=strqm_ha,
                bemerkung="Öffentlicherbereich ", abschnitt=abschnitt_ha))

        anz_sh = _float(form_data.get('anz_suchgrube_ha', 0))
        if anz_sh > 0:
            positionen.append(_make_pos('01.03.0018',
                faktor=1.0, menge=anz_sh,
                bemerkung="Öffentlicherbereich ", abschnitt=abschnitt_ha))

    # ── TB (Tiefbau) ──
    tb_laenge = _float(form_data.get('tb_laenge', 0))
    tb_tiefe = _float(form_data.get('tb_tiefe', 0))
    abschnitt_tb = form_data.get('scan_name_tb', '')

    if tb_laenge > 0 and tb_tiefe > 0:
        if tb_tiefe <= 0.65:
            tief_key = '0.6'
        elif tb_tiefe <= 0.9:
            tief_key = '0.8'
        else:
            tief_key = '1.2'

        tiefe_map = {
            '0.6': {'unbe': '01.03.0001', 'be_kg2': '01.03.0004',
                    'be_kg4': '01.03.0005', 'be_kg6': '01.03.0006'},
            '0.8': {'unbe': '01.03.0002', 'be_kg2': '01.03.0008',
                    'be_kg4': '01.03.0009', 'be_kg6': '01.03.0010'},
            '1.2': {'unbe': '01.03.0003', 'be_kg2': '01.03.0012',
                    'be_kg4': '01.03.0013', 'be_kg6': '01.03.0014'},
        }

        tm = tiefe_map[tief_key]
        if form_data.get('tb_unbefestigt') == 'an':
            positionen.append(_make_pos(tm['unbe'],
                faktor=1.0, laenge=tb_laenge,
                abschnitt=abschnitt_tb))

        if form_data.get('tb_befestigt') == 'an':
            for kg_key, map_key in [('tb_kg2', 'be_kg2'), ('tb_kg4', 'be_kg4'),
                                     ('tb_kg6', 'be_kg6')]:
                if form_data.get(kg_key) == 'an':
                    positionen.append(_make_pos(tm[map_key],
                        faktor=1.0, laenge=tb_laenge,
                        abschnitt=abschnitt_tb))

        anz_4x20 = _float(form_data.get('tb_anz_4x12', 0))
        if anz_4x20 > 0:
            positionen.append(_make_pos('01.04.0001',
                faktor=anz_4x20, laenge=tb_laenge, menge=tb_laenge,
                bemerkung=f"{int(anz_4x20)}x 4x20 Rohre",
                abschnitt=abschnitt_tb))

        anz_12x10 = _float(form_data.get('tb_anz_12x10', 0))
        if anz_12x10 > 0:
            positionen.append(_make_pos('01.04.0002',
                faktor=anz_12x10, laenge=tb_laenge, menge=tb_laenge,
                bemerkung=f"{int(anz_12x10)}x 12x10 Rohre",
                abschnitt=abschnitt_tb))

    tb_anz_qs = _float(form_data.get('tb_anz_qs', 0))
    if tb_anz_qs > 0:
        bem = "Siehe Bild: "
        tb_anz_qk = _float(form_data.get('tb_anz_qk', 0))
        positionen.append(_make_pos('01.03.0019',
            faktor=tb_anz_qs, laenge=1.0, menge=1.0,
            bemerkung=bem, abschnitt=abschnitt_tb))
        positionen.append(_make_pos('01.03.0020',
            faktor=tb_anz_qk if tb_anz_qk > 0 else 1,
            laenge=0.5, menge=0.5, bemerkung=bem,
            abschnitt=abschnitt_tb))

    tb_kabelm = _float(form_data.get('tb_kabelmeter', 0))
    if tb_kabelm > 0:
        bem = "Siehe Bild: "
        positionen.append(_make_pos('01.03.0019',
            faktor=1.0, laenge=tb_kabelm, menge=tb_kabelm,
            bemerkung=bem, abschnitt=abschnitt_tb))
        positionen.append(_make_pos('01.03.0020',
            faktor=1.0, laenge=tb_kabelm, menge=tb_kabelm,
            bemerkung=bem, abschnitt=abschnitt_tb))

    anz_tb_sg = _float(form_data.get('tb_anz_suchgrube', 0))
    if anz_tb_sg > 0:
        positionen.append(_make_pos('01.03.0018',
            faktor=1.0, menge=anz_tb_sg,
            bemerkung="Öffentlicherbereich ", abschnitt=abschnitt_tb))

    return positionen


def _float(val, default=0):
    try:
        return float(str(val).replace(',', '.'))
    except (ValueError, TypeError):
        return default
