"""Widget iş mantığı — panel CRUD + public settings."""
from fastapi import Depends

from app.config import settings as app_settings
from app.models.chat import ChatWidget
from app.repositories.widget_repo import WidgetRepository
from app.schemas.chat import (
    CreateWidgetRequest,
    UpdateWidgetRequest,
    WidgetResponse,
    WidgetSettingsResponse,
)
from app.utils.exceptions import NotFoundError
from app.utils.security import generate_api_key

DEFAULT_SETTINGS = {
    "theme_color": "#6366f1",
    "position": "bottom-right",
    "welcome_message": "Merhaba! Size nasıl yardımcı olabilirim?",
}


class WidgetService:
    def __init__(self, repo: WidgetRepository = Depends()):
        self.repo = repo

    async def list_widgets(self, tenant_id: str) -> list[dict]:
        widgets = await self.repo.list_by_tenant(tenant_id)
        return [WidgetResponse.model_validate(w).model_dump(mode="json") for w in widgets]

    async def get_widget(self, widget_id: str, tenant_id: str) -> WidgetResponse:
        widget = await self._get_or_404(widget_id, tenant_id)
        return WidgetResponse.model_validate(widget)

    async def create_widget(
        self, tenant_id: str, body: CreateWidgetRequest
    ) -> WidgetResponse:
        data = body.model_dump()
        data["settings"] = data.get("settings") or DEFAULT_SETTINGS
        widget = await self.repo.create(
            tenant_id=tenant_id, api_key=generate_api_key("fvy_live"), **data
        )
        return WidgetResponse.model_validate(widget)

    async def update_widget(
        self, widget_id: str, tenant_id: str, body: UpdateWidgetRequest
    ) -> WidgetResponse:
        widget = await self._get_or_404(widget_id, tenant_id)
        updates = body.model_dump(exclude_none=True)
        widget = await self.repo.update(widget, **updates)
        return WidgetResponse.model_validate(widget)

    async def get_public_settings(self, widget: ChatWidget) -> WidgetSettingsResponse:
        product_count = await self.repo.count_active_products(widget.tenant_id)
        return WidgetSettingsResponse(
            widget_id=widget.id,
            name=widget.name,
            is_online=widget.is_online,
            ai_enabled=widget.ai_enabled,
            streaming_enabled=app_settings.flovy_streaming_enabled,
            product_count=product_count,
            settings=widget.settings or DEFAULT_SETTINGS,
        )

    async def _get_or_404(self, widget_id: str, tenant_id: str) -> ChatWidget:
        widget = await self.repo.get(widget_id, tenant_id)
        if not widget:
            raise NotFoundError("Widget")
        return widget
