from fastapi.testclient import TestClient

def test_ftth_list_all_success(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.outlet_ftth.OutletService.get_all_ftth_outlets", return_value=[
        {
            "HOMEPASS_ID_PARTNER": "HP1",
            "CUSTOMER_ID": "CUST1",
            "HOMEPASS_STATUS": "ACTIVE",
            "HOMEPASS_ADDRESS": "Address 1",
            "CUSTOMER_NAME": "Customer 1",
            "HOMEPASS_LATITUDE": "-6.2000",
            "HOMEPASS_LONGITUDE": "106.8160",
            "distance": 10.5
        }
    ])

    response = authenticated_client.get("/ftth/list-all/-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]["HOMEPASS_ID_PARTNER"] == "HP1"


def test_ftth_list_all_empty(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.outlet_ftth.OutletService.get_all_ftth_outlets", side_effect=ValueError("Tidak ada outlet dalam radius 1KM"))

    response = authenticated_client.get("/ftth/list-all/-6.200/106.816")
    
    assert response.status_code == 404
    assert response.json()["meta"]["error"] == "Tidak ada outlet dalam radius 1KM"


def test_ftth_list_all_no_auth(client: TestClient):
    response = client.get("/ftth/list-all/-6.200/106.816")
    assert response.status_code == 401


def test_ftth_list_success(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.outlet_ftth.OutletService.get_ftth_list_for_user", return_value=[
        {
            "KODE": "OUT1",
            "LATITUDE": "-6.2",
            "LONGITUDE": "106.8",
            "STATUS": "ACTIVE"
        }
    ])

    response = authenticated_client.get("/ftth/list")
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True
    assert len(response.json()["data"]) == 1


def test_ftth_list_empty(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.outlet_ftth.OutletService.get_ftth_list_for_user", side_effect=ValueError("data outlet ftth kosong"))

    response = authenticated_client.get("/ftth/list")
    
    assert response.status_code == 404
    assert response.json()["meta"]["error"] == "data outlet ftth kosong"


def test_ftth_detail_success(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.outlet_ftth.OutletService.get_ftth_outlet_detail", return_value={
        "KODE": "OUT1",
        "KETERANGAN": "Good",
        "NAMA_PELANGGAN": "Pelanggan 1",
        "BRAND": "IOH",
        "TL": "TL1",
        "SM": "SM1",
        "BILLING_ACCOUNT": "BA",
        "PRODUCT_SPEED": "10",
        "NAMA_SALES": "Sales 1",
        "REGION_SALES": "R1",
        "HOMEPASS_ADDRESS_PREFIX": "Pre",
        "HOMEPASS_ADDRESS": "Addr",
        "HOMEPASS_ADDRESS_NUMBER": "1",
        "RT": "1",
        "RW": "1",
        "FLOOR": "1",
        "HOMEPASS_UNIT_NUMBER": "1",
        "KODE_SALES": "S1",
        "HOR": "HOR1",
        "LATITUDE": "-6.2",
        "LONGITUDE": "106.8",
        "NO_ACCOUNT": "Acc1",
        "KOTA": "Kota1",
        "KECAMATAN": "Kec1",
        "KELURAHAN": "Kel1",
        "SA": 0,
        "SO": 0,
        "PA": 0
    })

    response = authenticated_client.get("/ftth/OUT1")
    
    assert response.status_code == 200
    assert response.json()["meta"]["success"] is True
    assert response.json()["data"]["KODE"] == "OUT1"


def test_ftth_detail_not_found(authenticated_client: TestClient, mocker):
    mocker.patch("app.routers.outlet_ftth.OutletService.get_ftth_outlet_detail", side_effect=ValueError("outlet ftth tidak ditemukan"))

    response = authenticated_client.get("/ftth/INVALID")
    
    assert response.status_code == 404
    assert response.json()["meta"]["error"] == "outlet ftth tidak ditemukan"
