import pytest
from sqlalchemy.orm import Session

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

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

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

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

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

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

service6 = 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,
)

service7 = 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 = [service1, service2, service3, service4, service5, service6]

service_1 = Service(
    id=1,
    name="Crisis Hotline",
    status="open",
    summary="24/7 support for individuals in crisis",
    requirements=["Anonymous", "Confidential"],
    program=ProgramTypeEnum.DOMESTIC,
)

service_2 = Service(
    id=2,
    name="Shelter Placement",
    status="open",
    summary="Emergency shelter for victims of domestic violence",
    requirements=["Referral required", "Safety assessment"],
    program=ProgramTypeEnum.DOMESTIC,
)

service_3 = Service(
    id=3,
    name="Legal Advocacy",
    status="waitlist",
    summary="Legal support and representation for survivors",
    requirements=["Intake required", "Income eligibility"],
    program=ProgramTypeEnum.COMMUNITY,
)

service_4 = Service(
    id=4,
    name="Counseling Services",
    status="open",
    summary="Individual and group therapy for survivors",
    requirements=["Initial assessment", "Insurance accepted"],
    program=ProgramTypeEnum.DOMESTIC,
)

service_5 = Service(
    id=5,
    name="Financial Assistance",
    status="open",
    summary="Emergency funds for survivors in need",
    requirements=["Application required", "Proof of income"],
    program=ProgramTypeEnum.ECONOMIC,
)

service_6 = Service(
    id=6,
    name="Housing Assistance",
    status="waitlist",
    summary="Support for finding safe and affordable housing",
    requirements=["Referral required", "Background check"],
    program=ProgramTypeEnum.ECONOMIC,
)

service_7 = Service(
    id=7,
    name="Job Training",
    status="open",
    summary="Employment skills training for survivors",
    requirements=["Enrollment required", "18+"],
    program=ProgramTypeEnum.ECONOMIC,
)

service_8 = Service(
    id=8,
    name="Support Groups",
    status="open",
    summary="Peer support groups for survivors",
    requirements=["Registration required", "Confidential"],
    program=ProgramTypeEnum.COMMUNITY,
)

service_9 = Service(
    id=9,
    name="Children's Services",
    status="open",
    summary="Specialized services for children exposed to domestic violence",
    requirements=["Parental consent", "Age-appropriate"],
    program=ProgramTypeEnum.DOMESTIC,
)

service_10 = Service(
    id=10,
    name="Safety Planning",
    status="open",
    summary="Personalized safety planning for survivors",
    requirements=["Confidential", "Collaborative"],
    program=ProgramTypeEnum.DOMESTIC,
)

service_11 = Service(
    id=11,
    name="Community Education",
    status="open",
    summary="Workshops and training on domestic violence prevention",
    requirements=["Open to the public", "Registration preferred"],
    program=ProgramTypeEnum.COMMUNITY,
)

service_12 = Service(
    id=12,
    name="Healthcare Services",
    status="open",
    summary="Medical care and support for survivors",
    requirements=["Referral required", "Insurance accepted"],
    program=ProgramTypeEnum.DOMESTIC,
)

service_13 = Service(
    id=13,
    name="Transportation Assistance",
    status="waitlist",
    summary="Help with transportation for survivors",
    requirements=["Eligibility assessment", "Limited availability"],
    program=ProgramTypeEnum.ECONOMIC,
)

service_14 = Service(
    id=14,
    name="Court Accompaniment",
    status="open",
    summary="Support and advocacy during court proceedings",
    requirements=["Legal case", "Scheduling required"],
    program=ProgramTypeEnum.COMMUNITY,
)

service_15 = Service(
    id=15,
    name="Relocation Assistance",
    status="waitlist",
    summary="Support for relocating to a safe environment",
    requirements=["Referral required", "Safety assessment"],
    program=ProgramTypeEnum.ECONOMIC,
)

service_16 = Service(
    id=16,
    name="Parenting Classes",
    status="open",
    summary="Education and support for parents",
    requirements=["Open to parents", "Pre-registration required"],
    program=ProgramTypeEnum.COMMUNITY,
)

service_17 = Service(
    id=17,
    name="Life Skills Training",
    status="open",
    summary="Workshops on various life skills for survivors",
    requirements=["Enrollment required", "Commitment to attend"],
    program=ProgramTypeEnum.ECONOMIC,
)

service_18 = Service(
    id=18,
    name="Advocacy Services",
    status="open",
    summary="Individual advocacy and support for survivors",
    requirements=["Intake required", "Confidential"],
    program=ProgramTypeEnum.DOMESTIC,
)

service_19 = Service(
    id=19,
    name="Volunteer Opportunities",
    status="open",
    summary="Various volunteer roles supporting the organization",
    requirements=["Background check", "Training required"],
    program=ProgramTypeEnum.COMMUNITY,
)

service_20 = Service(
    id=20,
    name="Referral Services",
    status="open",
    summary="Referrals to community resources and partner agencies",
    requirements=["Intake required", "Based on individual needs"],
    program=ProgramTypeEnum.DOMESTIC,
)

services1 = [
    service_1,
    service_2,
    service_3,
    service_4,
    service_5,
    service_6,
    service_7,
    service_8,
    service_9,
    service_10,
    service_11,
    service_12,
    service_13,
    service_14,
    service_15,
    service_16,
    service_17,
    service_18,
    service_19,
    service_20,
]

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_test_data(session: Session):
    """Inserts fake service data into the test session."""
    global services1

    # Create entities for test organization data
    entities = []
    for service in services1:
        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(services1) + 1)

    # Commit all changes
    session.commit()


def insert_fake_data(session: Session):
    """Inserts fake service 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()