from typing import Any
from .project import *
from .s1_title import *
from .s2_junctions import *
from .s3_reservoirs import *
from .s4_tanks import *
from .s5_pipes import *
from .s6_pumps import *
from .s7_valves import *

def read_inp(name: str, inp: str):
    if is_project_open(name):
        close_project(name)

    if have_project(name):
        delete_project(name)

    create_project(name)
    open_project(name)

    junctions : dict[str, dict[str, Any]] = {}
    reservoirs : dict[str, dict[str, Any]] = {}
    tanks : dict[str, dict[str, Any]] = {}
    pipes : dict[str, dict[str, Any]] = {}
    pumps : dict[str, dict[str, Any]] = {}
    valves : dict[str, dict[str, Any]] = {}
    section = ''

    for line in open(inp):
        line = line.lstrip()

        if line.startswith(';'):
            continue

        if line.startswith('[TITLE'):
            section = 'title'
            continue
        if line.startswith('[JUNCTION'):
            section = JUNCTION
            continue
        if line.startswith('[RESERVOIR'):
            section = RESERVOIR
            continue
        if line.startswith('[TANK'):
            section = TANK
            continue
        if line.startswith('[PIPE'):
            section = PIPE
            continue
        if line.startswith('[PUMP'):
            section = PUMP
            continue
        if line.startswith('[VALVE'):
            section = VALVE
            continue
        if line.startswith('[COORDINATE'):
            section = 'coordinate'
            continue
        if line.startswith('['):
            section = ''
            continue

        tokens = line.split()
        if len(tokens) == 0:
            continue

        if section == 'title':
            # set_title(name, ChangeSet({'value': tokens[0]}))
            continue
        elif section == JUNCTION:
            if tokens[0] not in junctions:
                junctions[tokens[0]] = {}
            junctions[tokens[0]] |= {'id': tokens[0], 'elevation': tokens[1]}
            continue
        elif section == RESERVOIR:
            if tokens[0] not in reservoirs:
                reservoirs[tokens[0]] = {}
            reservoirs[tokens[0]] |= {'id': tokens[0], 'head': tokens[1]}
            continue
        elif section == TANK:
            if tokens[0] not in tanks:
                tanks[tokens[0]] = {}
            tanks[tokens[0]] = {'id': tokens[0], 'elevation': tokens[1], 'init_level': tokens[2], 'min_level': tokens[3], 'max_level': tokens[4], 'diameter': tokens[5], 'min_vol': tokens[6]}
            continue
        elif section == PIPE:
            if len(tokens) == 7:
                tokens.append(PIPE_STATUS_OPEN)
            pipes[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2], 'length': tokens[3], 'diameter': tokens[4], 'roughness': tokens[5], 'minor_loss': tokens[6], 'status': tokens[7].lower()}
            continue
        elif section == PUMP:
            pumps[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2]}
            continue
        elif section == VALVE:
            valves[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2], 'diameter': tokens[3], 'v_type': tokens[4].lower(), 'setting': tokens[5], 'minor_loss': tokens[6]}
            continue
        elif section == 'coordinate':
            if tokens[0] in junctions:
                junctions[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]}
            elif tokens[0] in reservoirs:
                reservoirs[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]}
            elif tokens[0] in tanks:
                tanks[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]}
            continue

    for value in junctions.values():
        if 'x' not in value:
            value['x'] = 0.0
        if 'y' not in value:
            value['y'] = 0.0
        add_junction(name, ChangeSet(value))
    for value in reservoirs.values():
        if 'x' not in value:
            value['x'] = 0.0
        if 'y' not in value:
            value['y'] = 0.0
        add_reservoir(name, ChangeSet(value))
    for value in tanks.values():
        if 'x' not in value:
            value['x'] = 0.0
        if 'y' not in value:
            value['y'] = 0.0
        add_tank(name, ChangeSet(value))
    for value in pipes.values():
        add_pipe(name, ChangeSet(value))
    for value in pumps.values():
        add_pump(name, ChangeSet(value))
    for value in valves.values():
        add_valve(name, ChangeSet(value))
