package bootstrap

import (
	"database/sql"
	"fmt"
)

// ActionFieldDefaultRow is the subset of _System_ActionFieldDefault the
// standard-action dispatcher consumes at request time. The Condition and
// ValueFormula strings are fed to the shared formula engine.
type ActionFieldDefaultRow struct {
	TargetObject string
	FieldAPIName string
	ValueFormula string
	Condition    string
	Priority     int
}

// GetActionFieldDefaults returns every active default row for a standard
// action Id, sorted by (TargetObject, FieldAPIName, Priority DESC) so
// higher-priority rows win ties within a (TargetObject, FieldAPIName)
// pair after dispatcher deduplication.
func GetActionFieldDefaults(db *sql.DB, standardActionID string) ([]ActionFieldDefaultRow, error) {
	query := fmt.Sprintf(
		`SELECT TargetObject, FieldAPIName, ValueFormula, `+"`Condition`"+`, Priority
		   FROM %s
		  WHERE StandardActionId = ? AND IsActive = 1 AND IsDeleted = 0
		  ORDER BY TargetObject ASC, FieldAPIName ASC, Priority DESC`,
		tableActionFieldDefault,
	)
	rows, err := db.Query(query, standardActionID)
	if err != nil {
		return nil, fmt.Errorf("query action field defaults: %w", err)
	}
	defer rows.Close()

	var out []ActionFieldDefaultRow
	for rows.Next() {
		var row ActionFieldDefaultRow
		var cond sql.NullString
		if err := rows.Scan(&row.TargetObject, &row.FieldAPIName, &row.ValueFormula, &cond, &row.Priority); err != nil {
			return nil, fmt.Errorf("scan action field default row: %w", err)
		}
		if cond.Valid {
			row.Condition = cond.String
		}
		out = append(out, row)
	}
	return out, rows.Err()
}
