import pytest
from sqlalchemy.orm import Session
from ...models.user_model import User

# import model enums instead
from ...models.enum_for_models import UserTypeEnum, ProgramTypeEnum
from ...entities.user_entity import UserEntity
from datetime import datetime


programs = ProgramTypeEnum
roles = UserTypeEnum

volunteer = User(
    id=1,
    username="volunteer",
    email="volunteer@compass.com",
    experience=1,
    group="volunteers",
    program=[programs.COMMUNITY],
    created_at=datetime.now(),
    role=UserTypeEnum.VOLUNTEER,
)

employee = User(
    id=2,
    username="employee",
    email="employee@compass.com",
    experience=5,
    group="employees",
    program=[programs.DOMESTIC, programs.ECONOMIC],
    created_at=datetime.now(),
    role=roles.EMPLOYEE,
)

admin = User(
    id=3,
    username="admin",
    email="admin@compass.com",
    experience=10,
    group="admin",
    program=[
        programs.ECONOMIC,
        programs.DOMESTIC,
        programs.COMMUNITY,
    ],
    created_at=datetime.now(),
    role=roles.ADMIN,
)

newUser = User(
    id=4,
    username="new",
    email="new@compass.com",
    experience=1,
    group="volunteer",
    program=[programs.ECONOMIC],
    created_at=datetime.now(),
    role=roles.VOLUNTEER,
)

toDelete = User(
    id=5,
    username="delete",
    email="delete@compass.com",
    experience=0,
    group="none",
    program=[programs.COMMUNITY],
    created_at=datetime.now(),
    role=roles.VOLUNTEER
)

users = [volunteer, employee, admin, toDelete]


from sqlalchemy import text
from sqlalchemy.orm import Session, DeclarativeBase, InstrumentedAttribute


def reset_table_id_seq(
    session: Session,
    entity: type[DeclarativeBase],
    entity_id_column: InstrumentedAttribute[int],
    next_id: int,
) -> None:
    """Reset the ID sequence of an entity table.

    Args:
        session (Session) - A SQLAlchemy Session
        entity (DeclarativeBase) - The SQLAlchemy Entity table to target
        entity_id_column (MappedColumn) - The ID column (should be an int column)
        next_id (int) - Where the next inserted, autogenerated ID should begin

    Returns:
        None"""
    table = entity.__table__
    id_column_name = entity_id_column.name
    sql = text(f"ALTER SEQUENCe {table}_{id_column_name}_seq RESTART WITH {next_id}")
    session.execute(sql)


def insert_fake_data(session: Session):
    """Inserts fake organization data into the test session."""

    global users

    # Create entities for test organization data
    entities = []
    for user in users:
        entity = UserEntity.from_model(user)
        session.add(entity)
        entities.append(entity)

    # Reset table IDs to prevent ID conflicts
    reset_table_id_seq(session, UserEntity, UserEntity.id, len(users) + 1)

    # Commit all changes
    session.commit()


@pytest.fixture(autouse=True)
def fake_data_fixture(session: Session):
    """Insert fake data the session automatically when test is run.
    Note:
        This function runs automatically due to the fixture property `autouse=True`.
    """
    # insert_fake_data(session)
    session.commit()
    yield