package executor

import "strings"

func applySelectMeta(columns []ColumnInfo, meta *selectMeta) {
	if meta == nil || len(columns) == 0 || len(meta.columnInfo) == 0 {
		return
	}
	for i := range columns {
		name := columns[i].Name
		lookup := strings.ToLower(name)
		if meta.aliasToCol != nil {
			if base, ok := meta.aliasToCol[name]; ok {
				lookup = strings.ToLower(base)
			}
		}
		info, ok := meta.columnInfo[lookup]
		if !ok {
			continue
		}
		if info.cqlType != "" {
			columns[i].Type = info.cqlType
		}
		if info.typeInfo != nil {
			columns[i].TypeInfo = info.typeInfo
		}
		if meta.keyspace != "" {
			columns[i].Keyspace = meta.keyspace
		}
		if meta.table != "" {
			columns[i].Table = meta.table
		}
	}
}

func selectMetaFromColumns(columns []ColumnInfo) *selectMeta {
	if len(columns) == 0 {
		return nil
	}
	info := make(map[string]columnTypeInfo, len(columns))
	keyspace := columns[0].Keyspace
	table := columns[0].Table
	for _, col := range columns {
		info[strings.ToLower(col.Name)] = columnTypeInfo{
			cqlType:  col.Type,
			typeInfo: col.TypeInfo,
		}
		if keyspace == "" {
			keyspace = col.Keyspace
		}
		if table == "" {
			table = col.Table
		}
	}
	return &selectMeta{
		columnInfo: info,
		keyspace:   keyspace,
		table:      table,
	}
}
