import pytest
from unittest.mock import MagicMock
from app.services.auth_service import AuthService
from app.models.user_ftth import User, Territory

def test_login_user_success(mocker):
    # Mocking DB response
    mock_db = MagicMock()
    
    mock_user = User(
        id=1, 
        username="test_dse", 
        password="hashed_password", 
        territory_id=1, 
        role=5, 
        is_active=1,
        brand="IOH"
    )
    # Mock verify_password method of User
    mocker.patch.object(User, 'verify_password', return_value=True)
    
    mock_territory = Territory(id=1, name="Jakarta")

    mocker.patch("app.services.auth_service.get_user_by_username", return_value=mock_user)
    mocker.patch("app.services.auth_service.get_territory", return_value=mock_territory)
    mocker.patch("app.services.auth_service.create_access_token", return_value="fake-token")

    result = AuthService.login_user(mock_db, "test_dse", "password123")

    assert result["data"]["username"] == "test_dse"
    assert result["data"]["role"] == "DSE"
    assert result["data"]["territory"] == "Jakarta"
    assert result["token"]["access_token"] == "fake-token"


def test_login_user_invalid_credentials(mocker):
    mock_db = MagicMock()
    mocker.patch("app.services.auth_service.get_user_by_username", return_value=None)
    
    with pytest.raises(ValueError, match="Invalid username or password"):
        AuthService.login_user(mock_db, "wrong_user", "wrong_pass")


def test_login_user_inactive(mocker):
    mock_db = MagicMock()
    mock_user = User(is_active=0)
    mocker.patch.object(User, 'verify_password', return_value=True)
    mocker.patch("app.services.auth_service.get_user_by_username", return_value=mock_user)
    
    with pytest.raises(ValueError, match="User is not active"):
        AuthService.login_user(mock_db, "inactive_user", "password123")


def test_login_user_unauthorized_role(mocker):
    mock_db = MagicMock()
    mock_user = User(is_active=1, role=1) # Role 1 (Circle) is not in allowed_roles for FTTH checkin
    mocker.patch.object(User, 'verify_password', return_value=True)
    mocker.patch("app.services.auth_service.get_user_by_username", return_value=mock_user)
    
    with pytest.raises(ValueError, match="User does not have access to this application"):
        AuthService.login_user(mock_db, "circle_user", "password123")
