package consts

import (
	"github.com/tidbcloud/tiinf/sdk/auditlog"
)

const (
	LoginMethodAPIKey      = "api_key"
	LoginMethodAccessToken = "access_token"

	ExportFormatJSON = "json"
	ExportFormatCSV  = "csv"

	ExportDateTimeFormat = "2006-01-02 15:04:05"

	SettingsOff = 0
	SettingsOn  = 1
)

var (
	internalEventMapper = map[auditlog.EventType]bool{
		auditlog.EventRegistration:   true,
		auditlog.EventActivation:     true,
		auditlog.EventForgotPassword: true,
		auditlog.EventResetPassword:  true,
		auditlog.EventLogin:          true,
		auditlog.EventLogout:         true,
		auditlog.EventUpdateProfile:  true,
		auditlog.EventSetMFA:         true,
		auditlog.EventChangePassword: true,
	}

	EventCodeMapper = map[auditlog.EventType]string{
		// auditlog.EventRegistration:                 "Registration",
		// auditlog.EventActivation:                   "AccountActivation",
		// auditlog.EventForgotPassword:               "ForgotPassword",
		// auditlog.EventResetPassword:                "ResetPassword",
		// auditlog.EventLogin:                        "Login",
		// auditlog.EventLogout:                       "Logout",
		// auditlog.EventUpdateProfile:                "UpdateProfile",
		// auditlog.EventSetMFA:                       "SetMFA",
		// auditlog.EventChangePassword:               "ChangePassword",
		auditlog.EventCreateOrg:                                      "CreateOrganization",
		auditlog.EventLoginOrg:                                       "LoginOrganization",
		auditlog.EventSwitchOrg:                                      "SwitchOrganization",
		auditlog.EventLogoutOrg:                                      "LogoutOrganization",
		auditlog.EventInviteUserToOrg:                                "InviteUserToOrganization",
		auditlog.EventDeleteInvitationToOrg:                          "DeleteInvitationToOrganization",
		auditlog.EventResendInvitationToOrg:                          "ResendInvitationToOrganization",
		auditlog.EventConfirmJoinOrg:                                 "ConfirmJoinOrganization",
		auditlog.EventDeleteUserFromOrg:                              "DeleteUserFromOrganization",
		auditlog.EventUpdateUserRole:                                 "UpdateUserRoleInOrganization",
		auditlog.EventCreateAPIKey:                                   "CreateAPIKey",
		auditlog.EventEditAPIKey:                                     "EditAPIKey",
		auditlog.EventDeleteAPIKey:                                   "DeleteAPIKey",
		auditlog.EventUpdateTimezone:                                 "UpdateTimezone",
		auditlog.EventShowBill:                                       "ShowBill",
		auditlog.EventDownloadBill:                                   "DownloadBill",
		auditlog.EventShowCredits:                                    "ShowCredits",
		auditlog.EventAddPaymentCard:                                 "AddPaymentCard",
		auditlog.EventUpdatePaymentCard:                              "UpdatePaymentCard",
		auditlog.EventDeletePaymentCard:                              "DeletePaymentCard",
		auditlog.EventSetDefaultPaymentCard:                          "SetDefaultPaymentCard",
		auditlog.EventEditBillingProfile:                             "EditBillingProfile",
		auditlog.EventContractAction:                                 "ContractAction",
		auditlog.EventEnableConsoleAuditLog:                          "UpdateConsoleAuditLog", // as enable/disable use this event type
		auditlog.EventShowConsoleAuditLog:                            "ShowConsoleAuditLog",
		auditlog.EventInviteUserToProject:                            "InviteUserToProject",
		auditlog.EventDeleteInvitationToProject:                      "DeleteInvitationToProject",
		auditlog.EventResendInvitationToProject:                      "ResendInvitationToProject",
		auditlog.EventConfirmJoinProject:                             "ConfirmJoinProject",
		auditlog.EventDeleteUserFromProject:                          "DeleteUserFromProject",
		auditlog.EventCreateProject:                                  "CreateProject",
		auditlog.EventCreateProjectCIDR:                              "CreateProjectCIDR",
		auditlog.EventUpdateProjectCIDR:                              "UpdateProjectCIDR",
		auditlog.EventDeleteProjectCIDR:                              "DeleteProjectCIDR",
		auditlog.EventCreateAWSVPCPeering:                            "CreateAWSVPCPeering",
		auditlog.EventDeleteAWSVPCPeering:                            "DeleteAWSVPCPeering",
		auditlog.EventCreateGCPVPCPeering:                            "CreateGCPVPCPeering",
		auditlog.EventDeleteGCPVPCPeering:                            "DeleteGCPVPCPeering",
		auditlog.EventCreatePrivateEndpoint:                          "CreatePrivateEndpoint",
		auditlog.EventEditPrivateEndpoint:                            "EditPrivateEndpoint",
		auditlog.EventDeletePrivateEndpoint:                          "DeletePrivateEndpoint",
		auditlog.EventSubscribeAlerts:                                "SubscribeAlerts",
		auditlog.EventUnsubscribeAlerts:                              "UnsubscribeAlerts",
		auditlog.EventCreateDatadogIntegration:                       "CreateDatadogIntegration",
		auditlog.EventDeleteDatadogIntegration:                       "DeleteDatadogIntegration",
		auditlog.CreateVercelIntegration:                             "CreateVercelIntegration",
		auditlog.DeleteVercelIntegration:                             "DeleteVercelIntegration",
		auditlog.CreatePrometheusIntegration:                         "CreatePrometheusIntegration",
		auditlog.DeletePrometheusIntegration:                         "DeletePrometheusIntegration",
		auditlog.EventCreateCluster:                                  "CreateCluster",
		auditlog.EventDeleteCluster:                                  "DeleteCluster",
		auditlog.EventPauseCluster:                                   "PauseCluster",
		auditlog.EventResumeCluster:                                  "ResumeCluster",
		auditlog.EventScaleCluster:                                   "ScaleCluster",
		auditlog.EventDownloadTiDBClusterCA:                          "DownloadTiDBClusterCA",
		auditlog.EventOpenWebSQLConsole:                              "OpenWebSQLConsole",
		auditlog.EventSetRootPassword:                                "SetRootPassword",
		auditlog.EventUpdateIPAccessList:                             "UpdateIPAccessList",
		auditlog.EventDeleteAccessList:                               "DeleteAccessList",
		auditlog.EventSetAutoBackup:                                  "SetAutoBackup",
		auditlog.EventDoManualBackup:                                 "DoManualBackup",
		auditlog.EventDeleteBackupTask:                               "DeleteBackupTask",
		auditlog.EventDeleteBackup:                                   "DeleteBackup",
		auditlog.EventRecoverFromBackup:                              "RestoreFromBackup",
		auditlog.EventRecoverFromTrash:                               "RestoreFromTrash",
		auditlog.EventImportDataFromAWS:                              "ImportDataFromAWS",
		auditlog.EventImportDataFromGCP:                              "ImportDataFromGCP",
		auditlog.EventImportDataFromAzure:                            "ImportDataFromAzure",
		auditlog.EventCreateMigrationJob:                             "CreateMigrationJob",
		auditlog.EventSuspendMigrationJob:                            "SuspendMigrationJob",
		auditlog.EventResumeMigrationJob:                             "ResumeMigrationJob",
		auditlog.EventDeleteMigrationJob:                             "DeleteMigrationJob",
		auditlog.EventShowDiagnose:                                   "ShowDiagnose",
		auditlog.EventDBAuditLogAction:                               "DBAuditLogAction",
		auditlog.EventAddDBAuditFilter:                               "AddDBAuditFilter",
		auditlog.EventDeleteDBAuditFilter:                            "DeleteDBAuditFilter",
		auditlog.EventEditProject:                                    "EditProject",
		auditlog.EventDeleteProject:                                  "DeleteProject",
		auditlog.EventBindSupportPlan:                                "BindSupportPlan",
		auditlog.EventCancelSupportPlan:                              "CancelSupportPlan",
		auditlog.EventUpdateOrgName:                                  "UpdateOrganizationName",
		auditlog.EventCreatePrivateEndpointService:                   "CreatePrivateEndpointService",
		auditlog.EventDeletePrivateEndpointService:                   "DeletePrivateEndpointService",
		auditlog.EventImportDataFromLocal:                            "ImportDataFromLocal",
		auditlog.EventCreateNewrelicIntegration:                      "CreateNewrelicIntegration",
		auditlog.EventDeleteNewrelicIntegration:                      "DeleteNewrelicIntegration",
		auditlog.EventUpdateAlertRule:                                "UpdateAlertRule",
		auditlog.EventSetServerlessSpendLimit:                        "SetSpendLimit",
		auditlog.EventUpdateMaintenanceWindow:                        "UpdateMaintenanceWindow",
		auditlog.EventDeferMaintenanceTask:                           "DeferMaintenanceTask",
		auditlog.EventEnableCloudOrganizationSSO:                     "EnableCloudOrganizationSSO",
		auditlog.EventEnableAuthenticationMethod:                     "EnableAuthenticationMethod",
		auditlog.EventDisableAuthenticationMethod:                    "DisableAuthenticationMethod",
		auditlog.EventUpdateAuthenticationMethod:                     "UpdateAuthenticationMethod",
		auditlog.EventEnterChat2Query:                                "EnterChat2Query",
		auditlog.EventCreateSQLFileFromChat2Query:                    "CreateSQLFileFromChat2Query",
		auditlog.EventDeleteSQLFileFromChat2Query:                    "DeleteSQLFileFromChat2Query",
		auditlog.EventConsoleChat2SQLFromChat2Query:                  "ConsoleAIFromChat2Query",
		auditlog.EventConsoleQuerySQLFromChat2Query:                  "ConsoleQuerySQLFromChat2Query",
		auditlog.EventDownloadQueryResultFromChat2Query:              "DownloadQueryResultFromChat2Query",
		auditlog.EventCreateBranch:                                   "CreateBranch",
		auditlog.EventDeleteBranch:                                   "DeleteBranch",
		auditlog.EventUpdateBranch:                                   "UpdateBranch",
		auditlog.EventSetBranchRootPassword:                          "SetBranchRootPassword",
		auditlog.EventCreateSQLUser:                                  "CreateSQLUser",
		auditlog.EventUpdateSQLUser:                                  "UpdateSQLUser",
		auditlog.EventDeleteSQLUser:                                  "DeleteSQLUser",
		auditlog.EventConnectBranchGitHub:                            "ConnectBranchGitHub",
		auditlog.EventDisconnectBranchGitHub:                         "DisconnectBranchGitHub",
		auditlog.EventUpdateCluster:                                  "UpdateCluster",
		auditlog.EventCreateAccesspoint:                              "CreateAccesspoint",
		auditlog.EventUpdateAccesspoint:                              "UpdateAccesspoint",
		auditlog.EventDeleteAccesspoint:                              "DeleteAccesspoint",
		auditlog.EventRestoreFromPITR:                                "RestoreFromPITR",
		auditlog.EventResetBranch:                                    "ResetBranch",
		auditlog.EventCreateTidbNodeGroup:                            "CreateTidbNodeGroup",
		auditlog.EventUpdateTidbNodeGroup:                            "UpdateTidbNodeGroup",
		auditlog.EventDeleteTidbNodeGroup:                            "DeleteTidbNodeGroup",
		auditlog.EventBackupCompleted:                                "BackupCompleted",
		auditlog.EventUpdateLogRedactionPolicy:                       "UpdateLogRedactionPolicy",
		auditlog.EventUpdateAuditLogConfig:                           "UpdateAuditLogConfig",
		auditlog.EventGenerateAuditLogFileDownloadAddress:            "GenerateAuditLogFileDownloadAddress",
		auditlog.EventCreateAuditLogFilterRule:                       "CreateAuditLogFilterRule",
		auditlog.EventUpdateAuditLogFilterRule:                       "UpdateAuditLogFilterRule",
		auditlog.EventDeleteAuditLogFilterRule:                       "DeleteAuditLogFilterRule",
		auditlog.EventCreateMetricsIntegration:                       "CreateMetricsIntegration",
		auditlog.EventDeleteMetricsIntegration:                       "DeleteMetricsIntegration",
		auditlog.EventCreateTiDB:                                     "CreateTiDB",
		auditlog.EventDeleteTiDB:                                     "DeleteTiDB",
		auditlog.EventUpdateTiDB:                                     "UpdateTiDB",
		auditlog.EventUpdatePublicConnection:                         "UpdatePublicConnection",
		auditlog.EventUpdateUserRoleInProject:                        "UpdateUserRoleInProject",
		auditlog.EventInviteUserToTiDB:                               "InviteUserToTiDB",
		auditlog.EventUpdateUserRoleInTiDB:                           "UpdateUserRoleInTiDB",
		auditlog.EventDeleteInvitationToTiDB:                         "DeleteInvitationToTiDB",
		auditlog.EventDeleteUserFromTiDB:                             "DeleteUserFromTiDB",
		auditlog.EventImportDataFromAlibabaCloud:                     "ImportDataFromAlibabaCloud",
		auditlog.EventImportDataCanceled:                             "ImportDataCanceled",
		auditlog.EventMoveCluster:                                    "MoveCluster",
		auditlog.EventBatchMoveCluster:                               "BatchMoveCluster",
		auditlog.EventApproveProjectMigration:                        "ApproveProjectMigration",
		auditlog.EventEnableDualLayerDataEncryption:                  "EnableDualLayerDataEncryption",
		auditlog.EventExportDataToLocal:                              "ExportDataToLocal",
		auditlog.EventExportDataToAWS:                                "ExportDataToAWS",
		auditlog.EventExportDataToGCP:                                "ExportDataToGCP",
		auditlog.EventExportDataToAzure:                              "ExportDataToAzure",
		auditlog.EventExportDataToAlibabaCloud:                       "ExportDataToAlibabaCloud",
		auditlog.EventExportDataCanceled:                             "ExportDataCanceled",
		auditlog.EventExportDataDeleted:                              "ExportDataDeleted",
		auditlog.EventCreatePrivateEndpointForExternalService:        "CreatePrivateEndpointForExternalService",
		auditlog.EventDeletePrivateEndpointForExternalService:        "DeletePrivateEndpointForExternalService",
		auditlog.EventAttachPrivateEndpointForExternalServiceDomains: "AttachPrivateEndpointForExternalServiceDomains",
		auditlog.EventDetachPrivateEndpointForExternalServiceDomains: "DetachPrivateEndpointForExternalServiceDomains",
		auditlog.EventCreateChangefeed:                               "CreateChangefeed",
		auditlog.EventEditChangefeed:                                 "EditChangefeed",
		auditlog.EventDeleteChangefeed:                               "DeleteChangefeed",
		auditlog.EventStartChangefeed:                                "StartChangefeed",
		auditlog.EventStopChangefeed:                                 "StopChangefeed",
		auditlog.EventScaleChangefeed:                                "ScaleChangefeed",
		auditlog.EventCreateResourcePool:                             "CreateResourcePool",
		auditlog.EventUpdateResourcePool:                             "UpdateResourcePool",
		auditlog.EventDeleteResourcePool:                             "DeleteResourcePool",
		auditlog.EventResizeResourcePoolCapacity:                     "ResizeResourcePoolCapacity",
		auditlog.EventUpdateResourcePoolCloudResourceTags:            "UpdateResourcePoolCloudResourceTags",
	}
)

func IsInternalEventType(eventType auditlog.EventType) bool {
	return internalEventMapper[eventType]
}

func GetEventTypeName(t auditlog.EventType) string {
	return EventCodeMapper[t]
}

func GetClusterTypeName(t auditlog.ClusterType) string {
	switch t {
	case auditlog.ClusterTypeServerless:
		return "Serverless"
	case auditlog.ClusterTypeDedicated:
		return "Dedicated"
	default:
		return ""
	}
}

func GetClusterType(isDevTier bool) auditlog.ClusterType {
	if isDevTier {
		return auditlog.ClusterTypeServerless
	}
	return auditlog.ClusterTypeDedicated
}

func GetOperatorTypeName(t auditlog.OperatorType) string {
	switch t {
	case auditlog.OperatorTypeUser:
		return "User"
	case auditlog.OperatorTypeAPIKey:
		return "API Key"
	case auditlog.OperatorTypeAccessToken:
		return "Access Token"
	case auditlog.OperatorTypeSystem:
		return "System"
	default:
		return "Unknown"
	}
}

func GetResultName(t auditlog.Result) string {
	switch t {
	case auditlog.ResultSuccess:
		return "Success"
	case auditlog.ResultFailed:
		return "Failure"
	default:
		return "Unknown"
	}
}
