import os
import pytest
from unittest.mock import MagicMock

from .verifier import Verifier
from .checklist import VerificationChecklist

# Create dummy files for testing
DUMMY_FILES = [
    "/tmp/test_file_1.txt",
    "/tmp/test_file_2.txt"
]

@pytest.fixture(scope="module", autouse=True)
def create_dummy_files():
    for file in DUMMY_FILES:
        with open(file, "w") as f:
            f.write("Dummy content")
    yield
    for file in DUMMY_FILES:
        os.remove(file)


def test_verifier_files_exist_all_present():
    checklist = VerificationChecklist(required_files=DUMMY_FILES, test_directory="")
    verifier = Verifier(checklist)
    assert verifier.verify_files_exist() == True


def test_verifier_files_exist_one_missing():
    checklist = VerificationChecklist(required_files=["/tmp/test_file_1.txt", "/tmp/missing_file.txt"], test_directory="")
    verifier = Verifier(checklist)
    assert verifier.verify_files_exist() == False


def test_verifier_tests_pass(monkeypatch):
    # Mock pytest.main to always return 0 (success)
    mock_pytest_main = MagicMock(return_value=0)
    monkeypatch.setattr("pytest.main", mock_pytest_main)

    checklist = VerificationChecklist(required_files=[], test_directory="/path/to/tests")
    verifier = Verifier(checklist)
    assert verifier.verify_tests_pass() == True
    mock_pytest_main.assert_called_once_with([checklist.test_directory])


def test_verifier_tests_fail(monkeypatch):
    # Mock pytest.main to raise an exception (failure)
    mock_pytest_main = MagicMock(side_effect=Exception("Test failure"))
    monkeypatch.setattr("pytest.main", mock_pytest_main)

    checklist = VerificationChecklist(required_files=[], test_directory="/path/to/tests")
    verifier = Verifier(checklist)
    assert verifier.verify_tests_pass() == False
    mock_pytest_main.assert_called_once_with([checklist.test_directory])


def test_verifier_quality_gates_satisfied():
    checklist = VerificationChecklist(required_files=[], test_directory="")
    verifier = Verifier(checklist)
    assert verifier.verify_quality_gates_satisfied() == True


def test_verifier_overall_success(monkeypatch):
    # Mock all verification methods to return True
    monkeypatch.setattr(Verifier, "verify_files_exist", MagicMock(return_value=True))
    monkeypatch.setattr(Verifier, "verify_tests_pass", MagicMock(return_value=True))
    monkeypatch.setattr(Verifier, "verify_quality_gates_satisfied", MagicMock(return_value=True))

    checklist = VerificationChecklist(required_files=[], test_directory="")
    verifier = Verifier(checklist)
    overall_success, results = verifier.verify()
    assert overall_success == True


def test_verifier_overall_failure(monkeypatch):
    # Mock one verification method to return False
    monkeypatch.setattr(Verifier, "verify_files_exist", MagicMock(return_value=False))
    monkeypatch.setattr(Verifier, "verify_tests_pass", MagicMock(return_value=True))
    monkeypatch.setattr(Verifier, "verify_quality_gates_satisfied", MagicMock(return_value=True))

    checklist = VerificationChecklist(required_files=[], test_directory="")
    verifier = Verifier(checklist)
    overall_success, results = verifier.verify()
    assert overall_success == False