"""Onboarding Advisor endpoint — exposes the existing Smart Onboarding Advisor at runtime.

This adds NO new reasoning logic. It exposes the already-built, tested orchestration (Signal Producers
-> Normalizer -> Silent Knowledge Pass -> Advisor) through one runtime endpoint. No DB, no persistence.

  POST /onboarding/advisor-start  — (company + certs + target + scanner findings) -> advisory payload
  GET  /onboarding/targets        — the supported target ids
"""

import logging
from typing import Dict, List, Optional

from fastapi import APIRouter, HTTPException
from pydantic import BaseModel, Field

from compliance.onboarding import (
    AdvisorMeasure,
    AdvisorQuestion,
    InferredAssumption,
    ProducedSignal,
    RejectedAssumption,
)
from compliance.services.onboarding_service import labels_for, run_advisor, supported_targets

logger = logging.getLogger(__name__)
router = APIRouter(prefix="/onboarding", tags=["onboarding"])


class OnboardingAdvisorRequest(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: str = "CRA"
    scanner_findings: List[ProducedSignal] = Field(default_factory=list)   # adapters upstream produced these


class AdvisorResponse(BaseModel):
    silent_intake_summary: str = ""
    headline: str = ""
    auto_detected: List[str] = Field(default_factory=list)
    indications: List[str] = Field(default_factory=list)        # partial signal: raises strength, still asked
    inferred_assumptions: List[InferredAssumption] = Field(default_factory=list)
    rejected_assumptions: List[RejectedAssumption] = Field(default_factory=list)
    top_5_questions: List[AdvisorQuestion] = Field(default_factory=list)
    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 = ""
    capability_labels: Dict[str, str] = Field(default_factory=dict)   # capability_id -> human label (DE)


@router.get("/targets")
def list_targets() -> dict:
    return {"targets": supported_targets()}


@router.post("/advisor-start", response_model=AdvisorResponse)
def advisor_start_endpoint(req: OnboardingAdvisorRequest) -> AdvisorResponse:
    if req.target not in supported_targets():
        raise HTTPException(status_code=404, detail="unsupported target '%s'; supported: %s" % (req.target, supported_targets()))
    result, si_summary = run_advisor(
        company=req.company, certifications=req.certifications, target=req.target,
        signals=req.scanner_findings, known_evidence=req.known_evidence,
        products=req.products, markets=req.markets, industry=req.industry or "")
    surfaced = [
        *result.auto_detected, *result.indications, *result.capability_delta,
        *(q.capability_id for q in result.next_best_questions),
        *(c for a in result.inferred_assumptions for c in a.capabilities),
        *(m.capability_id for m in result.top_measures),
    ]
    return AdvisorResponse(
        silent_intake_summary=si_summary, headline=result.headline, auto_detected=result.auto_detected,
        indications=result.indications,
        inferred_assumptions=result.inferred_assumptions, rejected_assumptions=result.rejected_assumptions,
        top_5_questions=result.next_best_questions, capability_delta=result.capability_delta,
        top_measures=result.top_measures, evidence_requests=result.evidence_requests,
        unsupported_domains=result.unsupported_domains, completeness_summary=result.completeness_summary,
        capability_labels=labels_for(surfaced))
