from fastapi.testclient import TestClient
from unittest.mock import MagicMock

def override_dependency(app):
    from app.utils.dependencies import get_current_user
    app.dependency_overrides[get_current_user] = lambda: type("User", (), {"username": "test_dse"})


def test_get_near_me_list_success(client: TestClient, mocker):
    from app.main import app
    override_dependency(app)

    mocker.patch("app.routers.near_me.NearMeService.get_near_outlets", return_value=[
        {"KODE": "FAT123", "LATITUDE": "-6.200", "LONGITUDE": "106.816", "JENIS": "FAT", "STATUS": "Active"}
    ])

    response = client.get("/near-me/list/-6.200/106.816")
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True
    assert len(response.json()["data"]) == 1
    assert response.json()["data"][0]["KODE"] == "FAT123"

    app.dependency_overrides.clear()


def test_get_near_me_list_no_auth(client: TestClient):
    response = client.get("/near-me/list/-6.200/106.816")
    assert response.status_code == 401


def test_get_near_me_detail_fat_success(client: TestClient, mocker):
    from app.main import app
    override_dependency(app)

    mocker.patch("app.routers.near_me.NearMeService.get_fat_detail", return_value={
        "KODE": "FAT123", "STATUS": "Active", "KETERANGAN": "Good", "SITEID": "S1"
    })

    response = client.get("/near-me/detail-fat/FAT123")
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True
    assert response.json()["data"]["KODE"] == "FAT123"

    app.dependency_overrides.clear()


def test_get_near_me_detail_homepass_success(client: TestClient, mocker):
    from app.main import app
    override_dependency(app)

    mocker.patch("app.routers.near_me.NearMeService.get_homepass_detail", return_value={
        "KODE_SALES": "S123", "KODE": "HP123", "KETERANGAN": "Good", "KECAMATAN": "Tebet"
    })

    response = client.get("/near-me/detail-homepass/HP123")
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True
    assert response.json()["data"]["KODE"] == "HP123"

    app.dependency_overrides.clear()


def test_get_near_me_detail_not_found(client: TestClient, mocker):
    from app.main import app
    override_dependency(app)

    mocker.patch("app.routers.near_me.NearMeService.get_fat_detail", side_effect=ValueError("Data not found"))

    response = client.get("/near-me/detail-fat/INVALID_KODE")
    
    assert response.status_code == 404
    assert response.json()["meta"]["error"] == "Data not found"

    app.dependency_overrides.clear()


def test_get_near_me_detail_checkin_success(client: TestClient, mocker):
    from app.main import app
    override_dependency(app)

    mocker.patch("app.routers.near_me.NearMeService.get_checkin_detail", return_value={
        "no_activity": "ACT-123", "nama_pelanggan": "Pelanggan 1", "status_checkin": "done",
        "nomor_pelanggan": "0812", "latitude": "-6.2", "longitude": "106.8", "status_pemesanan": "PO", "kode_sales": "S123"
    })

    response = client.get("/near-me/detail-checkin/ACT-123")
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True
    assert response.json()["data"]["no_activity"] == "ACT-123"

    app.dependency_overrides.clear()


def test_get_near_me_detail_checkin_not_found(client: TestClient, mocker):
    from app.main import app
    override_dependency(app)

    mocker.patch("app.routers.near_me.NearMeService.get_checkin_detail", side_effect=ValueError("Data checkin tidak ditemukan"))

    response = client.get("/near-me/detail-checkin/INVALID")
    
    assert response.status_code == 404
    assert response.json()["meta"]["error"] == "Data checkin tidak ditemukan"

    app.dependency_overrides.clear()
