from flask import render_template

TEMPLATE = 'components/modul_graben.html'

def get_formular_html():
    return render_template(TEMPLATE)

def berechne(form_data):
    positionen = []
    l = _float(form_data.get('laenge', 0))
    b = _float(form_data.get('breite', 0))
    t = _float(form_data.get('tiefe', 0))
    asphalt = _float(form_data.get('asphaltstaerke', 0))
    rest_l = _float(form_data.get('rest_laenge', 0))
    rest_b = _float(form_data.get('rest_breite', 0))
    anz_einz = _int(form_data.get('anz_einzeiler', 0))
    lm_bre = _float(form_data.get('lm_bre', 0))
    abschnitt = form_data.get('abschnitt', '')
    bemerkung = form_data.get('bemerkung', '')

    if l <= 0 or b <= 0 or t <= 0:
        return positionen

    vol = l * b * t / 100

    # Mindertiefe
    mind_lt = form_data.get('mind_langstrasse') == 'an'
    mind_ftth = form_data.get('mind_ftth_ha') == 'an'
    if mind_lt:
        positionen.append({'pos_nr': '10037491', 'kurztext': 'Mindertiefe Längstrasse', 'menge': vol, 'einheit': 'M3', 'laenge': l, 'breite': b, 'tiefe': t, 'bemerkung': bemerkung, 'abschnitt': abschnitt})
    if mind_ftth:
        positionen.append({'pos_nr': '10037492', 'kurztext': 'Mindertiefe FTTH Hausanschluss', 'menge': vol, 'einheit': 'M3', 'laenge': l, 'breite': b, 'tiefe': t, 'bemerkung': bemerkung, 'abschnitt': abschnitt})

    # Oberfläche - mehrere Checkboxen möglich
    oberfl_checks = [
        ('ob_wiese', '10037463', 'Graben in Wiese herstellen'),
        ('ob_kies', '10037464', 'Graben in Kies herstellen'),
        ('ob_asphalt', '10037465', 'Graben in Asphalt herstellen'),
        ('ob_pflaster', '10037466', 'Graben in Pflaster herstellen'),
        ('ob_mosaik', '10037467', 'Graben in Mosaik herstellen'),
        ('ob_bodentausch', '10037468', 'Graben mit Bodentausch herstellen'),
        ('ob_fels', '10037469', 'Graben in Fels herstellen'),
        ('ob_winterbau', '10037470', 'Graben im Winterbau herstellen'),
        ('ob_gr_natur_pfl', '10037471', 'Graben in Groß/Natursteinpflaster herstellen'),
        ('ob_in_beton', '10037472', 'Graben in Beton Pflaster/Mosaik herstellen'),
    ]
    for key, pnr, txt in oberfl_checks:
        if form_data.get(key) == 'an':
            positionen.append({'pos_nr': pnr, 'kurztext': txt, 'menge': vol, 'einheit': 'M3', 'laenge': l, 'breite': b, 'tiefe': t, 'bemerkung': bemerkung, 'abschnitt': abschnitt})

    # Asphalt durchtrennen
    if asphalt > 0:
        positionen.append({'pos_nr': '10037473', 'kurztext': 'Asphaltdecke durchtrennen', 'menge': l, 'einheit': 'M', 'laenge': l, 'bemerkung': bemerkung, 'abschnitt': abschnitt})

    # Reststreifen
    if rest_l > 0 and rest_b > 0:
        positionen.append({'pos_nr': '10037480', 'kurztext': 'Reststreifen herstellen', 'menge': rest_l * rest_b / 100, 'einheit': 'M3', 'laenge': rest_l, 'breite': rest_b, 'bemerkung': bemerkung, 'abschnitt': abschnitt})

    # Bord/Rinne/Einzeiler
    bord = form_data.get('bord') == 'an'
    kante = form_data.get('kante') == 'an'
    rinne = form_data.get('rinne') == 'an'
    liefern = form_data.get('liefern') == 'an'
    if bord:
        positionen.append({'pos_nr': '10037481', 'kurztext': 'Bordstein setzen', 'menge': l, 'einheit': 'M', 'laenge': l, 'bemerkung': bemerkung, 'abschnitt': abschnitt})
    if kante:
        positionen.append({'pos_nr': '10037482', 'kurztext': 'Kantenstein setzen', 'menge': l, 'einheit': 'M', 'laenge': l, 'bemerkung': bemerkung, 'abschnitt': abschnitt})
    if rinne:
        positionen.append({'pos_nr': '10037483', 'kurztext': 'Einzeiler/Rinne setzen', 'menge': l, 'einheit': 'M', 'laenge': l, 'bemerkung': bemerkung, 'abschnitt': abschnitt})
    if liefern and (bord or kante or rinne):
        positionen.append({'pos_nr': '10037484', 'kurztext': 'Bord/Rinne/Einzeiler liefern', 'menge': anz_einz if anz_einz > 0 else 1, 'einheit': 'ST', 'bemerkung': bemerkung, 'abschnitt': abschnitt})
    if anz_einz > 0:
        positionen.append({'pos_nr': '10037485', 'kurztext': f'Einzeiler ({anz_einz} Stk)', 'menge': anz_einz, 'einheit': 'ST', 'bemerkung': bemerkung, 'abschnitt': abschnitt})

    # Medien
    medien_map = [
        ('cu_kabel', '10037450', f'6-100 DA CU-Kabel ({_int(form_data.get("anz_cu",0))} DA)', _int(form_data.get('anz_cu',0)), 'DA'),
        ('cu_kabel_gr', '10037451', f'> 100 DA CU-Kabel ({_int(form_data.get("anz_cu",0))} DA)', _int(form_data.get('anz_cu',0)), 'DA'),
        ('dn110', '10037452', f'DN110 ({_int(form_data.get("anz_dn110",0))} Stk)', _int(form_data.get('anz_dn110',0)), 'ST'),
        ('dn50_1', '10037453', f'1xDN50 ({_int(form_data.get("anz_dn50_1",0))} Stk)', _int(form_data.get('anz_dn50_1',0)), 'ST'),
        ('dn50_2', '10037454', f'2xDN50 ({_int(form_data.get("anz_dn50_2",0))} Stk)', _int(form_data.get('anz_dn50_2',0)), 'ST'),
        ('dn50_3', '10037455', f'3xDN50 ({_int(form_data.get("anz_dn50_3",0))} Stk)', _int(form_data.get('anz_dn50_3',0)), 'ST'),
        ('snrve_7x12', '10037456', f'SNRVe 7x12 ({_int(form_data.get("anz_snrve_7x12",0))} Stk)', _int(form_data.get('anz_snrve_7x12',0)), 'ST'),
        ('snrve_22x7', '10037457', f'SNRVe 22x7 ({_int(form_data.get("anz_snrve_22x7",0))} Stk)', _int(form_data.get('anz_snrve_22x7',0)), 'ST'),
        ('snrve_8x7', '10037458', f'SNRVe 8x7 ({_int(form_data.get("anz_snrve_8x7",0))} Stk)', _int(form_data.get('anz_snrve_8x7',0)), 'ST'),
        ('snrve_1x7', '10037459', f'SNRVe 1x7 ({_int(form_data.get("anz_snrve_1x7",0))} Stk)', _int(form_data.get('anz_snrve_1x7',0)), 'ST'),
    ]
    for key, pnr, txt, menge, eh in medien_map:
        if form_data.get(key) == 'an' and menge > 0:
            positionen.append({'pos_nr': pnr, 'kurztext': txt, 'menge': menge, 'einheit': eh, 'bemerkung': bemerkung, 'abschnitt': abschnitt})

    # Trasse einmessen
    if form_data.get('trasseeinmessen') == 'an':
        positionen.append({'pos_nr': '10037486', 'kurztext': 'Trasse einmessen', 'menge': l, 'einheit': 'M', 'laenge': l, 'bemerkung': bemerkung, 'abschnitt': abschnitt})

    # Stahlplatte
    if form_data.get('stahlplatte') == 'an':
        stahl_bem = form_data.get('stahlplatte_bemerk', '')
        positionen.append({'pos_nr': '10037487', 'kurztext': 'Stahlplatte', 'menge': 1, 'einheit': 'ST', 'bemerkung': stahl_bem, 'abschnitt': abschnitt})

    return positionen

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

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