from kerapu.boom.attribuut.Attribuut import Attribuut
from kerapu.boom.attribuut.Attribuut12 import Attribuut12
from kerapu.boom.attribuut.Attribuut21 import Attribuut21


def maak_attribuut(attribuut_id: int,
                   boom_parameter_nummer: int,
                   filter_toets_wijze: int,
                   filter_waarde_type: int,
                   onder_filter_waarde: str,
                   boven_filter_waarde: str) -> Attribuut:
    """
    Fabriek voor het maken van attributen.

    :param int attribuut_id: Het ID van het attribuut.
    :param int boom_parameter_nummer: Het ID van de boomparameter van het attribuut.
    :param int filter_toets_wijze: De filtertoetswijze
    :param int filter_waarde_type: Het type van de waarde van het attribuut.
    :param str onder_filter_waarde: De ondergrens.
    :param str boven_filter_waarde: De bovengrens.

    :rtype: Attribuut
    """
    if filter_toets_wijze == 1 and filter_waarde_type == 2:
        return Attribuut12(attribuut_id, boom_parameter_nummer, onder_filter_waarde)

    if filter_toets_wijze == 2 and filter_waarde_type == 1:
        return Attribuut21(attribuut_id, boom_parameter_nummer, int(onder_filter_waarde), int(boven_filter_waarde))

    if not 1 <= filter_toets_wijze <= 2:
        raise RuntimeError("Onbekende filtertoetswijze %d." % filter_toets_wijze)

    if not 1 <= filter_waarde_type <= 3:
        raise RuntimeError("Onbekende type %d van de waarde van het attribuut." % filter_waarde_type)

    raise NotImplementedError("Attribuut met filtertoetswijze %d en waarde type %d is niet geïmplementeerd" % (
        filter_toets_wijze, filter_waarde_type))

# ----------------------------------------------------------------------------------------------------------------------
