package constants

// Permission represents a Salesforce-style system permission
type Permission string

// ObjectCRUD operations - Salesforce-native format (PascalCase values)
// These are string constants to match existing callsites
const (
	PermRead      = "Read"
	PermCreate    = "Create"
	PermEdit      = "Edit"
	PermDelete    = "Delete"
	PermViewAll   = "ViewAll"
	PermModifyAll = "ModifyAll"

	// System Permissions
	PermViewAllRecycleBin = "ViewAllRecycleBin"
)

// System Permissions - Salesforce API names
// https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_profile.htm
const (
	// ========== Administrative ==========
	PermApiEnabled             Permission = "ApiEnabled"
	PermModifyAllData          Permission = "ModifyAllData"
	PermViewAllData            Permission = "ViewAllData"
	PermCustomizeApplication   Permission = "CustomizeApplication"
	PermManageUsers            Permission = "ManageUsers"
	PermManageRoles            Permission = "ManageRoles"
	PermManageProfilesPermSets Permission = "ManageProfilesPermSets"
	PermAssignPermissionSets   Permission = "AssignPermissionSets"
	PermManageSharing          Permission = "ManageSharing"
	PermResetPasswords         Permission = "ResetPasswords"
	PermViewSetup              Permission = "ViewSetup"
	PermViewAllUsers           Permission = "ViewAllUsers"

	// ========== User Management ==========
	PermManageExternalUsers  Permission = "ManageExternalUsers"
	PermPasswordNeverExpires Permission = "PasswordNeverExpires"
	PermUseIdentityFeatures  Permission = "UseIdentityFeatures"

	// ========== Data ==========
	PermBulkApiHardDelete Permission = "BulkApiHardDelete"
	PermExportReport      Permission = "ExportReport"
	PermMassInlineEdit    Permission = "MassInlineEdit"
	PermEditEvent         Permission = "EditEvent"
	PermEditTask          Permission = "EditTask"
	PermImportLeads       Permission = "ImportLeads"
	PermImportPersonal    Permission = "ImportPersonal"
	PermDataExport        Permission = "DataExport"
	PermTransferAnyEntity Permission = "TransferAnyEntity"
	PermTransferAnyLead   Permission = "TransferAnyLead"

	// ========== Reports & Dashboards ==========
	PermRunReports                Permission = "RunReports"
	PermCreateCustomizeReports    Permission = "CreateCustomizeReports"
	PermManageReportsInPubFolders Permission = "ManageReportsInPubFolders"
	PermManageDashbdsInPubFolders Permission = "ManageDashbdsInPubFolders"
	PermCreateDashboards          Permission = "CreateDashboards"
	PermScheduleReports           Permission = "ScheduleReports"
	PermEditDashboards            Permission = "EditDashboards"
	PermViewMyTeamsDashboards     Permission = "ViewMyTeamsDashboards"

	// ========== Flow & Automation (NexusCRM uses Flows instead of Apex) ==========
	PermRunFlow                 Permission = "RunFlow"
	PermManageFlows             Permission = "ManageFlows"
	PermViewFlowDefinition      Permission = "ViewFlowDefinition"
	PermManageScheduledFlows    Permission = "ManageScheduledFlows" // NexusCRM
	PermDebugFlows              Permission = "DebugFlows"           // NexusCRM (replaces DebugApex)
	PermManageActions           Permission = "ManageActions"        // NexusCRM - record actions
	PermManageApprovalProcesses Permission = "ManageApprovalProcesses"

	// ========== Schema & Metadata ==========
	PermModifyMetadata          Permission = "ModifyMetadata"
	PermManageCustomPermissions Permission = "ManageCustomPermissions"
	PermManageCustomLabels      Permission = "ManageCustomLabels"

	// ========== Email ==========
	PermEmailSingle             Permission = "EmailSingle"
	PermEmailMass               Permission = "EmailMass"
	PermEmailTemplateManagement Permission = "EmailTemplateManagement"

	// ========== List Views ==========
	PermCreateCustomizeFilters Permission = "CreateCustomizeFilters"
	PermEditPublicFilters      Permission = "EditPublicFilters"

	// ========== Content & Files ==========
	PermManageContentPermissions Permission = "ManageContentPermissions"
	PermManageContentProperties  Permission = "ManageContentProperties"
	PermCreateContentSpace       Permission = "CreateContentSpace"

	// ========== Audit & Compliance ==========
	PermViewSetupAuditTrail   Permission = "ViewSetupAuditTrail"
	PermViewDataLeakageEvents Permission = "ViewDataLeakageEvents"
	PermViewEventLogFiles     Permission = "ViewEventLogFiles"
	PermViewFieldAuditTrail   Permission = "ViewFieldAuditTrail"

	// ========== Platform ==========
	PermLightningExperienceUser Permission = "LightningExperienceUser"
	PermSalesConsole            Permission = "SalesConsole"
	PermServiceCloud            Permission = "ServiceCloud"

	// ========== Object Operations ==========
	PermEditPublicDocuments Permission = "EditPublicDocuments"
	PermManageCases         Permission = "ManageCases"
	PermEditReadonlyFields  Permission = "EditReadonlyFields"
	PermManageLeads         Permission = "ManageLeads"
	PermConvertLeads        Permission = "ConvertLeads"
	PermActivateContract    Permission = "ActivateContract"
	PermActivateOrder       Permission = "ActivateOrder"

	// ========== Integration (NexusCRM specific) ==========
	PermQueryAllFiles         Permission = "QueryAllFiles"
	PermViewPlatformEvents    Permission = "ViewPlatformEvents"
	PermPublishPlatformEvents Permission = "PublishPlatformEvents"
	PermManageConnectedApps   Permission = "ManageConnectedApps"
	PermManageOAuthApps       Permission = "ManageOAuthApps" // NexusCRM
)

// Context Keys for permission storage in request context
const (
	ContextKeySystemPermissions = "system_permissions"
	ContextKeyCustomPermissions = "custom_permissions"
)

// Permission catalog is row-driven as of the permission-metadata refactor.
// Seed source: backend/internal/bootstrap/standard_permissions.json.
// Runtime read: PermissionService.ListSystemPermissions — reads
// _System_Permission rows. Adding a permission is a pack edit, not a Go
// edit. Admins can also create custom permission rows at runtime via the
// _System_CustomPermission table.
//
// The AllSystemPermissions() Go function + PermissionDefinition struct
// were deleted in P3 of that refactor.
