# # app/services/visitor.py
# from sqlalchemy.orm import Session
# from app.models.visitor import Visitor
# from app.schemas.visitor import VisitorCreate
# from app.services.client import get_client_by_widget

# def create_or_get_visitor(db: Session, data: VisitorCreate):

#     client = get_client_by_widget(db, data.client_widget_id)

#     if not client:
#         return None
    
#     visitor = db.query(Visitor).filter( Visitor.visitor_id == data.visitor_id , Visitor.client_id == client.id ).first()

#     if visitor:
#         return visitor

#     visitor = Visitor(
#         visitor_id=data.visitor_id,
#         client_id=client.id,
#         ip_address=data.ip_address,
#         user_agent=data.user_agent
#     )

#     db.add(visitor)
#     db.commit()
#     db.refresh(visitor)
#     return visitor




# ----------------------------------------------------------------------------------------------------------------------

# app/services/visitor.py

from sqlalchemy import select
from sqlalchemy.orm import Session
from app.models.client import Client
from app.models.visitor import Visitor
from app.schemas.visitor import VisitorCreate
from sqlalchemy.ext.asyncio import AsyncSession
from app.services.client import get_client_by_widget

async def create_or_get_visitor(db: AsyncSession, data: VisitorCreate):
    """
    Async version using select() instead of .query()
    """

    print("data from visitor ----", data)

    # 1️⃣ Validate client exists
    client = await db.execute(
        select(Client).where(Client.client_widget_id == data.client_widget_id)
    )
    client = client.scalar_one_or_none()

    if not client:
        raise ValueError("Invalid client widget id")

    # 2️⃣ Check if visitor exists
    result = await db.execute(
        select(Visitor).where(
            Visitor.visitor_id == data.visitor_id,
            Visitor.client_id == client.id
        )
    )
    existing = result.scalar_one_or_none()

    if existing:
        return existing

    # 3️⃣ Create new visitor
    visitor = Visitor(
        visitor_id=data.visitor_id,
        client_id=client.id,
        name=data.name,
        ip_address=data.ip_address,
        user_agent=data.user_agent,
    )

    db.add(visitor)
    await db.commit()
    await db.refresh(visitor)

    return visitor


async def get_visitor_by_visitor_id(db: AsyncSession, visitor_uuid: str):
    """
    Fetch visitor by visitor UUID (Async version)
    """
    stmt = select(Visitor).where(Visitor.visitor_id == visitor_uuid)
    result = await db.execute(stmt)
    return result.scalars().first()


def get_visitor_by_id(db: Session, visitor_uuid: str):
    return (
        db.query(Visitor).filter( Visitor.visitor_id == visitor_uuid ).first()
    )

