package analytics

import "strings"

// JoinStep defines a single JOIN in a cross-object report type.
type JoinStep struct {
	Table    string
	Alias    string
	JoinType string
	OnLeft   string
	OnRight  string
}

// QualifiedColumn maps a report column alias to a specific table.column.
type QualifiedColumn struct {
	TableAlias string
	Column     string
	// ResultAlias controls the row key returned from raw SQL.
	// Leave empty to derive a stable alias from the report column reference.
	ResultAlias string
	// SelectExpr is an optional SQL expression for display columns that cannot
	// be read from a single physical column.
	SelectExpr string
}

// JoinTemplate defines the complete JOIN structure for a cross-object report
// type. Instances are synthesized from _System_ReportType / CRT metadata.
type JoinTemplate struct {
	PrimaryTable string
	PrimaryAlias string
	Joins        []JoinStep
	// Columns maps report aliases and dot-notation refs to qualified columns.
	Columns map[string]QualifiedColumn
}

// resolveQualifiedColumn resolves a report column alias to a table-qualified
// column using the JOIN template.
func resolveQualifiedColumn(sfAlias string, tmpl *JoinTemplate) (tableAlias string, columnName string, found bool) {
	qc, found := resolveQualifiedColumnDef(sfAlias, tmpl)
	if !found {
		return "", "", false
	}
	// Decorated projection entries (SelectExpr set, no TableAlias/Column) are
	// valid for SELECT projection but cannot supply a bare (alias, column) for
	// WHERE / GROUP BY.
	if qc.SelectExpr != "" && qc.TableAlias == "" && qc.Column == "" {
		return "", "", false
	}
	return qc.TableAlias, qc.Column, true
}

func resolveQualifiedColumnDef(sfAlias string, tmpl *JoinTemplate) (QualifiedColumn, bool) {
	if tmpl == nil {
		return QualifiedColumn{}, false
	}
	if qc, ok := tmpl.Columns[sfAlias]; ok {
		return qc, true
	}
	if idx := strings.Index(sfAlias, "."); idx >= 0 {
		prefix := sfAlias[:idx]
		field := sfAlias[idx+1:]
		if strings.Contains(field, ".") {
			return QualifiedColumn{}, false
		}
		if strings.EqualFold(prefix, tmpl.PrimaryTable) || strings.EqualFold(prefix, tmpl.PrimaryAlias) {
			return QualifiedColumn{TableAlias: tmpl.PrimaryAlias, Column: field}, true
		}
		for _, j := range tmpl.Joins {
			if strings.EqualFold(prefix, j.Table) || strings.EqualFold(prefix, j.Alias) {
				return QualifiedColumn{TableAlias: j.Alias, Column: field}, true
			}
		}
		if qc, ok := tmpl.Columns[field]; ok {
			return qc, true
		}
	}
	return QualifiedColumn{}, false
}

// LookupJoinTemplate returns nil for legacy built-in report types. Cross-object
// report execution is driven by _System_ReportType / CRT metadata; CRM report
// templates must be shipped as metadata, not Go maps.
func LookupJoinTemplate(reportType string) *JoinTemplate {
	return nil
}
