import pytest
from sqlalchemy.orm import Session

from ...entities import ServiceEntity
from ...models.enum_for_models import ProgramTypeEnum
from ...models.service_model import Service

service_1 = Service(
    id=1,
    name="service 1",
    status="open",
    summary="presentation educating community on domestic violence",
    requirements=[""],
    program=ProgramTypeEnum.COMMUNITY,
)

service_2 = Service(
    id=2,
    name="service 2",
    status="closed",
    summary="service finding safe places to stay",
    requirements=[""],
    program=ProgramTypeEnum.DOMESTIC,
)

service_3 = Service(
    id=3,
    name="service 3",
    status="open",
    summary="",
    requirements=[""],
    program=ProgramTypeEnum.DOMESTIC,
)

service_4 = Service(
    id=4,
    name="service 4",
    status="waitlist",
    summary="community event",
    requirements=[""],
    program=ProgramTypeEnum.COMMUNITY,
)

service_5 = Service(
    id=5,
    name="service 5",
    status="open",
    summary="talk circle for victims of domestic violence",
    requirements=["18+"],
    program=ProgramTypeEnum.COMMUNITY,
)

service_6 = Service(
    id=6,
    name="service 6",
    status="waitlist",
    summary="program offering economic assistance",
    requirements=[""],
    program=ProgramTypeEnum.ECONOMIC,
)

service_6_edit = Service(
    id=6,
    name="service 6",
    status="open",
    summary="program offering economic assistance",
    requirements=["18+"],
    program=ProgramTypeEnum.ECONOMIC,
)

service_7 = Service(
    id=7,
    name="service 7",
    status="waitlist",
    summary="insert generic description",
    requirements=[""],
    program=ProgramTypeEnum.ECONOMIC,
)

new_service = Service(
    id=8,
    name="new service",
    status="open",
    summary="insert other generic description",
    requirements=[""],
    program=ProgramTypeEnum.DOMESTIC,
)

services = [service_1, service_2, service_3, service_4, service_5, service_6]

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 services

    # Create entities for test organization data
    entities = []
    for service in services:
        entity = ServiceEntity.from_model(service)
        session.add(entity)
        entities.append(entity)

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

    # Commit all changes
    session.commit()