// Package recorddisplay owns side-effect-free metadata-driven record labels.
package recorddisplay

import (
	"strings"

	"github.com/nexuscrm/kernel/pkg/useridentity"
	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/nexuscrm/shared/pkg/models"
)

// LookupFieldNames returns the smallest schema-backed field set consumed by
// LookupName. Callers that fetch records solely to render labels must use this
// closure instead of independently choosing an IsNameField.
func LookupFieldNames(schema *models.ObjectMetadata) []string {
	if schema == nil {
		return nil
	}
	if strings.EqualFold(schema.APIName, constants.TableUser) {
		fields := make([]string, 0, 3)
		for _, fieldName := range []string{
			constants.FieldUsername,
			constants.FieldFirstName,
			constants.FieldLastName,
		} {
			if models.FindField(schema, fieldName) != nil {
				fields = append(fields, fieldName)
			}
		}
		return fields
	}
	for _, field := range schema.Fields {
		if field.IsNameField {
			return []string{field.APIName}
		}
	}
	fields := make([]string, 0, 3)
	for _, fieldName := range []string{constants.FieldName, "DeveloperName", constants.FieldUsername} {
		if models.FindField(schema, fieldName) != nil {
			fields = append(fields, fieldName)
		}
	}
	return fields
}

// LookupName resolves a record label from the same field closure returned by
// LookupFieldNames. User is a platform identity primitive whose stable label is
// composed from FirstName/LastName with Username as its fallback; physical
// login/contact fields must not compete as additional name authorities.
func LookupName(schema *models.ObjectMetadata, record models.Record) string {
	if schema == nil || record == nil {
		return ""
	}
	if strings.EqualFold(schema.APIName, constants.TableUser) {
		return useridentity.DisplayName(
			recordString(record, constants.FieldUsername),
			recordString(record, constants.FieldFirstName),
			recordString(record, constants.FieldLastName),
		)
	}
	for _, field := range schema.Fields {
		if field.IsNameField {
			return recordString(record, field.APIName)
		}
	}
	for _, fieldName := range []string{constants.FieldName, "DeveloperName", constants.FieldUsername} {
		if value := recordString(record, fieldName); value != "" {
			return value
		}
	}
	return ""
}

func recordString(record models.Record, fieldName string) string {
	value, ok := record[fieldName].(string)
	if !ok {
		return ""
	}
	return strings.TrimSpace(value)
}
