from unittest.mock import AsyncMock, MagicMock, patch
from uuid import uuid4

import pytest

from src.domain.billing.credit_policy import (
    email_is_staff,
    skips_ai_credit_limits,
    workspace_skips_ai_credits,
)
from src.domain.billing.plan_quota_service import PlanQuotaService


def test_email_is_staff_matches_configured_domain():
    assert email_is_staff("muhammad.zakir@pie-solutions.com", {"pie-solutions.com"})
    assert not email_is_staff("owner@customer.com", {"pie-solutions.com"})
    assert not email_is_staff("nobody", {"pie-solutions.com"})
    assert not email_is_staff("a@pie-solutions.com", set())


def test_skips_ai_credit_limits_for_staff_and_exempt_flag():
    assert skips_ai_credit_limits(skip_plan_quota_limits=True, plan_slug="free")
    assert skips_ai_credit_limits(skip_plan_quota_limits=False, plan_slug="staff")
    assert skips_ai_credit_limits(skip_plan_quota_limits=False, plan_slug="STAFF")
    assert not skips_ai_credit_limits(skip_plan_quota_limits=False, plan_slug="free")
    assert not skips_ai_credit_limits(skip_plan_quota_limits=False, plan_slug=None)


@pytest.mark.asyncio
async def test_plan_quota_skips_for_staff_plan():
    ws_id = uuid4()
    ws_repo = AsyncMock()
    ws_repo.get_by_id = AsyncMock(
        return_value=MagicMock(selected_plan_slug="staff", skip_plan_quota_limits=False)
    )
    sub_repo = AsyncMock()
    sub_repo.get_by_workspace = AsyncMock(return_value=None)
    svc = PlanQuotaService(ws_repo, sub_repo, AsyncMock())
    assert await svc.workspace_skips_plan_quotas(ws_id) is True
    assert await svc.max_projects(ws_id) is None


@pytest.mark.asyncio
async def test_workspace_skips_ai_credits_for_staff_owner_on_free_plan():
    ws_id = uuid4()
    owner_id = uuid4()
    workspace = MagicMock(
        skip_plan_quota_limits=False,
        selected_plan_slug="free",
        owner_id=owner_id,
    )
    settings = MagicMock(
        quota_exempt_workspace_id_set=set(),
        staff_email_domain_set={"pie-solutions.com"},
    )
    with (
        patch("src.config.get_settings", return_value=settings),
        patch("src.domain.workspaces.repository.WorkspaceRepository") as ws_cls,
        patch("src.domain.billing.repository.SubscriptionRepository") as sub_cls,
        patch("src.domain.auth.repository.UserRepository") as user_cls,
    ):
        ws_cls.return_value.get_by_id = AsyncMock(return_value=workspace)
        sub_cls.return_value.get_by_workspace = AsyncMock(return_value=None)
        user_cls.return_value.get_by_id = AsyncMock(
            return_value=MagicMock(email="muhammad.zakir@pie-solutions.com")
        )
        assert await workspace_skips_ai_credits(AsyncMock(), ws_id) is True
