from krrkt.engine.fast_layer import FastLayer


class TestFastLayerPhrases:
    def setup_method(self):
        self.layer = FastLayer()

    def test_finds_corporate_stamp(self):
        findings = self.layer.analyze("Мы предлагаем широкий спектр услуг.")
        rules = [f["rule"] for f in findings]
        assert "Корпоративный штамп" in rules

    def test_finds_bureaucratese(self):
        findings = self.layer.analyze("В связи с вышеизложенным просим рассмотреть.")
        rules = [f["rule"] for f in findings]
        assert "Канцеляризм" in rules

    def test_finds_time_parasite(self):
        findings = self.layer.analyze("На сегодняшний день всё работает.")
        rules = [f["rule"] for f in findings]
        assert "Паразит времени" in rules

    def test_clean_text_few_findings(self):
        findings = self.layer.analyze("Завод выпускает подшипники.")
        serious = [f for f in findings if f["weight"] > 0]
        assert len(serious) == 0

    def test_returns_positions(self):
        text = "Предлагаем широкий спектр услуг."
        findings = self.layer.analyze(text)
        for f in findings:
            assert "start" in f
            assert "end" in f
            assert "word" in f
            assert f["word"] == text[f["start"]:f["end"]]

    def test_source_is_fast(self):
        findings = self.layer.analyze("Широкий спектр услуг.")
        for f in findings:
            assert f["source"] == "fast"

    def test_no_duplicate_ranges(self):
        findings = self.layer.analyze("На сегодняшний день компания является лидером рынка.")
        ranges = [(f["start"], f["end"]) for f in findings]
        # No two findings should overlap
        for i, (s1, e1) in enumerate(ranges):
            for j, (s2, e2) in enumerate(ranges):
                if i != j:
                    assert not (s1 < e2 and s2 < e1), f"Overlap: {ranges[i]} and {ranges[j]}"

    def test_finds_pleonasm(self):
        findings = self.layer.analyze("Это бесплатный подарок для клиента.")
        rules = [f["rule"] for f in findings]
        assert "Плеоназм" in rules

    def test_finds_zaum_word(self):
        findings = self.layer.analyze("Необходимо верифицировать данные перед интеграцией.")
        rules = [f["rule"] for f in findings]
        assert "Заумное слово" in rules

    def test_finds_new_assessment_words(self):
        findings = self.layer.analyze("Это баснословная цена за феноменальный результат.")
        rules = [f["rule"] for f in findings]
        assert "Необъективная оценка" in rules

    def test_finds_new_introductory_constructions(self):
        findings = self.layer.analyze("Грубо говоря, это казалось бы простая задача.")
        rules = [f["rule"] for f in findings]
        assert "Вводная конструкция" in rules

    def test_finds_new_stamp_phrases(self):
        findings = self.layer.analyze("Мы ставим амбициозные цели и ищем ключ к успеху.")
        patterns = [f["word"] for f in findings]
        assert "амбициозные цели" in patterns or "ключ к успеху" in patterns

    def test_finds_new_bureaucratic_patterns(self):
        findings = self.layer.analyze("Просьба обеспечить выполнение в надлежащем порядке.")
        rules = [f["rule"] for f in findings]
        assert "Канцеляризм" in rules

    def test_finds_stative_verb(self):
        findings = self.layer.analyze("Компания располагается в центре города.")
        rules = [f["rule"] for f in findings]
        assert "Слабый глагол" in rules
