from sqlalchemy import union_all, select

from src.data.model.db.base_db import User
from src.data.model.schemas import UserData
from src.data.repositories.base import BaseRepository
from src.data.model.db.partner_agent import Agent, Partner, AgentPartner
from src.utils.jwt import hash_password


class UserRepository(BaseRepository):
    async def get_password_hash(self, username):
        stmts = [
            select(type.password_hash).where(type.username == username)
            for type in [Agent, Partner]
        ]
        results = [await self.async_session.scalar(stmt) for stmt in stmts]
        print(results)
        for hash in results:
            if hash:
                return hash

    async def change_password(self, user: UserData):
        if user.username.isdigit():
            user_db = await self.async_session.scalar(select(Partner).where(Partner.username == user.username))
        else:
            user_db = await self.async_session.scalar(select(Agent).where(Agent.username == user.username))

        if not user_db:
            return False, None

        user_db.password_hash = hash_password(user.password)
        email = user_db.email
        await self.async_session.merge(user_db)
        await self.async_session.commit()

        return True, email


    async def get_agent_username_by_partner(self, partner_num):
        stmt = select(AgentPartner.agent_num).where(AgentPartner.partner_num == partner_num)
        agent_num = await self.async_session.scalar(stmt)
        if not agent_num:
            raise ValueError("There is not agent for given partner")
        agent = await self.async_session.get(Agent, agent_num)
        return agent.username