package contract

import "github.com/nexuscrm/shared/pkg/models"

// ReportSourceObjectLookup resolves an application-provided report source token
// to a canonical object API name when the installed dialect owns such aliases.
type ReportSourceObjectLookup func(candidate string) string

// ReportDefinitionDialect owns product-specific report-definition syntax. The
// platform report service remains the generic executor: it asks this contract
// how to parse stored definitions and normalize product column/source tokens
// before building neutral queryspec requests.
type ReportDefinitionDialect interface {
	ParseStoredDefinition(row Record) (*models.ReportDefinition, error)
	ResolveSourceObject(sourceObject string, lookup ReportSourceObjectLookup) string
	NormalizeColumn(column string) string
	SupplementalStoredDefinitionFields() []string
	BuildFilterExpression(req ReportFilterExpressionRequest) (ReportFilterExpression, bool)
}

type ReportFilterExpressionLanguage string

const (
	ReportFilterExpressionLanguageFormula ReportFilterExpressionLanguage = "formula"
	ReportFilterExpressionLanguageSQL     ReportFilterExpressionLanguage = "sql"
)

type ReportFilterExpressionRequest struct {
	Language      ReportFilterExpressionLanguage
	FilterLogic   string
	BooleanFilter string
	Filters       []models.ReportFilter
	Fragments     []ReportFilterExpressionFragment
}

type ReportFilterExpressionFragment struct {
	Index      int
	Expression string
	Params     []any
}

type ReportFilterExpression struct {
	Expression string
	Params     []any
}
