"""Component command handlers — Phase 11.2."""
from __future__ import annotations

from uuid import UUID

from sqlalchemy.ext.asyncio import AsyncSession

from app.schemas.components import (
    ExperienceComponentCreate,
    ExperienceComponentUpdate,
    ExperienceComponentVersionCreate,
    ExperienceComponentVersionUpdate,
    PageComponentPlacementCreate,
    PageComponentPlacementUpdate,
)
from app.services.components import ExperienceComponentService
from shared.security import CurrentUser


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

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

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

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

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

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

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

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

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

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

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

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

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

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