import nltk
import random
import re

reflections = {
    "ja jestem": "ty jesteś",
    "ja byłem": "ty byłeś",
    "ja": "ty",
    "jestem": "jesteś",
    "chciałbym": "chciałbyś",
    "mam": "masz",
    "będę": "będziesz",
    "moje": "twoje",
    "jesteś": "jestem",
    "byłeś": "byłem",
    "ty byłeś": "ja byłem",
    "będziesz": "będę",
    "nasze": "wasze",
    "twoje": "moje",
    "ty" : "ja",
    "ja": "ty",
    "my" : "wy",
    "jesteśmy": "jesteście",
}

class Chat:
    def __init__(self, pairs, reflections={}):
        
        self._pairs = [(re.compile(x, re.IGNORECASE), y) for (x, y) in pairs]
        self._reflections = reflections
        self._regex = self._compile_reflections()


    def _compile_reflections(self):
        sorted_refl = sorted(self._reflections, key=len, reverse=True)
        return re.compile(
            r"\b({})\b".format("|".join(map(re.escape, sorted_refl))), re.IGNORECASE
        )

    def _substitute(self, str):
        
        return self._regex.sub(
            lambda mo: self._reflections[mo.string[mo.start() : mo.end()]], str.lower()
        )

    def _wildcards(self, response, match):
        pos = response.find("%")
        while pos >= 0:
            num = int(response[pos + 1 : pos + 2])
            response = (
                response[:pos]
                + self._substitute(match.group(num))
                + response[pos + 2 :]
            )
            pos = response.find("%")
        return response

    def respond(self, str):

        # check each pattern
        for (pattern, response) in self._pairs:
            match = pattern.match(str)

            # did the pattern match?
            if match:
                resp = random.choice(response)  # pick a random response
                resp = self._wildcards(resp, match)  # process wildcards

                # fix munged punctuation at the end
                if resp[-2:] == "?.":
                    resp = resp[:-2] + "."
                if resp[-2:] == "??":
                    resp = resp[:-2] + "?"
                return resp


    # Hold a conversation with a chatbot
    def converse(self, quit="Do widzenia"):
        user_input = ""
        while user_input != quit:
            user_input = quit
            try:
                user_input = input(">")
            except EOFError:
                print(user_input)
            if user_input:
                while user_input[-1] in "!.":
                    user_input = user_input[:-1]
                print(self.respond(user_input))


pairs = (
    (
        r"Potrzebuję (.*)",
        (
            "Dlaczego potrzebujesz %1?",
            "Czy jesteś pewny, że potrzebujesz %1?",
        ),
    ),
    (
        r"Kto cię stworzył (.*)",
        (
            "ELIZA została wynaleziona w 1966 roku przez Weizenbauma. Dlaczego %1?",

        ),
    ),
    (
        r"Dlaczego ty (.*)",
        (
            "Czy naprawdę myślisz, że %1?",
            "Być może w końcu będę %1.",
            "Czy naprawdę chcesz, żebym %1?",
        ),
    ),
    (
        r"Dlaczego ja (.*)",
        (
            "Czy uważasz, że powinieneś być w stanie %1?",
            "Gdybyś mógł %1, co byś zrobił?",
            "Nie wiem -- dlaczego nie możesz %1?",
            "Czy naprawdę próbowałeś?",
        ),
    ),
    (
        r"Nie mogę (.*)",
        (
            "Skąd wiesz, że nie możesz %1?",
            "Być może mógłbyś, gdybyś spróbował.",
            "Co byś musiał zrobić, żeby %1?",
        ),
    ),
    (
        r"Jestem (.*)",
        (
            "Przyszedłeś do mnie, bo jesteś %1?",
            "Jak długo jesteś %1?",
            "Co myślisz o tym, że jesteś %1?",
        ),
    ),
    (
        r"Jestem (.*)",
        (
            "Jak się czujesz z tym, że jesteś %1?",
            "Czy lubisz być %1?",
            "Dlaczego mówisz mi, że jesteś %1?",
            "Dlaczego myślisz, że jesteś %1?",
        ),
    ),
    (
        r"Czy jesteś (.*)",
        (
            "Dlaczego to ma znaczenie, czy jestem %1?",
            "Wolałbyś, gdybym nie była %1?",
            "Być może wierzysz, że jestem %1.",
            "Mogę być %1 - jak myślisz?",
        ),
    ),
    (
        r"Co (.*)",
        (         
            "Dlaczego pytasz?",
            "Jak pomogłaby ci odpowiedź na to?",
            "Co myślisz?",
        ),
    ),
    (
        r"Jak (.*)",
        (
            "Jak ty sądzisz?",
            "Perhaps you can answer your own question.",
            "What is it you're really asking?",
        ),
    ),
   (
        r"Ponieważ (.*)",
        (
            "Czy to prawdziwy powód?",
            "Jakie inne powody przychodzą Ci na myśl?”,",
            "Czy ten powód dotyczy czegokolwiek innego?",
            "Jeśli %1, co jeszcze musi być prawdą?",
        ),
    ),
    (
        r"(.*) przepraszam (.*)",
        (
            "Wiele razy przeprosiny nie są potrzebne.",
            "Co czujesz kiedy przepraszasz?",
        ),
    ),
    (
        r"Cześć(.*)",
        (
            "Cześć... cieszę się, że mogłeś dzisiaj wpaść..",
            "Cześć... jak się masz dzisiaj?",
            "Cześć, jak się dzisiaj czujesz?",
        ),
    ),
    (
        r"Myśle, że (.*)",
        (
            "Czy wątpisz w %1?", 
         "Naprawdę tak myślisz?", 
         "Ale nie jesteś pewien, że %1?"
         ),
    ),
    (
        r"(.*) przyjaciel (.*)",
        (
            "Opowiedz mi więcej o swoich przyjaciołach.",
            "Kiedy myślisz o przyjacielu, co przychodzi ci na myśl?",
            "Dlaczego miałbyś nie opowiedzieć o przyjacielu z dzieciństwa?",
        ),
    ),
    (
        r"Tak", 
        (
            "Wydajesz się całkiem pewien.", "OK, ale czy możesz trochę rozwinąć?"
        )
    ),
    (
        r"(.*) komputer(.*)",
        (
            "Naprawdę mówisz o mnie?",
            "Czy rozmowa z komputerem wydaje się dziwna?",
            "Jak się czujesz przy komputerach?",
            "Czy czujesz się zagrożony przez komputery?",
        ),
    ),
    (
        r"To jest (.*)",
        (
            "Czy myślisz, że to %1?",
            "Może to %1 -- co myślisz?",
            "Gdyby to był %1, co byś zrobił?",
            "Może być tak, że %1.",
        ),
    ),
    (
        r"Jest to (.*)",
        (
            "Wydajesz się bardzo pewny.",
            "Gdybym ci powiedziała, że prawdopodobnie nie jest to %1, co byś poczuł?",
        ),
    ),
    (
        r"Czy możesz (.*)",
        (
            "Dlaczego myślisz, że nie mogę %1?",
            "Gdybym mógł %1, to co?",
            "Dlaczego pytasz, czy mogę %1?",
        ),
    ),
    (
        r"Czy mogę (.*)",
        (
            "Być może nie chcesz %1.",
            "Czy chcesz mieć możliwość %1?",
            "Gdybyś mógł %1, czy byś?",
        ),
    ),
    (
        r"Czy mogę (.*)",
        (
            "Być może nie chcesz %1.",
            "Czy chcesz mieć możliwość %1?",
            "Gdybyś mógł %1, czy byś?",
        ),
    ),
    (
        r"Ty jesteś (.*)",
        (
            "Jak myślisz, dlaczego jestem %1?",
            "Czy cieszy cię myśl, że jestem %1?",
            "Być może chciałbyś, żebym był %1.",
            "Może naprawdę mówisz o sobie?",
        ),
    ),
    (
        r"Jesteś (.*)",
        (
            "Dlaczego mówisz, że jestem %1?",
            "Jak myślisz, dlaczego jestem %1?",
            "Mówimy o tobie, czy o mnie?",
        ),
    ),
    (
        r"Ja nie (.*)",
        ("Czy naprawdę nie %1?", "Dlaczego nie %1?", "Czy chcesz %1?"),
    ),
    (
        r"Ja czuję (.*)",
        (
            "Dobrze, powiedz mi więcej o tych uczuciach.",
            "Czy często czujesz %1?",
            "Kiedy zwykle czujesz %1?",
            "Kiedy czujesz % 1, co robisz?",
        ),
    ),
    (
        r"Mam (.*)",
        (
            "Dlaczego mówisz mi, że masz %1?",
            "Czy naprawdę masz %1?",
            "Teraz, kiedy masz %1, co zrobisz dalej?",
        ),
    ),
    (
        r"Ja chcę (.*)",
        (
            "Czy możesz wyjaśnić, dlaczego chcesz %1?",
            "Dlaczego %1?",
            "Kto jeszcze wie, że chcesz %1?",
        ),
    ),
    (
        r"Jest (.*)",
        (
            "Myślisz, że jest %1?",
            "Prawdopodobnie istnieje %1.",
            "Czy chciałbyś, aby był %1?",
        ),
    ),
    (
        r"Mój (.*)",
        (
            "Rozumiem, twój %1.",
             "Dlaczego mówisz, że twój %1?",
             "Kiedy Twój %1, jak się czujesz?",
        ),
    ),
    (
        r"Ty (.*)",
        (
            "Powinniśmy rozmawiać o Tobie, nie o mnie.",
             "Dlaczego tak o mnie mówisz?",
             "Dlaczego obchodzi cię, czy ja %1?",
        ),
    ),
    (
         r"Dlaczego (.*)", 
         (
             "Powiedz mi dlaczego %1?", 
             "Wydaje ci się że, %1?")
         ),
    (
        r"Ja chcę (.*)",
        (
            "Co by dla ciebie znaczyło, gdybyś dostał %1?",
             "Dlaczego chcesz %1?",
             "Co byś zrobił, gdybyś dostał %1?",
             "Jeśli masz %1, co byś zrobił?",
        ),
    ),
        (
        r"(.*) mama(.*)",
        (
            "Opowiedz mi więcej o twojej mamie.",
            "Jaka była twoja relacja z mamą?",
            "Co myślisz o swojej mamie?",
            "Jak to się ma do twoich dzisiejszych uczuć?",
            "Dobre relacje z rodziną są ważne.",
        ),
    ),
    (
        r"(.*) tata(.*)",
        (
            "Opowiedz mi więcej o twoim tacie.",
            "Jakie uczucia wzbudzał w tobie twój tata?",
            "Co myślisz o swoim tacie?",
            "Czy twoja relacja z tatą ma wpływ na twoje dzisiejsze uczucia?",
            "Czy masz problemy z okazywaniem uczuć swojej rodzinie?",
        ),
    ),
    (
        r"(.*) dziecko(.*)",
        (
            "Miałeś bliskich przyjaciół jako dziecko?",
            "Jakie jest twoje ulubione wspomnienie z dzieciństwa?",
            "Pamiętasz jakieś sny lub koszmary z dzieciństwa?",
            "Czy inne dzieci czasem cię drażniły?",
            "Jak myślisz, czy doświadczenia z dzieciństwa wpłynęły na twoje dzisiejsze uczucia?",
        ),
    ),
    (
        r"(.*)\?",
        (
            "Dlaczego o to pytasz?",
            "Rozważ proszę, czy byłbyś w stanie odpowiedzieć na swoje pytanie.",
            "Być może odpowiedź tkwi w tobie?",
            "Dlaczego nie powiesz?",
        ),
    ),
    (
        r"Do widzenia",
        (
            "Dziękuję, że ze mną porozmawiałeś.",
            "Do widzenia.",
            "Dziękuję, miłego dnia!",
        ),
    ),
    (
        r"(.*)",
        (
            "Opowiedz mi więcej.",
            "Zmieńmy trochę temat... Opowiedz mi o swojej rodzinie",
            "Czy możesz to rozwinąć?",
            "Dlaczego mówisz, że %1?",
            "Rozumiem.",
            "Bardzo interesujące.",
            "%1.",
            "Rozumiem, a co ci to mówi?",
            "Jak się z tym czujesz?",
            "Jak się czujesz, kiedy o tym mówisz?",
        ),
    ),
)

eliza_chatbot = Chat(pairs, reflections)


def eliza_chat():
    print("Psycholog\n---------")
    print("Porozmawiaj z programem, wpisując polskie słowa, używając")
    print('dużych oraz małych liter i znaków interpunkcyjnych.') 
    print('Po zakończeniu wpisz „Do widzenia”')
    print("=" * 75)
    print("Dzień dobry. Nazywam się Eliza.\nJak się dzisiaj czujesz?")

    eliza_chatbot.converse()


def demo():
    eliza_chat()


if __name__ == "__main__":
    demo()