package main
import ("errors"; "fmt"; module "bijection.dev/module")
func init() { module.Register(module.Program{Workflow: run}) }
func main() {}
func run(_ module.Context, input module.Value) (module.Value,error) {
var err error; _ = err; _ = input
outcome := ""
// Inspect captured document
done_inspect_document := true
_ = done_inspect_document
var value_inspect_document module.Value
if done_inspect_document {
value_inspect_document, err = module.Function("inspect_drive_document",module.MustObject(map[string]module.Value{"file_id":field(input,"file_id")}))
if err != nil { return module.Value{},err }
}
// Route normalization outcome
done_route_normalization := (done_inspect_document)
_ = done_route_normalization
selected_route_normalization := ""
if done_route_normalization {
selected_route_normalization = text(field(field(value_inspect_document,"value"),"normalization_status"))
switch selected_route_normalization { case "normalized","failed": default: return module.Value{},fmt.Errorf("ExtractDriveDocument: unexpected route_normalization value %q", selected_route_normalization) }
}
// Extract normalized document
done_extract_document := (selected_route_normalization == "normalized")
_ = done_extract_document
var value_extract_document module.Value
if done_extract_document {
value_extract_document, err = module.Function("extract_drive_document",module.MustObject(map[string]module.Value{"file_id":field(input,"file_id")}))
if err != nil { return module.Value{},err }
}
// Record extracted facts
done_record_extraction := (done_extract_document)
_ = done_record_extraction
if done_record_extraction {
_,err = module.Action("RecordDriveExtraction",module.MustObject(map[string]module.Value{"amount":field(field(value_extract_document,"value"),"amount"),"customer":field(field(value_extract_document,"value"),"customer"),"document_status":field(field(value_extract_document,"value"),"document_status"),"extraction_status":field(field(value_extract_document,"value"),"extraction_status"),"failure_class":field(field(value_extract_document,"value"),"failure_class"),"file_id":field(input,"file_id")}),nil,target(field(field(value_extract_document,"evidence"),"candidate_receipt_id")))
if err != nil { return module.Value{},err }
}
// Record normalization failure
done_record_failure := (selected_route_normalization == "failed") && (done_inspect_document)
_ = done_record_failure
if done_record_failure {
_,err = module.Action("RecordDriveExtractionFailure",module.MustObject(map[string]module.Value{"failure_class":field(field(value_inspect_document,"value"),"normalization_failure_class"),"file_id":field(field(value_inspect_document,"value"),"file_id"),"filename":field(field(value_inspect_document,"value"),"filename"),"mime_type":field(field(value_inspect_document,"value"),"mime_type")}),nil,nil)
if err != nil { return module.Value{},err }
}
// Extraction recorded
done_extraction_recorded := (done_record_extraction)
_ = done_extraction_recorded
if done_extraction_recorded {
if outcome != "" { return module.Value{},errors.New("multiple business outcomes selected") }; outcome = "extraction_recorded"
}
// Normalization failure recorded
done_failure_recorded := (done_record_failure)
_ = done_failure_recorded
if done_failure_recorded {
if outcome != "" { return module.Value{},errors.New("multiple business outcomes selected") }; outcome = "failure_recorded"
}
if outcome == "" { return module.Value{},errors.New("no business outcome selected") }
return module.Complete(outcome,module.MustObject(map[string]module.Value{})),nil
}

func field(value module.Value, name string) module.Value {
 fields, ok := value.Object(); if !ok { panic("expected an object while reading " + name) }
 result, ok := fields[name]; if !ok { panic("missing field " + name) }; return result
}
func text(value module.Value) string {
 if result, ok := value.Text(); ok { return result }
 if fields, ok := value.Object(); ok { if result, ok := fields["key"].Text(); ok { return result } }
 panic("expected a string or ObjectRef")
}
func target(value module.Value) *string { if value.Kind() == module.KindNull { return nil }; result := text(value); return &result }
func equal(left, right module.Value) bool { a, ea := left.MarshalJSON(); b, eb := right.MarshalJSON(); if ea != nil || eb != nil { panic("invalid comparison") }; return string(a) == string(b) }
func number(value float64) module.Value { result, err := module.Number(value); if err != nil { panic(err) }; return result }

