"""Forms / surveys / appointments command handlers — Phase 11.6."""
from __future__ import annotations

from uuid import UUID

from sqlalchemy.ext.asyncio import AsyncSession

from app.schemas.forms import (
    AppointmentBookingRefCreate,
    AppointmentBookingRefUpdate,
    ExperienceAppointmentPageCreate,
    ExperienceAppointmentPageUpdate,
    ExperienceFormCreate,
    ExperienceFormUpdate,
    ExperienceSurveyCreate,
    ExperienceSurveyUpdate,
    FormSubmissionCreate,
    FormSubmissionUpdate,
    SurveyResponseCreate,
    SurveyResponseUpdate,
)
from app.services.forms import ExperienceFormsService
from shared.security import CurrentUser


class FormsCommands:
    def __init__(self, session: AsyncSession) -> None:
        self.service = ExperienceFormsService(session)

    async def create_form(
        self,
        tenant_id: UUID,
        body: ExperienceFormCreate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.create_form(tenant_id, body, actor=actor)

    async def update_form(
        self,
        tenant_id: UUID,
        form_id: UUID,
        body: ExperienceFormUpdate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.update_form(tenant_id, form_id, body, actor=actor)

    async def soft_delete_form(
        self, tenant_id: UUID, form_id: UUID, *, actor: CurrentUser | None
    ):
        return await self.service.soft_delete_form(tenant_id, form_id, actor=actor)

    async def create_submission(
        self,
        tenant_id: UUID,
        body: FormSubmissionCreate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.create_submission(tenant_id, body, actor=actor)

    async def update_submission(
        self,
        tenant_id: UUID,
        submission_id: UUID,
        body: FormSubmissionUpdate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.update_submission(
            tenant_id, submission_id, body, actor=actor
        )

    async def create_survey(
        self,
        tenant_id: UUID,
        body: ExperienceSurveyCreate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.create_survey(tenant_id, body, actor=actor)

    async def update_survey(
        self,
        tenant_id: UUID,
        survey_id: UUID,
        body: ExperienceSurveyUpdate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.update_survey(
            tenant_id, survey_id, body, actor=actor
        )

    async def soft_delete_survey(
        self, tenant_id: UUID, survey_id: UUID, *, actor: CurrentUser | None
    ):
        return await self.service.soft_delete_survey(tenant_id, survey_id, actor=actor)

    async def create_survey_response(
        self,
        tenant_id: UUID,
        body: SurveyResponseCreate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.create_survey_response(tenant_id, body, actor=actor)

    async def update_survey_response(
        self,
        tenant_id: UUID,
        response_id: UUID,
        body: SurveyResponseUpdate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.update_survey_response(
            tenant_id, response_id, body, actor=actor
        )

    async def create_appointment_page(
        self,
        tenant_id: UUID,
        body: ExperienceAppointmentPageCreate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.create_appointment_page(tenant_id, body, actor=actor)

    async def update_appointment_page(
        self,
        tenant_id: UUID,
        page_id: UUID,
        body: ExperienceAppointmentPageUpdate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.update_appointment_page(
            tenant_id, page_id, body, actor=actor
        )

    async def soft_delete_appointment_page(
        self, tenant_id: UUID, page_id: UUID, *, actor: CurrentUser | None
    ):
        return await self.service.soft_delete_appointment_page(
            tenant_id, page_id, actor=actor
        )

    async def create_booking_ref(
        self,
        tenant_id: UUID,
        body: AppointmentBookingRefCreate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.create_booking_ref(tenant_id, body, actor=actor)

    async def update_booking_ref(
        self,
        tenant_id: UUID,
        booking_id: UUID,
        body: AppointmentBookingRefUpdate,
        *,
        actor: CurrentUser | None,
    ):
        return await self.service.update_booking_ref(
            tenant_id, booking_id, body, actor=actor
        )
