from __future__ import annotations

from dataclasses import dataclass
from typing import TypeAlias

from pydantic import BaseModel

from .generated.v2_all import (
    AccountLoginCompletedNotification,
    AccountRateLimitsUpdatedNotification,
    AccountUpdatedNotification,
    AgentMessageDeltaNotification,
    AppListUpdatedNotification,
    CommandExecutionOutputDeltaNotification,
    ConfigWarningNotification,
    ContextCompactedNotification,
    DeprecationNoticeNotification,
    ErrorNotification,
    FileChangeOutputDeltaNotification,
    ItemCompletedNotification,
    ItemStartedNotification,
    McpServerOauthLoginCompletedNotification,
    McpToolCallProgressNotification,
    PlanDeltaNotification,
    RawResponseItemCompletedNotification,
    ReasoningSummaryPartAddedNotification,
    ReasoningSummaryTextDeltaNotification,
    ReasoningTextDeltaNotification,
    TerminalInteractionNotification,
    ThreadNameUpdatedNotification,
    ThreadStartedNotification,
    ThreadTokenUsageUpdatedNotification,
    TurnCompletedNotification,
    TurnDiffUpdatedNotification,
    TurnPlanUpdatedNotification,
    TurnStartedNotification,
    WindowsWorldWritableWarningNotification,
)

JsonScalar: TypeAlias = str | int | float | bool | None
JsonValue: TypeAlias = JsonScalar | dict[str, "JsonValue"] | list["JsonValue"]
JsonObject: TypeAlias = dict[str, JsonValue]


@dataclass(slots=True)
class UnknownNotification:
    params: JsonObject


NotificationPayload: TypeAlias = (
    AccountLoginCompletedNotification
    | AccountRateLimitsUpdatedNotification
    | AccountUpdatedNotification
    | AgentMessageDeltaNotification
    | AppListUpdatedNotification
    | CommandExecutionOutputDeltaNotification
    | ConfigWarningNotification
    | ContextCompactedNotification
    | DeprecationNoticeNotification
    | ErrorNotification
    | FileChangeOutputDeltaNotification
    | ItemCompletedNotification
    | ItemStartedNotification
    | McpServerOauthLoginCompletedNotification
    | McpToolCallProgressNotification
    | PlanDeltaNotification
    | RawResponseItemCompletedNotification
    | ReasoningSummaryPartAddedNotification
    | ReasoningSummaryTextDeltaNotification
    | ReasoningTextDeltaNotification
    | TerminalInteractionNotification
    | ThreadNameUpdatedNotification
    | ThreadStartedNotification
    | ThreadTokenUsageUpdatedNotification
    | TurnCompletedNotification
    | TurnDiffUpdatedNotification
    | TurnPlanUpdatedNotification
    | TurnStartedNotification
    | WindowsWorldWritableWarningNotification
    | UnknownNotification
)


@dataclass(slots=True)
class Notification:
    method: str
    payload: NotificationPayload


class ServerInfo(BaseModel):
    name: str | None = None
    version: str | None = None


class InitializeResponse(BaseModel):
    serverInfo: ServerInfo | None = None
    userAgent: str | None = None
