from fastapi.testclient import TestClient

def test_dashboard_found(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.dashboard_ftth.DashboardService.get_dashboard_ftth_data", return_value={
        "KODE_SALES": "S123",
        "KODE": "D123",
        "HOR": "Region 1",
        "TL": "TL1",
        "SM": "SM1",
        "BRAND": "IOH",
        "NAMA_SALES": "Sales 1",
        "tracking_status": True
    })

    response = authenticated_client.get("/dashboard-ftth/test_dse")
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True
    assert response.json()["data"]["KODE_SALES"] == "S123"


def test_dashboard_not_found(authenticated_client: TestClient, mocker):
    # Ketika data kosong, get_dashboard_ftth_data me-return mapping dengan KODE_SALES == "-"
    mocker.patch("app.routers.dashboard_ftth.DashboardService.get_dashboard_ftth_data", return_value={
        "KODE_SALES": "-",
        "KODE": "-",
        "HOR": "-",
        "TL": "-",
        "SM": "-",
        "BRAND": "IOH",
        "NAMA_SALES": "-",
        "tracking_status": False
    })

    response = authenticated_client.get("/dashboard-ftth/unknown_user")
    
    assert response.status_code == 200
    assert response.json()["data"]["KODE_SALES"] == "-"
    assert response.json()["meta"]["message"] == "Dashboard FTTH tidak ditemukan"


def test_dashboard_no_auth(client: TestClient):
    response = client.get("/dashboard-ftth/test_dse")
    assert response.status_code == 401


def test_create_tracking_success(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.dashboard_ftth.DashboardService.create_tracking_record", return_value=None)

    response = authenticated_client.post(
        "/tracking-ftth",
        data={
            "latitude": -6.2,
            "longitude": 106.8,
            "status": "checkin"
        }
    )
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True


def test_create_tracking_too_fast(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.dashboard_ftth.DashboardService.create_tracking_record", side_effect=ValueError("Tracking sudah dilakukan dalam 10 detik terakhir"))

    response = authenticated_client.post(
        "/tracking-ftth",
        data={
            "latitude": -6.2,
            "longitude": 106.8,
            "status": "checkin"
        }
    )
    
    assert response.status_code == 400
    assert response.json()["meta"]["error"] == "Tracking sudah dilakukan dalam 10 detik terakhir"


def test_create_tracking_no_auth(client: TestClient):
    response = client.post(
        "/tracking-ftth",
        data={"latitude": -6.2, "longitude": 106.8, "status": "checkin"}
    )
    assert response.status_code == 401


def test_sliders_success(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.dashboard_ftth.DashboardService.get_sliders_list", return_value=[
        {"id": 1, "name": "Promo 1", "image": "promo1.jpg", "is_active": True, "link_to": "link1", "order": 1, "status": "active", "for_elang": "Y", "is_banner": False},
        {"id": 2, "name": "Promo 2", "image": "promo2.jpg", "is_active": True, "link_to": "link2", "order": 2, "status": "active", "for_elang": "Y", "is_banner": False}
    ])

    response = authenticated_client.get("/sliders-ftth")
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True
    assert len(response.json()["data"]) == 2


def test_sliders_empty(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.dashboard_ftth.DashboardService.get_sliders_list", return_value=[])

    response = authenticated_client.get("/sliders-ftth")
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True
    assert len(response.json()["data"]) == 0


def test_performance_found(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.dashboard_ftth.DashboardService.get_performance_data", return_value={
        "KODE_SALES": "S123",
        "Target_Sales": 100,
        "SA": 20,
        "SO": 15,
        "PA": 10
    })

    response = authenticated_client.get("/performance-ftth")
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True
    assert response.json()["data"]["KODE_SALES"] == "S123"


def test_performance_not_found(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.dashboard_ftth.DashboardService.get_performance_data", side_effect=ValueError("Performance data not found"))

    response = authenticated_client.get("/performance-ftth")
    
    assert response.status_code == 404
    assert response.json()["meta"]["error"] == "Performance data not found"
