package metadata

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

func StaticDependentPicklistControllerValues(schema *models.ObjectMetadata, field models.FieldMetadata) ([]string, bool) {
	if schema == nil || field.ControllingField == nil || len(field.PicklistDependency) == 0 {
		return nil, false
	}

	controller := models.FindField(schema, *field.ControllingField)
	if controller == nil {
		return nil, false
	}
	controllerType := normalizeDescribePicklistFieldType(*controller)
	if (controllerType != "picklist" && controllerType != "multipicklist") || len(controller.Options) == 0 {
		return nil, false
	}

	controllerValues := make([]string, 0, len(controller.Options))
	controllerSet := make(map[string]struct{}, len(controller.Options))
	for _, option := range controller.Options {
		if option.Value == "" {
			continue
		}
		controllerValues = append(controllerValues, option.Value)
		controllerSet[option.Value] = struct{}{}
	}
	if len(controllerValues) == 0 {
		return nil, false
	}

	dependentSet := make(map[string]struct{}, len(field.Options))
	for _, option := range field.Options {
		if option.Value == "" {
			continue
		}
		dependentSet[option.Value] = struct{}{}
	}
	if len(dependentSet) == 0 {
		return nil, false
	}

	referencedDependentValues := make(map[string]struct{}, len(field.Options))
	for controllerValue, dependentValues := range field.PicklistDependency {
		if _, ok := controllerSet[controllerValue]; !ok {
			return nil, false
		}
		for _, dependentValue := range dependentValues {
			if _, ok := dependentSet[dependentValue]; !ok {
				return nil, false
			}
			referencedDependentValues[dependentValue] = struct{}{}
		}
	}

	for dependentValue := range dependentSet {
		if _, ok := referencedDependentValues[dependentValue]; !ok {
			return nil, false
		}
	}

	return controllerValues, true
}

func SupportsStaticPicklistDependency(schema *models.ObjectMetadata, field models.FieldMetadata) bool {
	fieldType := normalizeDescribePicklistFieldType(field)
	if (fieldType != "picklist" && fieldType != "multipicklist") ||
		field.ControllingField == nil ||
		len(field.PicklistDependency) == 0 {
		return false
	}
	_, ok := StaticDependentPicklistControllerValues(schema, field)
	return ok
}

func normalizeDescribePicklistFieldType(field models.FieldMetadata) string {
	if field.LogicalType != nil {
		return string(*field.LogicalType)
	}
	return string(field.Type)
}
