package metadata

import (
	"context"
	"fmt"
	"time"

	apperrors "github.com/nexuscrm/backend/pkg/errors"
	sharedEvents "github.com/nexuscrm/shared/pkg/events"
	"github.com/nexuscrm/shared/pkg/models"
)

// DeleteField deletes a field from an object
func (ms *MetadataService) DeleteField(ctx context.Context, objectAPIName, fieldAPIName string) error {
	ms.mu.Lock()
	defer ms.mu.Unlock()

	// Get the object
	obj, err := ms.repo.GetSchemaByAPIName(ctx, objectAPIName)
	if err != nil || obj == nil {
		return apperrors.NewNotFoundError("Object", objectAPIName)
	}

	// Find the field
	var existingField *models.FieldMetadata
	for i := range obj.Fields {
		if obj.Fields[i].APIName == fieldAPIName {
			existingField = &obj.Fields[i]
			break
		}
	}
	if existingField == nil {
		return apperrors.NewNotFoundError("Field", fmt.Sprintf("%s.%s", objectAPIName, fieldAPIName))
	}

	// Don't allow deleting system fields
	if existingField.IsSystem || existingField.IsNameField {
		return apperrors.NewValidationError(fieldAPIName, "cannot delete system or name field")
	}

	// Delegate to SchemaManager
	if err := ms.schemaMgr.DropColumn(objectAPIName, fieldAPIName); err != nil {
		return apperrors.NewInternalError("failed to drop column", err)
	}

	ms.invalidateCacheLocked()

	// Publish Event
	ms.publishMetadataEvent(ctx, sharedEvents.FieldDeleted, sharedEvents.SchemaEventPayload{
		EventType:     sharedEvents.FieldDeleted,
		ObjectAPIName: objectAPIName,
		FieldAPIName:  fieldAPIName,
		Timestamp:     time.Now().Format(time.RFC3339),
	})

	return nil
}
