import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool

from app.db.base import Base
from app.crud.clients import create_client, get_client, update_client, delete_client


def setup_in_memory_db():
    engine = create_engine(
        "sqlite://",
        connect_args={"check_same_thread": False},
        poolclass=StaticPool,
        future=True,
    )
    TestingSessionLocal = sessionmaker(bind=engine)
    Base.metadata.create_all(bind=engine)
    return TestingSessionLocal()


def test_create_and_get_client():
    db = setup_in_memory_db()
    data = {"full_name": "Juan Perez", "email": "juan@example.com", "phone": "555-1234"}
    client = create_client(db, client_data=data)
    assert client.id is not None

    fetched = get_client(db, client.id)
    assert fetched is not None
    assert fetched.email == data["email"]


def test_update_and_delete_client():
    db = setup_in_memory_db()
    data = {"full_name": "Maria Gomez", "email": "maria@example.com"}
    client = create_client(db, client_data=data)
    updates = {"phone": "999-0000"}
    updated = update_client(db, client, updates)
    assert updated.phone == "999-0000"

    deleted = delete_client(db, updated)
    assert deleted is True
    assert get_client(db, updated.id) is None
