import unittest

from fastapi.testclient import TestClient

from app.modules.auth.presentation.auth import get_current_user
from app.main import create_app


class TestRbacProtection(unittest.TestCase):
    def setUp(self):
        self.app = create_app()
        self.client = TestClient(self.app)

    def tearDown(self):
        self.app.dependency_overrides = {}

    def test_unauthorized_endpoints(self):
        # Khi không có header Authorization, get_current_user mặc định ném lỗi 401
        response = self.client.get("/v1/erp/equipment")
        self.assertEqual(response.status_code, 401)

    def test_role_authorized_endpoints(self):
        # Giả lập tài khoản superadmin qua Dependency Override
        self.app.dependency_overrides[get_current_user] = lambda: {
            "id": "user-admin-id",
            "email": "dinhsonconstruction@gmail.com",
            "role": "superadmin",
        }

        response = self.client.get("/v1/erp/equipment")
        self.assertEqual(response.status_code, 200)

    def test_role_forbidden_endpoints(self):
        # Giả lập tài khoản viewer
        self.app.dependency_overrides[get_current_user] = lambda: {
            "id": "user-viewer-id",
            "email": "viewer@dscons.vn",
            "role": "viewer",
        }

        # Tài khoản viewer tạo thiết bị mới (yêu cầu role cao hơn) sẽ bị từ chối với mã 403
        response = self.client.post(
            "/v1/erp/equipment",
            json={
                "company_id": "00000000-0000-0000-0000-000000000001",
                "equipment_code": "EQ-TEST-999",
                "equipment_name": "Máy xúc Kobelco Test",
                "equipment_type": "excavator",
                "ownership_type": "owned",
                "hourly_rate_standard": 250000.0,
                "fuel_norm_per_hour": 12.5,
                "status": "available",
            },
        )
        self.assertEqual(response.status_code, 403)

    def test_viewer_forbidden_from_financial_war_room(self):
        # Viewer không được xem thông tin tài chính dòng tiền nhạy cảm
        self.app.dependency_overrides[get_current_user] = lambda: {
            "id": "user-viewer-id",
            "email": "viewer@dscons.vn",
            "role": "viewer",
        }
        response = self.client.get("/v1/war-room/summary")
        self.assertEqual(response.status_code, 403)

    def test_viewer_forbidden_from_invoice_sync_configs(self):
        # Viewer không được xem/sửa cấu hình tài khoản Cổng Thuế
        self.app.dependency_overrides[get_current_user] = lambda: {
            "id": "user-viewer-id",
            "email": "viewer@dscons.vn",
            "role": "viewer",
        }
        response = self.client.get("/v1/erp/invoices/sync/configs")
        self.assertEqual(response.status_code, 403)

    def test_superadmin_allowed_financial_war_room(self):
        # SuperAdmin truy cập thành công War Room
        self.app.dependency_overrides[get_current_user] = lambda: {
            "id": "user-admin-id",
            "email": "admin@dscons.vn",
            "role": "superadmin",
        }
        response = self.client.get("/v1/war-room/summary")
        self.assertEqual(response.status_code, 200)


if __name__ == "__main__":
    unittest.main()
