import json
from pathlib import Path

import pytest

from app.core.config import get_settings
from app.services.mobile_release_service import get_mobile_release_info


@pytest.fixture
def mobile_release_setup(tmp_path, monkeypatch):
    release_dir = tmp_path / "mobile"
    release_dir.mkdir()
    apk_path = release_dir / "agent-portal-0.2.0.apk"
    apk_path.write_bytes(b"fake-apk-bytes")

    manifest = {
        "version": "0.2.0",
        "version_code": 2,
        "apk_filename": "agent-portal-0.2.0.apk",
        "release_notes": "Test release",
        "mandatory": False,
    }
    (release_dir / "release.json").write_text(json.dumps(manifest), encoding="utf-8")

    monkeypatch.setenv("MOBILE_RELEASE_ENABLED", "true")
    monkeypatch.setenv("MOBILE_RELEASE_DIR", str(release_dir))
    get_settings.cache_clear()
    yield release_dir
    get_settings.cache_clear()


def test_mobile_release_info(client, mobile_release_setup):
    response = client.get("/api/v1/app/mobile-release")
    assert response.status_code == 200
    body = response.json()
    assert body["version"] == "0.2.0"
    assert body["version_code"] == 2
    assert body["release_notes"] == "Test release"
    assert body["download_url"].endswith("/api/v1/app/mobile-release/download")
    assert body["apk_size_bytes"] == len(b"fake-apk-bytes")


def test_mobile_release_download(client, mobile_release_setup):
    response = client.get("/api/v1/app/mobile-release/download")
    assert response.status_code == 200
    assert response.content == b"fake-apk-bytes"
    assert "application/vnd.android.package-archive" in response.headers.get("content-type", "")


def test_mobile_release_not_configured(client):
    get_settings.cache_clear()
    response = client.get("/api/v1/app/mobile-release")
    assert response.status_code == 404
    assert response.json()["code"] == "MOBILE_RELEASE_NOT_CONFIGURED"


def test_get_mobile_release_info_external_url(tmp_path, monkeypatch):
    release_dir = tmp_path / "mobile"
    release_dir.mkdir()
    manifest = {
        "version": "1.0.0",
        "version_code": 10,
        "download_url": "https://cdn.example.com/agent-portal.apk",
        "release_notes": "CDN hosted",
    }
    (release_dir / "release.json").write_text(json.dumps(manifest), encoding="utf-8")

    monkeypatch.setenv("MOBILE_RELEASE_ENABLED", "true")
    monkeypatch.setenv("MOBILE_RELEASE_DIR", str(release_dir))
    get_settings.cache_clear()

    info = get_mobile_release_info(get_settings(), "https://api.example.com")
    assert info is not None
    assert info.download_url == "https://cdn.example.com/agent-portal.apk"
    assert info.version_code == 10

    get_settings.cache_clear()
