from typing import Optional

from sqlmodel import Session

from app.models import User
from app.models.base import _utcnow


class UserRepository:
    def __init__(self, session: Session):
        self.session = session

    def get_by_id(self, user_id: str) -> Optional[User]:
        return self.session.get(User, user_id)

    def upsert(self, user_id: str, email: str, name: str, photo_url: str) -> User:
        """Create or update user. Returns the user."""
        user = self.session.get(User, user_id)
        if user:
            user.name = name
            user.photo_url = photo_url
            user.updated_at = _utcnow()
        else:
            user = User(user_id=user_id, email=email, name=name, photo_url=photo_url)
            self.session.add(user)
        self.session.commit()
        self.session.refresh(user)
        return user

    def update_language(self, user_id: str, language: str) -> bool:
        user = self.session.get(User, user_id)
        if not user:
            return False
        user.language = language
        user.onboarded = 1
        user.updated_at = _utcnow()
        self.session.commit()
        return True
