import pytest
from app.models import Augment, Package, Domain
from app.services.augment_dedup import find_duplicate_augments, remove_duplicate_augments


class TestFindDuplicateAugments:
    def test_finds_exact_title_duplicates(self, db_session):
        dupes = find_duplicate_augments(db_session)
        for group in dupes:
            assert len(group["ids"]) >= 2
            assert group["domain_name"]
            assert group["title"]

    def test_returns_empty_when_no_dupes(self, db_session):
        dupes = find_duplicate_augments(db_session, domain_name="nonexistent-domain-xyz.com")
        assert dupes == []

    def test_keeps_oldest_by_id(self, db_session):
        dupes = find_duplicate_augments(db_session)
        for group in dupes:
            assert group["keep_id"] == min(group["ids"])
            assert group["remove_ids"] == sorted([i for i in group["ids"] if i != group["keep_id"]])


class TestRemoveDuplicateAugments:
    def test_dry_run_does_not_delete(self, db_session):
        before_count = db_session.query(Augment).count()
        result = remove_duplicate_augments(db_session, dry_run=True)
        after_count = db_session.query(Augment).count()
        assert after_count == before_count
        assert "removed" in result
        assert "groups" in result

    def test_remove_returns_count(self, db_session):
        result = remove_duplicate_augments(db_session, dry_run=True)
        assert isinstance(result["removed"], int)
        assert isinstance(result["groups"], int)

    def test_actual_removal_deletes_dupes(self, db_session):
        dupes_before = find_duplicate_augments(db_session)
        if not dupes_before:
            pytest.skip("No duplicates to test removal")
        result = remove_duplicate_augments(db_session, dry_run=False)
        assert result["removed"] > 0
        dupes_after = find_duplicate_augments(db_session)
        assert len(dupes_after) == 0
