"""Schemas for the Smart Onboarding Advisor — the onboarding RUNTIME step.

DTOs only. The Advisor ORCHESTRATES the existing engines (Company 2A, RS-005, optimization,
completeness) — no new reasoning engine, no new capability registry, no new meta-model. Welt-1
discipline: a certificate yields PROBABLE capabilities (verification required), never "erfüllt".
Python 3.9 compatible (no `|` unions).
"""

from __future__ import annotations

from typing import List, Optional

from pydantic import BaseModel, Field


class OnboardingInput(BaseModel):
    company: str = ""
    industry: Optional[str] = None
    products: List[str] = Field(default_factory=list)
    markets: List[str] = Field(default_factory=list)
    certifications: List[str] = Field(default_factory=list)
    known_evidence: List[str] = Field(default_factory=list)
    target: List[str] = Field(default_factory=list)          # informational; the delta uses injected requirements


class InferredAssumption(BaseModel):
    certification: str
    capabilities: List[str] = Field(default_factory=list)    # RELEVANT-to-target caps the cert probably provides
    verification_required: bool = True                       # Welt-1: never auto-satisfied
    statement: str = ""


class RejectedAssumption(BaseModel):
    certification: Optional[str] = None
    statement: str = ""
    reason: str = ""                                         # e.g. "relevance(evidence, target) = 0"


class AdvisorQuestion(BaseModel):
    capability_id: str
    question_intent: str
    why: str                                                 # every question explains itself
    information_value: float = 0.0                           # deterministic rank score
    priority: str = "medium"


class AdvisorMeasure(BaseModel):
    capability_id: str
    leverage: int = 0
    closes: List[str] = Field(default_factory=list)


class AdvisorResult(BaseModel):
    inferred_assumptions: List[InferredAssumption] = Field(default_factory=list)
    rejected_assumptions: List[RejectedAssumption] = Field(default_factory=list)
    auto_detected: List[str] = Field(default_factory=list)                     # detected (concrete artifact): recognised w/o asking
    indications: List[str] = Field(default_factory=list)                       # partial signal: raises assumption strength, STILL asked
    next_best_questions: List[AdvisorQuestion] = Field(default_factory=list)   # max 5
    capability_delta: List[str] = Field(default_factory=list)
    top_measures: List[AdvisorMeasure] = Field(default_factory=list)
    evidence_requests: List[str] = Field(default_factory=list)
    unsupported_domains: List[str] = Field(default_factory=list)
    completeness_summary: str = ""
    headline: str = ""                                       # "N erkannt, M wahrscheinlich abgedeckt, K zu klären"
