from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session

from app.database import get_db
from app.dependencies import require_user_token
from app.models import User
from app.schemas import (
    Message,
    UserRegisterStepAcceptRequest,
    UserRegisterStepSaveRequest,
    UserRegisterStepStateResponse,
)
from app.services.user_register_step_service import (
    accept_user_register_step,
    build_register_step_state,
    complete_user_register_step,
    delete_user_register_step,
    get_user_register_step,
    save_user_register_step,
)

router = APIRouter(tags=["user-register-step"])


@router.get(
    "/register-step",
    response_model=UserRegisterStepStateResponse,
    summary="Get register-step progress (open / locked / completed per step)",
)
def get_register_step(
    db: Session = Depends(get_db),
    user: User = Depends(require_user_token),
):
    row = get_user_register_step(db, user)
    return build_register_step_state(row)


@router.post(
    "/register-step/save",
    response_model=UserRegisterStepStateResponse,
    summary="Save selections for the current step without advancing",
)
def save_register_step(
    body: UserRegisterStepSaveRequest,
    db: Session = Depends(get_db),
    user: User = Depends(require_user_token),
):
    return save_user_register_step(db, user, body)


@router.post(
    "/register-step/accept",
    response_model=UserRegisterStepStateResponse,
    summary="Accept the current step selection and unlock the next step",
)
def accept_register_step(
    body: UserRegisterStepAcceptRequest,
    db: Session = Depends(get_db),
    user: User = Depends(require_user_token),
):
    return accept_user_register_step(db, user, body)


@router.post(
    "/register-step/complete",
    response_model=UserRegisterStepStateResponse,
    summary="Complete the current step using an existing selection and move forward",
)
def complete_register_step(
    db: Session = Depends(get_db),
    user: User = Depends(require_user_token),
):
    return complete_user_register_step(db, user)


@router.delete(
    "/register-step",
    response_model=Message,
    summary="Reset registration progress (removes row from user_register_steps)",
)
def reset_register_step(
    db: Session = Depends(get_db),
    user: User = Depends(require_user_token),
):
    delete_user_register_step(db, user)
    return Message(message="Registration progress reset. Start again from level.")
