package mega

import (
	"errors"
	"fmt"
)

var (
	// General errors
	EINTERNAL  = errors.New("Internal error occured")
	EARGS      = errors.New("Invalid arguments")
	EAGAIN     = errors.New("Try again")
	ERATELIMIT = errors.New("Rate limit reached")
	EBADRESP   = errors.New("Bad response from server")

	// Upload errors
	EFAILED  = errors.New("The upload failed. Please restart it from scratch")
	ETOOMANY = errors.New("Too many concurrent IP addresses are accessing this upload target URL")
	ERANGE   = errors.New("The upload file packet is out of range or not starting and ending on a chunk boundary")
	EEXPIRED = errors.New("The upload target URL you are trying to access has expired. Please request a fresh one")

	// Filesystem/Account errors
	ENOENT              = errors.New("Object (typically, node or user) not found")
	ECIRCULAR           = errors.New("Circular linkage attempted")
	EACCESS             = errors.New("Access violation")
	EEXIST              = errors.New("Trying to create an object that already exists")
	EINCOMPLETE         = errors.New("Trying to access an incomplete resource")
	EKEY                = errors.New("A decryption operation failed")
	ESID                = errors.New("Invalid or expired user session, please relogin")
	EBLOCKED            = errors.New("User blocked")
	EOVERQUOTA          = errors.New("Request over quota")
	ETEMPUNAVAIL        = errors.New("Resource temporarily not available, please try again later")
	EMACMISMATCH        = errors.New("MAC verification failed")
	EBADATTR            = errors.New("Bad node attribute")
	ETOOMANYCONNECTIONS = errors.New("Too many connections on this resource.")
	EWRITE              = errors.New("File could not be written to (or failed post-write integrity check).")
	EREAD               = errors.New("File could not be read from (or changed unexpectedly during reading).")
	EAPPKEY             = errors.New("Invalid or missing application key.")
	ESSL                = errors.New("SSL verification failed")
	EGOINGOVERQUOTA     = errors.New("Not enough quota")
	EMFAREQUIRED        = errors.New("Multi-factor authentication required")

	// Config errors
	EWORKER_LIMIT_EXCEEDED = errors.New("Maximum worker limit exceeded")
)

type ErrorMsg int

func parseError(errno ErrorMsg) error {
	switch {
	case errno == 0:
		return nil
	case errno == -1:
		return EINTERNAL
	case errno == -2:
		return EARGS
	case errno == -3:
		return EAGAIN
	case errno == -4:
		return ERATELIMIT
	case errno == -5:
		return EFAILED
	case errno == -6:
		return ETOOMANY
	case errno == -7:
		return ERANGE
	case errno == -8:
		return EEXPIRED
	case errno == -9:
		return ENOENT
	case errno == -10:
		return ECIRCULAR
	case errno == -11:
		return EACCESS
	case errno == -12:
		return EEXIST
	case errno == -13:
		return EINCOMPLETE
	case errno == -14:
		return EKEY
	case errno == -15:
		return ESID
	case errno == -16:
		return EBLOCKED
	case errno == -17:
		return EOVERQUOTA
	case errno == -18:
		return ETEMPUNAVAIL
	case errno == -19:
		return ETOOMANYCONNECTIONS
	case errno == -20:
		return EWRITE
	case errno == -21:
		return EREAD
	case errno == -22:
		return EAPPKEY
	case errno == -23:
		return ESSL
	case errno == -24:
		return EGOINGOVERQUOTA
	case errno == -26:
		return EMFAREQUIRED
	}

	return fmt.Errorf("Unknown mega error %d", errno)
}
