use std::collections::HashSet;
use std::path::Path;
use crate::generate::archetypes::Archetype;
use crate::generate::archetypes::TestInput;
use crate::enforce::category::Category;
use crate::generate::emit::emit::{write_test, EmittedTest};
use crate::generate::emit::naming::{sanitize, test_name};
use crate::generate::emit::provenance::{header, SourceTuple};
use crate::generate::emit::seed::SeedStream;
use crate::generate::emit::{GenError, GeneratedFile, GenerationPlan, GenerationReport, TemplateKind};
use crate::adversarial::mutations::catalog::applied::applied_for_classes;
use crate::spec::{OracleKind, SpecRow};
use crate::generate::templates::{render, TemplateContext};
use crate::spec::types::OpSpec;
use super::codegen::{expected_bytes, law_name, route_key, rust_test, spec_row_index};
use super::util::{input_bytes_for_arity, last_segment, oracle_name, property_key, template_src};
fn context(
op: &OpSpec,
archetype: &dyn Archetype,
input: &TestInput,
route: &Route,
) -> TemplateContext {
TemplateContext::new()
.with_scalar("op_name", op.id)
.with_scalar("op", op.id)
.with_scalar("file", last_segment(op.id))
.with_scalar("expected", expected_bytes(op, route))
.with_scalar("inputs", format!("{:?}", input.values))
.with_scalar("spec_path", "op_registry::all_specs")
.with_scalar("line", provenance_line(route))
.with_scalar("category", format!("{:?}", op.category))
.with_scalar("input_desc", sanitize(input.label))
.with_scalar("law_name", law_name(&route.property))
.with_scalar("law_description", route.property_label.clone())
.with_scalar("input_class", input.label)
.with_scalar("law_formula", route.property_label.clone())
.with_scalar("specific_inputs", format!("{:?}", input.values))
.with_scalar("law", law_name(&route.property))
.with_scalar("archetype_id", archetype.id())
.with_scalar("archetype_name", archetype.name())
.with_scalar("archetype_description", archetype.description())
.with_scalar("property", route.property_label.clone())
.with_scalar("oracle_chosen_from_hierarchy", route.oracle_name.clone())
.with_scalar(
"mutation_description",
route
.mutation
.as_ref()
.map(|mutation| mutation.description.clone())
.unwrap_or_else(|| "not requested".to_string()),
)
.with_scalar(
"mutation_details",
route
.mutation
.as_ref()
.map(|mutation| mutation.details.clone())
.unwrap_or_else(|| "not requested".to_string()),
)
.with_scalar(
"V_NNN",
route
.validation
.as_ref()
.map(|validation| validation.rule_id)
.unwrap_or("V000"),
)
.with_scalar("description", route.property_label.clone())
.with_scalar(
"NNN",
route
.validation
.as_ref()
.map(|validation| validation.rule_id.trim_start_matches('V'))
.unwrap_or("000"),
)
}