package fieldgroups import ( "fmt" "pdf-wizard/internal/models" ) // GroupHandler defines the interface for a field group type. type GroupHandler interface { // Type returns the group type name (e.g., "multiline", "single_select"). Type() string // Validate checks that the submitted values for this group are valid. // fieldValues maps field_id -> submitted value. // Returns an error if validation fails. Validate(fields []models.FormField, fieldValues map[int]string) error // ConvertToFillValues converts the submitted values back to individual // field values suitable for filling the PDF. For groups like "multiline", // this splits a single textarea value across multiple text fields. // fieldValues maps field_id -> submitted value. ConvertToFillValues(fields []models.FormField, fieldValues map[int]string) map[int]string } var registry = make(map[string]GroupHandler) // Register adds a handler to the global registry. func Register(h GroupHandler) { registry[h.Type()] = h } // Get returns the handler for the given group type. func Get(groupType string) (GroupHandler, error) { h, ok := registry[groupType] if !ok { return nil, fmt.Errorf("unknown group type: %s", groupType) } return h, nil } // GetFillValuesForGroup gets the fill-ready values for a group's fields. func GetFillValuesForGroup(group models.FieldGroup, fields []models.FormField, fieldValues map[int]string) (map[int]string, error) { handler, err := Get(group.GroupType) if err != nil { return nil, err } return handler.ConvertToFillValues(fields, fieldValues), nil } // ValidateGroup validates the submitted values for a group. func ValidateGroup(group models.FieldGroup, fields []models.FormField, fieldValues map[int]string) error { handler, err := Get(group.GroupType) if err != nil { return err } return handler.Validate(fields, fieldValues) } // AllTypes returns all registered group type names. func AllTypes() []string { types := make([]string, 0, len(registry)) for t := range registry { types = append(types, t) } return types }