from .database import *
from .s23_options_util import get_option_schema, generate_v3


def _inp_in_option(section: list[str]) -> ChangeSet:
    if len(section) <= 0:
        return ChangeSet()

    cs = g_update_prefix | { 'type' : 'option' }
    for s in section:
        if s.startswith(';'):
            continue

        tokens = s.strip().split()
        if tokens[0].upper() == 'PATTERN': # can not upper id
            value = tokens[1] if len(tokens) > 1 else ''
            cs |= { 'PATTERN' : value }
        elif tokens[0].upper() == 'QUALITY': # can not upper trace node
            value = tokens[1] if len(tokens) > 1 else ''
            if len(tokens) > 2:
                value += f' {tokens[2]}'
            cs |= { 'QUALITY' : value }
        else:
            line = s.upper().strip()
            for key in get_option_schema('').keys():
                if line.startswith(key):
                    value = line.removeprefix(key).strip()
                    cs |= { key : value }

    result = ChangeSet(cs)
    result.merge(generate_v3(result))
    return result


def inp_in_option(section: list[str]) -> str:
    sql = ''
    result = _inp_in_option(section)
    for op in result.operations:
        for key in op.keys():
            if key == 'operation' or key == 'type':
                continue
            if op['type'] == 'option':
                sql += f"update options set value = '{op[key]}' where key = '{key}';"
            else:
                sql += f"update options_v3 set value = '{op[key]}' where key = '{key}';"
    return sql


def inp_out_option(name: str) -> list[str]:
    lines = []
    objs = read_all(name, f"select * from options")

    is_dda = False

    for obj in objs:
        if obj['key'] == 'DEMAND MODEL':
            is_dda = obj['value'] == 'DDA'

    dda_ignore = [
        'HEADERROR',    # TODO: default is 0 which is conflict with PDA
        'FLOWCHANGE',   # TODO: default is 0 which is conflict with PDA
        'MINIMUM PRESSURE',
        'REQUIRED PRESSURE',
        'PRESSURE EXPONENT'
    ]

    for obj in objs:
        key = obj['key']
        # why write this ?
        if key == 'PRESSURE':
            continue
        # release version does not support new keys and has error message
        if key == 'HTOL' or key == 'QTOL' or key == 'RQTOL':
            continue
        # ignore some weird settings for DDA
        if is_dda and key in dda_ignore:
            continue
        value = obj['value']
        if str(value).strip() != '':
            lines.append(f'{key} {value}')
    return lines
