from fastapi import APIRouter, Depends
from sqlmodel import Session

from app.auth import create_jwt, get_current_user
from app.database import get_session
from app.repositories.subscription import SubscriptionRepository
from app.repositories.user import UserRepository
from app.schemas.auth import CurrentUser
from app.schemas.sync import SyncConfig, SyncResponse, SyncSubscription, SyncUser
from app.services.subscription import is_premium

router = APIRouter()


@router.get("/sync", response_model=SyncResponse)
async def sync(
    current_user: CurrentUser = Depends(get_current_user),
    session: Session = Depends(get_session),
):
    """Single endpoint called on app open. Returns everything the app needs."""
    user_id = current_user.sub

    user_repo = UserRepository(session)
    sub_repo = SubscriptionRepository(session)

    user = user_repo.get_by_id(user_id)
    sub = sub_repo.get_latest(user_id)

    premium = False
    sub_status = "none"
    sub_expiry = ""
    sub_product = ""

    if sub:
        sub_status = sub.status
        sub_expiry = sub.expiry_date or ""
        sub_product = sub.product_id or ""
        premium = is_premium(sub_status, sub_expiry)

    new_token = create_jwt(
        user_id,
        current_user.email,
        is_premium=premium,
        plan=sub_product,
        premium_expiry=sub_expiry if premium else "",
    )

    return SyncResponse(
        token=new_token,
        user=SyncUser(
            userId=user_id,
            email=user.email if user else current_user.email,
            name=user.name if user else "",
            photoUrl=user.photo_url if user else "",
            language=user.language if user else "en",
        ),
        subscription=SyncSubscription(
            isPremium=premium,
            status=sub_status,
            productId=sub_product,
            expiryDate=sub_expiry,
        ),
        config=SyncConfig(
            minAppVersion="1.0.0",
            forceUpdate=False,
        ),
    )
