from __future__ import annotations

from bson import ObjectId
from motor.motor_asyncio import AsyncIOMotorDatabase

from fastcheck_api.app.core.security import create_access_token, verify_password


class AuthService:
    @staticmethod
    async def login(*, db: AsyncIOMotorDatabase, email: str, password: str) -> dict:
        user = await db["users"].find_one({"email": email.lower()})
        if not user:
            raise ValueError("Invalid credentials")

        if not user.get("isActive", False):
            raise PermissionError("ACCOUNT_NOT_ACTIVATED")

        stored = user.get("password")
        if not stored:
            raise ValueError("Invalid credentials")

        if not verify_password(password, stored):
            raise ValueError("Invalid credentials")

        tenant_id = user.get("tenant")
        if isinstance(tenant_id, ObjectId):
            tenant_id_str = str(tenant_id)
        else:
            tenant_id_str = str(tenant_id or "")

        token = create_access_token(
            user_id=str(user["_id"]),
            email=str(user.get("email") or ""),
            role=str(user.get("role") or ""),
            tenant_id=tenant_id_str,
        )

        return {
            "token": token,
            "user": {
                "id": str(user["_id"]),
                "name": str(user.get("name") or ""),
                "email": str(user.get("email") or ""),
                "role": str(user.get("role") or ""),
            },
        }
