from simpful import *

def fuzzy_system(release_year_param, runtime_param, seasons_param, genres_param, emotions_param):

    FS = FuzzySystem(show_banner=False)

    # Define fuzzy sets for the variable
    # RELEASE_YEAR
    release_year_newer = TriangleFuzzySet(-20, -20, 0, term="newer")
    release_year_similar = TriangleFuzzySet(-20, 0, 20, term="similar")
    release_year_older = TriangleFuzzySet(0, 20, 20, term="older")

    FS.add_linguistic_variable("RELEASE_YEAR",
                            LinguisticVariable([release_year_newer, release_year_similar, release_year_older],
                                                universe_of_discourse=[-136, 136]))

    # RUNTIME
    runtime_shorter = TriangleFuzzySet(-90, -90, 0, term="shorter")
    runtime_similar = TriangleFuzzySet(-90, 0, 90, term="similar")
    runtime_longer = TriangleFuzzySet(0, 90, 90, term="longer")

    FS.add_linguistic_variable("RUNTIME", LinguisticVariable([runtime_shorter, runtime_similar, runtime_longer],
                                                            universe_of_discourse=[-476, 476]))

    # SEASONS
    seasons_less = TriangleFuzzySet(-5, -5, 0, term="less")
    seasons_similar = TriangleFuzzySet(-5, 0, 5, term="similar")
    seasons_more = TriangleFuzzySet(0, 5, 5, term="more")

    FS.add_linguistic_variable("SEASONS", LinguisticVariable([seasons_less, seasons_similar, seasons_more],
                                                            universe_of_discourse=[-84, 84]))

    # GENRES
    genres_different = TriangleFuzzySet(0, 0, 0.5, term="different")
    genres_similar = TriangleFuzzySet(0, 0.5, 1, term="similar")
    genres_same = TriangleFuzzySet(0.5, 1, 1, term="same")

    FS.add_linguistic_variable("GENRES", LinguisticVariable([genres_different, genres_similar, genres_same],
                                                            universe_of_discourse=[0, 1]))

    # EMOTIONS
    emotions_different = TriangleFuzzySet(0, 0, 0.5, term="different")
    emotions_similar = TriangleFuzzySet(0, 0.5, 1, term="similar")
    emotions_same = TriangleFuzzySet(0.5, 1, 1, term="same")

    FS.add_linguistic_variable("EMOTIONS", LinguisticVariable([emotions_different, emotions_similar, emotions_same],
                                                            universe_of_discourse=[0, 1]))

    # RECOMMENDATION
    low_recommendation = TriangleFuzzySet(0, 0, 50, term="low_recommendation")
    medium_recommendation = TriangleFuzzySet(0, 50, 100, term="medium_recommendation")
    high_recommendation = TriangleFuzzySet(0, 100, 100, term="high_recommendation")
    FS.add_linguistic_variable("RECOMMENDATION",
                            LinguisticVariable([low_recommendation, medium_recommendation, high_recommendation],
                                                universe_of_discourse=[0, 200]))

    # # RULES
    # RULE1 = "IF (RELEASE_YEAR IS older) AND (RUNTIME IS longer) AND (SEASONS IS more) THEN (RECOMMENDATION IS low_recommendation)"
    # RULE2 = "IF (EMOTIONS IS different) AND (GENRES IS different) THEN (RECOMMENDATION IS low_recommendation)"
    # RULE3 = "IF (RELEASE_YEAR IS newer) AND (RUNTIME IS similar) AND (SEASONS IS less) THEN (RECOMMENDATION IS medium_recommendation)"
    # RULE4 = "IF (EMOTIONS IS similar) AND (GENRES IS similar) THEN (RECOMMENDATION IS medium_recommendation)"
    # RULE5 = "IF (RELEASE_YEAR IS similar) AND (RUNTIME IS similar) AND (SEASONS IS similar) AND (EMOTIONS IS same) AND (GENRES IS same) THEN (RECOMMENDATION IS high_recommendation)"
    # # Z regułami trzeba eksperymentować, można porównywać ze scorem dla sprawdzania skuteczności

    # RULES
    RULE1 = f"IF (NOT (RELEASE_YEAR IS {release_year_param})) AND (NOT (RUNTIME IS {runtime_param})) AND (NOT (SEASONS IS {seasons_param})) THEN (RECOMMENDATION IS low_recommendation)"
    RULE2 = f"IF (NOT (EMOTIONS IS {emotions_param})) AND (NOT (GENRES IS {genres_param})) THEN (RECOMMENDATION IS low_recommendation)"
    RULE3 = f"IF (NOT (RELEASE_YEAR IS {release_year_param})) AND (RUNTIME IS {runtime_param}) AND (NOT (SEASONS IS {seasons_param})) THEN (RECOMMENDATION IS medium_recommendation)"
    RULE4 = f"IF (EMOTIONS IS {emotions_param}) AND (GENRES IS {genres_param}) THEN (RECOMMENDATION IS medium_recommendation)"
    RULE5 = f"IF (RELEASE_YEAR IS {release_year_param}) AND (RUNTIME IS {runtime_param}) AND (SEASONS IS {seasons_param}) AND (EMOTIONS IS {emotions_param}) AND (GENRES IS {genres_param}) THEN (RECOMMENDATION IS high_recommendation)"
    FS.add_rules([RULE1, RULE2, RULE3, RULE4, RULE5])

    return FS