from sqlalchemy.orm import Session

import models
import email_feliratkozas


def aktiv_berlet(gep, db: Session):
    """Visszaadja a gép jelenleg aktív bérleti időszakát (vege == null), vagy None-t."""
    return db.query(models.BerletiIdoszak).filter(
        models.BerletiIdoszak.machine_id == gep.id,
        models.BerletiIdoszak.vege == None
    ).first()


def berelt_gep_idk_a_ceghez(company_id: int, db: Session) -> list:
    """Azok a gép-id-k, amik jelenleg (aktív ÉS jóváhagyott bérlettel) ki vannak helyezve a
    megadott (bérlő) céghez - egy még jóvá nem hagyott kihelyezés nem ad valódi hozzáférést."""
    berletek = db.query(models.BerletiIdoszak).filter(
        models.BerletiIdoszak.berlo_company_id == company_id,
        models.BerletiIdoszak.vege == None,
        models.BerletiIdoszak.jovahagyva == True
    ).all()
    return [b.machine_id for b in berletek]


def is_gep_allowed_berlo_szamara(gep, current_user, db: Session) -> bool:
    """Ha a gépnek aktív ÉS jóváhagyott bérlete van a felhasználó (bérlő) cégéhez, engedélyezi a
    hozzáférést, függetlenül attól, hogy a gép más cégnél van nyilvántartva. Csak teljes
    (CEG-szintű) hozzáférésű felhasználóknak - a bérelt gép nem tartozik egyetlen saját
    telephelyükhöz/gépükhöz sem, így a TELEPHELY/GEP-szintű szűkítés itt nem értelmezhető."""
    if current_user.hozzaferes_szint != "CEG":
        return False
    berlet = aktiv_berlet(gep, db)
    return bool(berlet and berlet.berlo_company_id == current_user.company_id and berlet.jovahagyva)


def ertesitesi_emailek_berlet_miatt(gep, db: Session) -> list:
    """Ha a gépnek aktív bérlete van, a bérlő cég felhasználói közül azok email címei is bekerülnek az
    értesítési listába, akik a "berlet" levélkategóriát kapják (C szelet: a bérlő cég saját szabálya és a
    felhasználói feliratkozás szerint; alapból az Admin és az EÜI) - mindkét fél EÜI-je értesüljön a
    hibáról/lejáratról, függetlenül attól, hogy az 'üzemeltetés felelőse' (ki hívja a szerelőt)
    beállítás melyik felet jelöli."""
    berlet = aktiv_berlet(gep, db)
    # Csak JÓVÁHAGYOTT bérletnél, és csak regisztrált bérlő cégnél: a jóvá nem hagyott kihelyezés még nem ad
    # a bérlőnek hozzáférést (l. berelt_gep_idk_a_ceghez), így a gép adatairól sem kaphat levelet.
    if not berlet or not berlet.jovahagyva or not berlet.berlo_company_id:
        return []
    return email_feliratkozas.cimzettek(db, berlet.berlo_company_id, "berlet")
