import pytest
from fastapi.testclient import TestClient
from main import app
from routes.translate_routes import TranslateEndpointError

client = TestClient(app)

def test_validate_unsupported_extension():
    # Test with .txt file
    files = {"file": ("test.txt", b"some text content", "text/plain")}
    response = client.post(
        "/api/v1/translate",
        files=files,
        data={"target_lang": "fr"}
    )
    assert response.status_code == 400
    assert response.json()["error"] == "INVALID_FORMAT"
    # Updated message to French
    assert "Formats acceptes" in response.json()["message"]

def test_validate_invalid_magic_bytes():
    # Test with .docx extension but invalid content (should trigger CORRUPTED_FILE)
    files = {"file": ("test.docx", b"not a zip file", "application/vnd.openxmlformats-officedocument.wordprocessingml.document")}
    response = client.post(
        "/api/v1/translate",
        files=files,
        data={"target_lang": "fr"}
    )
    assert response.status_code == 400
    assert response.json()["error"] == "CORRUPTED_FILE"
    assert "corrompu" in response.json()["message"]
    
def _minimal_zip() -> bytes:
    """A real minimal ZIP archive (Office files are ZIPs)."""
    import io, zipfile
    buf = io.BytesIO()
    with zipfile.ZipFile(buf, "w") as zf:
        zf.writestr("[Content_Types].xml", "<Types/>")
    return buf.getvalue()


def test_validate_valid_file_header():
    # Minimal real ZIP: passes magic-byte AND zip-safety checks
    files = {"file": ("test.docx", _minimal_zip(), "application/vnd.openxmlformats-officedocument.wordprocessingml.document")}
    response = client.post(
        "/api/v1/translate",
        files=files,
        data={"target_lang": "fr"}
    )
    # Should be 202 (Accepted) if validation passes
    assert response.status_code == 202
    assert response.json()["data"]["status"] == "processing"

def test_validate_too_large_file():
    # Test with file larger than 50MB
    large_content = b"PK\x03\x04" + b"0" * (51 * 1024 * 1024)
    files = {"file": ("large.docx", large_content, "application/vnd.openxmlformats-officedocument.wordprocessingml.document")}
    response = client.post(
        "/api/v1/translate",
        files=files,
        data={"target_lang": "fr"}
    )
    assert response.status_code == 413
    assert response.json()["error"] == "FILE_TOO_LARGE"
    assert "volumineux" in response.json()["message"]
