package ports

import (
	"context"

	"github.com/nexuscrm/shared/pkg/api"
	"github.com/nexuscrm/shared/pkg/models"
)

// QueryService defines the interface for analytics querying
type QueryService interface {
	Query(ctx context.Context, req api.QueryRequest, user *models.UserSession) (*models.QueryResult, error)
	QueryWithFilter(ctx context.Context, objectName string, filterExpr string, user *models.UserSession, sortField string, sortDir string, limit int) (*models.QueryResult, error)
	RunAnalytics(ctx context.Context, analyticsQuery models.AnalyticsQuery, currentUser *models.UserSession) (interface{}, error)
	SearchSingleObject(ctx context.Context, objectName string, term string, searchFields []string, returnFields []string, limit int, offset int, orderBy string, orderDir string, filterExpr string, currentUser *models.UserSession) ([]models.SObject, error)
	GlobalSearch(ctx context.Context, term string, currentUser *models.UserSession) ([]models.SearchResult, error)
	Calculate(ctx context.Context, objectName string, record models.SObject, user *models.UserSession) (models.SObject, error)
	ExecuteRawSQL(ctx context.Context, sql string, params []interface{}, user *models.UserSession) ([]models.SObject, error)
}

// ViewResolver resolves whether to read from a physical table or a formula view.
// FormulaViewService implements this interface.
type ViewResolver interface {
	// ResolveTableName returns v_{object} if a formula view exists, otherwise the physical table name.
	ResolveTableName(ctx context.Context, schema *models.ObjectMetadata) string
}

// RollupProcessor defines the interface for rollup summary field calculations
type RollupProcessor interface {
	// ProcessRollups orchestrates the calculation of rollups for a given child record change
	ProcessRollups(ctx context.Context, childObjName string, childRecord models.SObject) error

	// RecalculateAll batch-recalculates all rollup fields for a given parent object
	RecalculateAll(ctx context.Context, parentObjName string) (int, error)
}
