package persistence

import (
	"context"
	"database/sql"
	"time"

	"github.com/google/uuid"
	"github.com/nexuscrm/backend/pkg/query"
	"github.com/nexuscrm/shared/pkg/constants"
)

// SetupAuditRepository handles database operations for the setup audit trail.
type SetupAuditRepository struct {
	db *sql.DB
}

// NewSetupAuditRepository creates a new SetupAuditRepository.
func NewSetupAuditRepository(db *sql.DB) *SetupAuditRepository {
	return &SetupAuditRepository{db: db}
}

// RecordSetupChange inserts a setup audit trail entry into the database.
// action: what changed (e.g. "Changed profile permission", "Created role")
// section: category (e.g. "Profiles", "Roles", "Permissions", "Users")
// display: human-readable description of the change
// userID: the admin who made the change
func (r *SetupAuditRepository) RecordSetupChange(ctx context.Context, action, section, display, userID string) error {
	now := time.Now()
	values := map[string]any{
		constants.FieldSysSetupAuditTrail_ID:          uuid.New().String()[:18],
		constants.FieldSysSetupAuditTrail_Action:      action,
		constants.FieldSysSetupAuditTrail_Section:     section,
		constants.FieldSysSetupAuditTrail_Display:     display,
		constants.FieldSysSetupAuditTrail_CreatedByID: userID,
		constants.FieldSysSetupAuditTrail_CreatedDate: now,
	}

	qr := query.Insert(constants.TableSetupAuditTrail, values).Build()
	exec := Executor(r.db)
	if tx, ok := ctx.Value(txContextKey{}).(*sql.Tx); ok && tx != nil {
		exec = tx
	}
	_, err := exec.ExecContext(ctx, qr.SQL, qr.Params...)
	return err
}
