package formula

import (
	"fmt"
	"strings"

	"github.com/nexuscrm/kernel/pkg/expression"
	"github.com/nexuscrm/shared/pkg/queryspec"
)

// lowerInternalQueryPredicateExpressionSQL handles reserved calls emitted by
// queryspec when a structured predicate reaches the transitional formula
// executor. These calls are never part of the authored formula vocabulary.
func lowerInternalQueryPredicateExpressionSQL(ctx expression.SQLFunctionCallContext) (expression.SQLFragment, bool, error) {
	if !strings.EqualFold(ctx.Name, queryspec.InternalLikeExpressionFunction) {
		return expression.SQLFragment{}, false, nil
	}
	if len(ctx.Args) != 2 {
		return expression.SQLFragment{}, true, fmt.Errorf("%s requires 2 arguments", queryspec.InternalLikeExpressionFunction)
	}
	left, err := ctx.CompileArg(ctx.Args[0])
	if err != nil {
		return expression.SQLFragment{}, true, fmt.Errorf("%s left operand: %w", queryspec.InternalLikeExpressionFunction, err)
	}
	right, err := ctx.CompileArg(ctx.Args[1])
	if err != nil {
		return expression.SQLFragment{}, true, fmt.Errorf("%s right operand: %w", queryspec.InternalLikeExpressionFunction, err)
	}
	args := append([]interface{}(nil), left.Args...)
	args = append(args, right.Args...)
	return expression.SQLFragment{
		SQL:  "(" + left.SQL + " LIKE " + right.SQL + ")",
		Args: args,
	}, true, nil
}
