"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.simulateDeterministicRouting = simulateDeterministicRouting;
exports.toRouteHintSummary = toRouteHintSummary;
exports.toRouterInput = toRouterInput;
function toRouteHintSummaryV1(normalized) {
    return {
        mode: "legacy_v1",
        intent_class: normalized.intent_class,
        route_hint: normalized.route_hint,
        confidence: normalized.confidence.route_hint,
        decision_flags: {
            needs_cross_entity_join: normalized.requires.needs_cross_entity_join,
            needs_causal_chain: normalized.requires.needs_causal_chain,
            needs_exact_object_trace: normalized.requires.needs_exact_object_trace,
            needs_ranking: normalized.requires.needs_ranking,
            needs_anomaly_summary: normalized.requires.needs_anomaly_summary,
            needs_runtime_truth: normalized.requires.needs_runtime_truth,
            needs_period_cut: normalized.requires.needs_period_cut,
            needs_evidence: normalized.requires.needs_evidence
        },
        period_scope: normalized.period_scope,
        entities: {
            domain_entities: normalized.domain_entities,
            accounts_mentioned: normalized.accounts_mentioned,
            documents_mentioned: normalized.documents_mentioned,
            registers_mentioned: normalized.registers_mentioned
        }
    };
}
function reasonForNoRoute(noRouteReason) {
    if (noRouteReason === "out_of_scope") {
        return "Fragment is out-of-scope for company-specific accounting contour.";
    }
    if (noRouteReason === "missing_mapping") {
        return "Fragment is in-scope but route mapping is currently missing.";
    }
    if (noRouteReason === "unsupported_fragment_type") {
        return "Fragment type is not supported by the current deterministic route map.";
    }
    return "Fragment requires clarification or is too underspecified for safe routing.";
}
function explicitRouteStatus(fragment) {
    return "route_status" in fragment ? fragment.route_status : null;
}
function explicitNoRouteReason(fragment) {
    return "no_route_reason" in fragment ? fragment.no_route_reason : null;
}
function executionReadiness(fragment) {
    return "execution_readiness" in fragment ? fragment.execution_readiness : null;
}
function clarificationReason(fragment) {
    return "clarification_reason" in fragment ? fragment.clarification_reason : null;
}
function softAssumptions(fragment) {
    return "soft_assumption_used" in fragment ? fragment.soft_assumption_used : [];
}
function buildNoRouteDecision(fragment, noRouteReason) {
    return {
        fragment_id: fragment.fragment_id,
        domain_relevance: fragment.domain_relevance,
        business_scope: fragment.business_scope,
        candidate_labels: fragment.candidate_labels,
        decision_flags: fragment.flags,
        execution_readiness: executionReadiness(fragment),
        clarification_reason: clarificationReason(fragment),
        soft_assumption_used: softAssumptions(fragment),
        route_status: "no_route",
        no_route_reason: noRouteReason ?? "insufficient_specificity",
        route: "no_route",
        reason: reasonForNoRoute(noRouteReason)
    };
}
function decideRouteForFragment(fragment) {
    const status = explicitRouteStatus(fragment);
    const noRouteReason = explicitNoRouteReason(fragment);
    const readiness = executionReadiness(fragment);
    const clarification = clarificationReason(fragment);
    const soft = softAssumptions(fragment);
    if (status === "no_route") {
        return buildNoRouteDecision(fragment, noRouteReason);
    }
    if (readiness === "needs_clarification" || readiness === "no_route") {
        return buildNoRouteDecision(fragment, noRouteReason ?? "insufficient_specificity");
    }
    if (fragment.domain_relevance !== "in_scope") {
        return buildNoRouteDecision(fragment, "out_of_scope");
    }
    if (fragment.flags.asks_for_exact_object_trace) {
        return {
            fragment_id: fragment.fragment_id,
            domain_relevance: fragment.domain_relevance,
            business_scope: fragment.business_scope,
            candidate_labels: fragment.candidate_labels,
            decision_flags: fragment.flags,
            execution_readiness: readiness,
            clarification_reason: clarification,
            soft_assumption_used: soft,
            route_status: "routed",
            no_route_reason: null,
            route: "live_mcp_drilldown",
            reason: "Exact object trace requested."
        };
    }
    if (fragment.flags.asks_for_ranking_or_top || fragment.flags.asks_for_period_summary) {
        return {
            fragment_id: fragment.fragment_id,
            domain_relevance: fragment.domain_relevance,
            business_scope: fragment.business_scope,
            candidate_labels: fragment.candidate_labels,
            decision_flags: fragment.flags,
            execution_readiness: readiness,
            clarification_reason: clarification,
            soft_assumption_used: soft,
            route_status: "routed",
            no_route_reason: null,
            route: "batch_refresh_then_store",
            reason: "Ranking/summary semantics require batch analytical route."
        };
    }
    if (fragment.flags.has_multi_entity_scope && fragment.flags.asks_for_chain_explanation) {
        return {
            fragment_id: fragment.fragment_id,
            domain_relevance: fragment.domain_relevance,
            business_scope: fragment.business_scope,
            candidate_labels: fragment.candidate_labels,
            decision_flags: fragment.flags,
            execution_readiness: readiness,
            clarification_reason: clarification,
            soft_assumption_used: soft,
            route_status: "routed",
            no_route_reason: null,
            route: "hybrid_store_plus_live",
            reason: "Multi-entity causal chain requested."
        };
    }
    if (fragment.flags.asks_for_rule_check && !fragment.flags.asks_for_chain_explanation) {
        return {
            fragment_id: fragment.fragment_id,
            domain_relevance: fragment.domain_relevance,
            business_scope: fragment.business_scope,
            candidate_labels: fragment.candidate_labels,
            decision_flags: fragment.flags,
            execution_readiness: readiness,
            clarification_reason: clarification,
            soft_assumption_used: soft,
            route_status: "routed",
            no_route_reason: null,
            route: "store_feature_risk",
            reason: "Rule-control check without causal decomposition."
        };
    }
    if (fragment.flags.asks_for_anomaly_scan &&
        !fragment.flags.asks_for_ranking_or_top &&
        !(fragment.flags.has_multi_entity_scope && fragment.flags.asks_for_chain_explanation)) {
        return {
            fragment_id: fragment.fragment_id,
            domain_relevance: fragment.domain_relevance,
            business_scope: fragment.business_scope,
            candidate_labels: fragment.candidate_labels,
            decision_flags: fragment.flags,
            execution_readiness: readiness,
            clarification_reason: clarification,
            soft_assumption_used: soft,
            route_status: "routed",
            no_route_reason: null,
            route: "store_feature_risk",
            reason: "Anomaly scan without heavy ranking or causal chain."
        };
    }
    if (status === "routed") {
        return {
            fragment_id: fragment.fragment_id,
            domain_relevance: fragment.domain_relevance,
            business_scope: fragment.business_scope,
            candidate_labels: fragment.candidate_labels,
            decision_flags: fragment.flags,
            execution_readiness: readiness,
            clarification_reason: clarification,
            soft_assumption_used: soft,
            route_status: "routed",
            no_route_reason: null,
            route: "store_canonical",
            reason: "Routed fragment without deep analytical or causal signals."
        };
    }
    return buildNoRouteDecision(fragment, "missing_mapping");
}
function fallbackMessageFor(type) {
    if (type === "out_of_scope") {
        return "Я работаю только с данными и бухгалтерским контуром текущей компании. Запрос вне доступной предметной области.";
    }
    if (type === "clarification") {
        return "Могу проверить это в контуре компании, но нужно уточнить период, документ, счет или участок учета.";
    }
    if (type === "partial") {
        return "Обработаю только часть запроса, которая относится к данным компании. Остальное выходит за пределы доступного контура.";
    }
    return null;
}
function simulateDeterministicRouting(normalized) {
    const decisions = normalized.fragments.map((fragment) => decideRouteForFragment(fragment));
    const inScopeCount = decisions.filter((item) => item.domain_relevance === "in_scope").length;
    const outOfScopeCount = decisions.filter((item) => item.domain_relevance === "out_of_scope").length;
    const routedInScopeCount = decisions.filter((item) => item.domain_relevance === "in_scope" && item.route !== "no_route").length;
    const clarificationInScopeCount = decisions.filter((item) => item.domain_relevance === "in_scope" && item.execution_readiness === "needs_clarification").length;
    const noRouteInScopeCount = decisions.filter((item) => item.domain_relevance === "in_scope" && item.route === "no_route").length;
    let fallbackType = "none";
    if (!normalized.message_in_scope || inScopeCount === 0) {
        fallbackType = "out_of_scope";
    }
    else if (routedInScopeCount === 0 && clarificationInScopeCount > 0) {
        fallbackType = "clarification";
    }
    else if (routedInScopeCount === 0 && noRouteInScopeCount > 0) {
        fallbackType = "clarification";
    }
    else if ((inScopeCount > 0 && outOfScopeCount > 0) || (routedInScopeCount > 0 && noRouteInScopeCount > 0)) {
        fallbackType = "partial";
    }
    return {
        mode: "deterministic_v2",
        message_in_scope: normalized.message_in_scope,
        scope_confidence: normalized.scope_confidence,
        planner: {
            total_fragments: normalized.fragments.length,
            in_scope_fragments: inScopeCount,
            out_of_scope_fragments: outOfScopeCount,
            discarded_fragments: normalized.discarded_fragments.length,
            contains_multiple_tasks: normalized.contains_multiple_tasks
        },
        decisions,
        fallback: {
            type: fallbackType,
            message: fallbackMessageFor(fallbackType)
        }
    };
}
function toRouteHintSummary(normalized) {
    if (normalized.schema_version === "normalized_query_v2" ||
        normalized.schema_version === "normalized_query_v2_0_1" ||
        normalized.schema_version === "normalized_query_v2_0_2") {
        return simulateDeterministicRouting(normalized);
    }
    return toRouteHintSummaryV1(normalized);
}
function toRouterInput(normalized) {
    if (normalized.schema_version === "normalized_query_v2" ||
        normalized.schema_version === "normalized_query_v2_0_1" ||
        normalized.schema_version === "normalized_query_v2_0_2") {
        return {
            mode: "deterministic_v2",
            message_in_scope: normalized.message_in_scope,
            scope_confidence: normalized.scope_confidence,
            contains_multiple_tasks: normalized.contains_multiple_tasks,
            fragments: normalized.fragments.map((fragment) => ({
                fragment_id: fragment.fragment_id,
                domain_relevance: fragment.domain_relevance,
                business_scope: fragment.business_scope,
                execution_readiness: "execution_readiness" in fragment ? fragment.execution_readiness : null,
                clarification_reason: "clarification_reason" in fragment ? fragment.clarification_reason : null,
                soft_assumption_used: "soft_assumption_used" in fragment ? fragment.soft_assumption_used : [],
                route_status: "route_status" in fragment ? fragment.route_status : null,
                no_route_reason: "no_route_reason" in fragment ? fragment.no_route_reason : null,
                flags: fragment.flags,
                candidate_labels: fragment.candidate_labels,
                confidence: fragment.confidence
            }))
        };
    }
    return {
        mode: "legacy_v1",
        intent_class: normalized.intent_class,
        decision_flags: {
            needs_cross_entity_join: normalized.requires.needs_cross_entity_join,
            needs_causal_chain: normalized.requires.needs_causal_chain,
            needs_exact_object_trace: normalized.requires.needs_exact_object_trace,
            needs_ranking: normalized.requires.needs_ranking,
            needs_anomaly_summary: normalized.requires.needs_anomaly_summary,
            needs_runtime_truth: normalized.requires.needs_runtime_truth
        },
        route_hint: normalized.route_hint,
        confidence: normalized.confidence.overall,
        entities: {
            domain_entities: normalized.domain_entities,
            accounts_mentioned: normalized.accounts_mentioned,
            documents_mentioned: normalized.documents_mentioned,
            registers_mentioned: normalized.registers_mentioned
        },
        period_scope: normalized.period_scope
    };
}
