import pytest
from unittest.mock import patch, AsyncMock
from krrkt.engine.pipeline import proofread
from krrkt.models import ProofreadResult


class TestPipeline:
    @pytest.mark.asyncio
    async def test_empty_text(self):
        result = await proofread("", skip_llm=True)
        assert isinstance(result, ProofreadResult)
        assert result.score == 0
        assert result.words == 0
        assert result.findings == []

    @pytest.mark.asyncio
    async def test_clean_text_skip_llm(self):
        result = await proofread("Завод выпускает подшипники.", skip_llm=True)
        assert isinstance(result, ProofreadResult)
        assert result.score >= 8
        assert result.words > 0
        assert result.sentences >= 1

    @pytest.mark.asyncio
    async def test_dirty_text_skip_llm(self):
        result = await proofread(
            "На сегодняшний день наша компания является лидером рынка и предлагает широкий спектр услуг.",
            skip_llm=True
        )
        assert result.score < 8
        assert result.stopwords > 0
        assert len(result.findings) > 0

    @pytest.mark.asyncio
    async def test_findings_have_positions(self):
        result = await proofread("Широкий спектр услуг.", skip_llm=True)
        for f in result.findings:
            assert f.start >= 0
            assert f.end > f.start
            assert f.word == "Широкий спектр услуг."[f.start:f.end]

    @pytest.mark.asyncio
    async def test_summary_has_sections(self):
        result = await proofread(
            "Данная уникальная компания является лидером рынка.",
            skip_llm=True
        )
        if result.stopwords > 0:
            assert len(result.summary) > 0

    @pytest.mark.asyncio
    async def test_result_has_score_color(self):
        result = await proofread("Текст для проверки.", skip_llm=True)
        assert result.score_color in ("green", "orange", "red")
