package errx

import (
	"fmt"

	"github.com/warmbly/warmbly/internal/config"
)

var (
	ErrInvalid = New(BadRequest, "The request body contains invalid or malformed JSON.")

	ErrLock      = New(BadRequest, "Resource is locked. Another process is running, please wait.")
	ErrColor     = New(BadRequest, "Hex color must be a valid string.")
	ErrUuid      = New(BadRequest, "The id must be a valid uuid.")
	ErrCategory  = New(BadRequest, "Category doesn't exists.")
	ErrTag       = New(BadRequest, "Tag doesn't exists.")
	ErrBitmask   = New(BadRequest, "Invalid bitmask value.")
	ErrRole      = New(BadRequest, "Role doesn't exists.")
	ErrPosition  = New(BadRequest, "Invalid position.")
	ErrTimezone  = New(BadRequest, "Timezone doesn't exists.")
	ErrTime      = New(BadRequest, "Invalid time format.")
	ErrNotEnough = New(BadRequest, "Not enough data to perform this action.")
	ErrJSONKey   = New(BadRequest, "JSON key can only contain characters and underscore.")
	ErrLimit     = New(BadRequest, "Limit must be between 10 and 200.")

	// Authorization
	ErrToken = New(Unauthorized, "Invalid or expired token.")
	ErrAuth  = New(Unauthorized, "Missing or invalid Authorization header.")

	ErrUser        = New(BadRequest, "User doesn't exists.")
	ErrPassword    = New(BadRequest, "Password must be at least 8 characters long.")
	ErrEmail       = New(BadRequest, "Invalid email address.")
	ErrCredentials = New(BadRequest, "Invalid email or password.")
	ErrSession     = New(BadRequest, "Invalid or expired session.")
	ErrCodeLimit   = New(BadRequest, "Too many attempts. Start a new session and try again later.")
	ErrCode        = New(BadRequest, "Invalid or expired verification code.")
	ErrAuthLimit   = New(BadRequest, "Too many attempts, please try again later.")

	ErrExternalCode  = New(BadRequest, "Invalid or expired code, please try again.")
	ErrExternalEmail = New(BadRequest, "Invalid or unverified email address.")

	// Sessions
	ErrSessionNotFound = New(NotFound, "Session not found.")
	ErrSessionCurrent  = New(BadRequest, "You can't revoke the session you're currently using. Use sign out instead.")

	// Passkeys (WebAuthn)
	ErrPasskey         = New(BadRequest, "We couldn’t verify that passkey. Please try again.")
	ErrPasskeySession  = New(BadRequest, "Your passkey request expired. Please start again.")
	ErrPasskeyName     = New(BadRequest, "Passkey name must be between 1 and 60 characters.")
	ErrPasskeyNotFound = New(NotFound, "Passkey not found.")
	ErrPasskeyExists   = New(Conflict, "This passkey is already registered.")
	ErrPasskeyNone     = New(BadRequest, "No passkey was found for this account.")

	// Roles
	ErrRoleName = New(BadRequest, "Role name length must be between 3 and 100 characters.")

	// Captch
	ErrCaptcha = New(BadRequest, "We couldn’t verify you’re human. Please try the security check again or reload the page.")

	// Group
	ErrGroupTitle = New(BadRequest, "The title length must be between 1 and 50 characters.")
	ErrGroupMax   = New(BadRequest, "You reached the maximum amount.")

	// Email
	ErrEmailCredentials          = New(BadRequest, "Invalid email credentials.")
	ErrEmailValidation           = New(BadRequest, "Deadline exceed, try again later.")
	ErrEmailOnboardProvider      = New(BadRequest, "Unsupported email provider. Use 'gmail', 'outlook', or 'smtp_imap'.")
	ErrEmailOnboardState         = New(BadRequest, "Invalid or expired onboarding state.")
	ErrEmailOnboardCode          = New(BadRequest, "Authorization code is missing or invalid.")
	ErrEmailOnboardExchange      = New(BadRequest, "Could not exchange the authorization code with the provider.")
	ErrEmailOnboardUserInfo      = New(BadRequest, "Could not read account details from the provider.")
	ErrEmailOnboardAlreadyExists = New(Conflict, "This email account is already connected.")
	ErrEmailOnboardNoWorker      = New(ServiceUnavailable, "No mailbox workers are available right now. Please try again shortly.")
	ErrEmailOnboardInboxLimit    = New(Forbidden, "Your free trial includes two connected inboxes. Upgrade to add more.")
	ErrEmailOnboardTrialExpired  = New(Forbidden, "Your free trial has ended. Upgrade to connect inboxes.")
	ErrEmailSMTPHost             = New(BadRequest, "SMTP host is required.")
	ErrEmailSMTPPort             = New(BadRequest, "SMTP port must be 465 or 587.")
	ErrEmailIMAPHost             = New(BadRequest, "IMAP host is required.")
	ErrEmailIMAPPort             = New(BadRequest, "IMAP port must be a positive integer.")
	ErrEmailCredentialsRequired  = New(BadRequest, "SMTP and IMAP credentials are required.")
	ErrEmailTrackingDomain       = New(BadRequest, "Invalid tracking domain.")
	ErrEmailTrackingDomainLength = New(BadRequest, "Tracking domain is too long (max 253 characters).")
	ErrEmailName                 = New(BadRequest, "Invalid name. Must be 2–100 characters and contain only letters, numbers, spaces, '-', '.', or '’'.")
	ErrEmailSignaturePlain       = New(BadRequest, "Plain email signature is too long.")
	ErrEmailSignatureHTML        = New(BadRequest, "HTML email signature is too long.")
	ErrEmailMinWaitTime          = New(BadRequest, "Minimum time gap between emails must be between 0 and 86400 minutes.")
	ErrEmailCampaignLimit        = New(BadRequest, "Campaign limit must be between 0 and 100.")
	ErrEmailWarmupBase           = New(BadRequest, "Warmup base must be between 0 and 100.")
	ErrEmailWarmupMax            = New(BadRequest, "Warmup max amount must be between 0 and 100.")
	ErrEmailWarmupIncrease       = New(BadRequest, "Warmup increase amount must be between 0 and 100.")
	ErrEmailReplyRate            = New(BadRequest, "Warmup reply rate must be between 0 and 100.")

	// Campaign
	ErrCampaignName        = New(BadRequest, "Campaign name length must be between 3 and 50 characters.")
	ErrCampaignDescription = New(BadRequest, "Campaign description length must be below 300 characters.")
	ErrCampaignDailyLimit  = New(BadRequest, "Daily limit must be between 3 and 10000000.")
	ErrCampaignStartDate   = New(BadRequest, "Start date must be in the future, use null if you want to start now.")
	ErrCampaignEndDate     = New(BadRequest, "End date must be in the future.")
	ErrCampaignLimit       = New(BadRequest, "You reached your limit for campaigns, please try again later.")

	// Sequence
	ErrSequenceName      = New(BadRequest, "Sequence name cannot be longer than 50 characters.")
	ErrSequenceSubject   = New(BadRequest, "Sequence subject cannot be longer than 100 characters.")
	ErrSequenceBody      = New(BadRequest, fmt.Sprintf("Sequence body cannot be longer than %d characters.", config.SequenceBodyLimit))
	ErrSequenceBranch    = New(BadRequest, "Invalid branching conditions.")
	ErrSequenceBranchTo  = New(BadRequest, "Branch target must be another step in the same campaign and cannot create a cycle.")
	ErrSequenceKind      = New(BadRequest, "Step kind must be email, action, or wait.")
	ErrSequenceAction    = New(BadRequest, "Invalid action configuration for this step.")
	ErrSequenceWaitAfter = New(BadRequest, fmt.Sprintf("Step wait must be between 0 and %d days.", config.SequenceWaitAfterMax))

	// Contact
	ErrContactSerialize = New(BadRequest, "Failed to serialize contact.")
	ErrContactSize      = New(BadRequest, "Contact size cannot be bigger than 10KB.")

	// Unibox
	ErrUniboxLimit = New(BadRequest, fmt.Sprintf("Limit must be between %d and %d.", config.UniboxLimitMin, config.UniboxLimitMax))
	ErrSeenMax     = New(BadRequest, "Cannot update more than 500 messages.")

	// Servers
	ErrIPAddr    = New(BadRequest, "Invalid IP Address.")
	ErrPublicKey = New(BadRequest, "Invalid Public Key.")
)
