import sqlmodel
from sqlalchemy.exc import IntegrityError
from sqlalchemy.future import Engine

from . import models


def _add_model(
    session: sqlmodel.Session, model: models.Account | models.MasterPass
) -> bool:
    """Adds model to the session. Returns true on success,
    false otherwise"""
    try:
        session.add(model)
    except IntegrityError:
        return False
    else:
        return True


def add_account(engine: Engine, account: models.Account) -> bool:
    """Adds account to the database. Returns true on success,
    false otherwise"""
    with sqlmodel.Session(engine) as session:
        result = _add_model(session, account)
        session.commit()
    return result


def add_master_pass(engine: Engine, master_pass: models.MasterPass) -> bool:
    """Adds master password the database. Returns true on success,
    false otherwise"""
    with sqlmodel.Session(engine) as session:
        result = _add_model(session, master_pass)
        session.commit()
    return result


def add_accounts(
    engine: Engine,
    accounts: list[models.Account],
) -> list[bool]:
    with sqlmodel.Session(engine) as session:
        result = [_add_model(session, account) for account in accounts]
        session.commit()
    return result