from __future__ import annotations
from html import escape


def validate_report_days(value, policy):
    rule = policy["validation"]["report_days"]
    if isinstance(value, bool) or not isinstance(value, int):
        return {"status": "REJECT_SYNTAX", "reason": "integer_required"}
    if not (rule["min"] <= value <= rule["max"]):
        return {"status": "REJECT_SEMANTIC", "reason": "outside_business_range"}
    return {"status": "VALID", "normalized": value}


def evaluate_output_case(case, policy):
    ctx = case.get("context")
    rules = policy["output_contexts"]
    if ctx not in rules:
        return {"status": "REJECT_UNKNOWN_CONTEXT", "context": ctx}
    rule = rules[ctx]
    if ctx == "html_text":
        return {"status": "SAFE_TEXT_SINK_REQUIRED", "context": ctx, "primary_defense": rule["primary_defense"], "encoded_marker": escape(str(case.get("value", "")), quote=True)}
    if ctx == "html_attribute":
        attr = case.get("attribute")
        if attr not in rule["allowed_attributes"]:
            return {"status": "REJECT_ATTRIBUTE", "context": ctx, "attribute": attr}
        return {"status": "ATTRIBUTE_ENCODING_REQUIRED", "context": ctx, "attribute": attr, "primary_defense": rule["primary_defense"], "encoded_marker": escape(str(case.get("value", "")), quote=True)}
    if ctx == "rich_html":
        return {"status": "SANITIZATION_REQUIRED", "context": ctx, "primary_defense": rule["primary_defense"], "approved_library_required": True}
    return {"status": "REJECT_DYNAMIC_CONTEXT", "context": ctx}


def evaluate_query_design(case, policy):
    mode = case.get("mode")
    if mode != policy["query"]["required_value_mode"]:
        return {"status": "REJECT_STRING_BUILDING", "executed": False, "reason": "code_data_boundary_not_preserved"}
    value = case.get("value")
    validation = validate_report_days(value, policy)
    if validation["status"] != "VALID":
        return {"status": validation["status"], "executed": False, "reason": validation["reason"]}
    return {"status": "PARAMETERIZED_DESIGN", "executed": False, "query_template": policy["query"]["query_template"], "parameters": [validation["normalized"]]}


def classify_transfer(requirement, policy):
    if requirement == "rich_comments":
        return {"status": "REBUILD_BOUNDARY", "primary_defense": "html_sanitization", "reuse_plain_text_rule": False}
    if requirement == "report_sort_identifier":
        return {"status": "REBUILD_BOUNDARY", "primary_defense": policy["query"]["dynamic_identifier_policy"], "parameter_binding_alone": False}
    return {"status": "UNCLASSIFIED_TRANSFER"}


def evidence_row_complete(row):
    required = ["input_field","trust_source","business_validation","destination_sink_or_interpreter","primary_defense","secondary_defense","positive_evidence","negative_evidence","residual_boundary"]
    return all(k in row and str(row[k]).strip() for k in required)
