// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

#import "OCTToxConstants.h"

/**
 * Maximum avatar size as defined in
 * https://tox.gitbooks.io/tox-client-standard/content/user_identification/avatar.html
 */
static const OCTToxFileSize kOCTManagerMaxAvatarSize = 65536;

typedef NS_ENUM(NSInteger, OCTFetchRequestType) {
    OCTFetchRequestTypeFriend,
    OCTFetchRequestTypeFriendRequest,
    OCTFetchRequestTypeChat,
    OCTFetchRequestTypeCall,
    OCTFetchRequestTypeMessageAbstract,
};

typedef NS_ENUM(NSInteger, OCTMessageFileType) {
    /**
     * File is incoming and is waiting confirmation of user to be downloaded.
     * Please start loading or cancel it with <<placeholder>> method.
     */
    OCTMessageFileTypeWaitingConfirmation,

    /**
     * File is downloading or uploading.
     */
    OCTMessageFileTypeLoading,

    /**
     * Downloading or uploading of file is paused.
     */
    OCTMessageFileTypePaused,

    /**
     * Downloading or uploading of file was canceled.
     */
    OCTMessageFileTypeCanceled,

    /**
     * File is fully loaded.
     * In case of incoming file now it can be shown to user.
     */
    OCTMessageFileTypeReady,
};

typedef NS_ENUM(NSInteger, OCTMessageFilePausedBy) {
    /**
     * File transfer isn't paused.
     */
    OCTMessageFilePausedByNone = 0,

    /**
     * File transfer is paused by user.
     */
    OCTMessageFilePausedByUser = 1 << 0,

    /**
     * File transfer is paused by friend.
     */
    OCTMessageFilePausedByFriend = 1 << 1,
};

typedef NS_ENUM(NSInteger, OCTMessageCallEvent) {
    /**
     * Call was answered.
     */
    OCTMessageCallEventAnswered,

    /**
     * Call was unanswered.
     */
    OCTMessageCallEventUnanswered,
};

typedef NS_ENUM(NSInteger, OCTCallStatus) {
    /**
     * Call is currently ringing.
     */
    OCTCallStatusRinging,

    /**
     * Call is currently dialing a chat.
     */
    OCTCallStatusDialing,

    /**
     * Call is currently active in session.
     */
    OCTCallStatusActive,
};

typedef NS_OPTIONS(NSInteger, OCTCallPausedStatus) {
    /**
     * Call is not paused
     */
    OCTCallPausedStatusNone = 0,

    /**
     * Call is paused by the user
     */
    OCTCallPausedStatusByUser = 1 << 0,

    /**
     * Call is paused by friend
     */
    OCTCallPausedStatusByFriend = 1 << 1,
};

extern NSString *const kOCTManagerErrorDomain;

typedef NS_ENUM(NSInteger, OCTManagerInitError) {
    /**
     * Cannot create symmetric key from given passphrase.
     */
    OCTManagerInitErrorPassphraseFailed,

    /** ---------------------------------------- */

    /**
     * Cannot copy tox save at `importToxSaveFromPath` path.
     */
    OCTManagerInitErrorCannotImportToxSave,

    /** ---------------------------------------- */

    /**
     * Cannot create encryption key.
     */
    OCTManagerInitErrorDatabaseKeyCannotCreateKey,

    /**
     * Cannot read encryption key.
     */
    OCTManagerInitErrorDatabaseKeyCannotReadKey,

    /**
     * Old unencrypted database was found and migration attempt was made. However migration failed for some reason.
     *
     * You can check NSLocalizedDescriptionKey and NSLocalizedFailureReasonErrorKey for more info.
     */
    OCTManagerInitErrorDatabaseKeyMigrationToEncryptedFailed,

    /**
     * Cannot decrypt database key file.
     * Some input data was empty.
     */
    OCTManagerInitErrorDatabaseKeyDecryptNull,

    /**
     * Cannot decrypt database key file.
     * The input data is missing the magic number (i.e. wasn't created by this module, or is corrupted).
     */
    OCTManagerInitErrorDatabaseKeyDecryptBadFormat,

    /**
     * Cannot decrypt database key file.
     * The encrypted byte array could not be decrypted. Either the data was corrupt or the password/key was incorrect.
     */
    OCTManagerInitErrorDatabaseKeyDecryptFailed,

    /** ---------------------------------------- */

    /**
     * Cannot decrypt tox save file.
     * Some input data was empty.
     */
    OCTManagerInitErrorToxFileDecryptNull,

    /**
     * Cannot decrypt tox save file.
     * The input data is missing the magic number (i.e. wasn't created by this module, or is corrupted).
     */
    OCTManagerInitErrorToxFileDecryptBadFormat,

    /**
     * Cannot decrypt tox save file.
     * The encrypted byte array could not be decrypted. Either the data was corrupt or the password/key was incorrect.
     */
    OCTManagerInitErrorToxFileDecryptFailed,

    /** ---------------------------------------- */

    /**
     * Cannot create tox.
     * Unknown error occurred.
     */
    OCTManagerInitErrorCreateToxUnknown,

    /**
     * Cannot create tox.
     * Was unable to allocate enough memory to store the internal structures for the Tox object.
     */
    OCTManagerInitErrorCreateToxMemoryError,

    /**
     * Cannot create tox.
     * Was unable to bind to a port. This may mean that all ports have already been bound,
     * e.g. by other Tox instances, or it may mean a permission error.
     */
    OCTManagerInitErrorCreateToxPortAlloc,

    /**
     * Cannot create tox.
     * proxyType was invalid.
     */
    OCTManagerInitErrorCreateToxProxyBadType,

    /**
     * Cannot create tox.
     * proxyAddress had an invalid format or was nil (while proxyType was set).
     */
    OCTManagerInitErrorCreateToxProxyBadHost,

    /**
     * Cannot create tox.
     * proxyPort was invalid.
     */
    OCTManagerInitErrorCreateToxProxyBadPort,

    /**
     * Cannot create tox.
     * The proxy host passed could not be resolved.
     */
    OCTManagerInitErrorCreateToxProxyNotFound,

    /**
     * Cannot create tox.
     * The saved data to be loaded contained an encrypted save.
     */
    OCTManagerInitErrorCreateToxEncrypted,

    /**
     * Cannot create tox.
     * The data format was invalid. This can happen when loading data that was
     * saved by an older version of Tox, or when the data has been corrupted.
     * When loading from badly formatted data, some data may have been loaded,
     * and the rest is discarded. Passing an invalid length parameter also
     * causes this error.
     */
    OCTManagerInitErrorCreateToxBadFormat,
};

typedef NS_ENUM(NSInteger, OCTSetUserAvatarError) {
    /**
     * User avatar size is too big. It should be <= kOCTManagerMaxAvatarSize.
     */
    OCTSetUserAvatarErrorTooBig,
};

typedef NS_ENUM(NSInteger, OCTSendFileError) {
    /**
     * Internal error occured while sending file.
     * Check logs for more info.
     */
    OCTSendFileErrorInternalError,

    /**
     * Cannot read file.
     */
    OCTSendFileErrorCannotReadFile,

    /**
     * Cannot save send file to uploads folder.
     */
    OCTSendFileErrorCannotSaveFileToUploads,

    /**
     * Friend to send file to was not found.
     */
    OCTSendFileErrorFriendNotFound,

    /**
     * Friend is not connected at the moment.
     */
    OCTSendFileErrorFriendNotConnected,

    /**
     * Filename length exceeded kOCTToxMaxFileNameLength bytes.
     */
    OCTSendFileErrorNameTooLong,

    /**
     * Too many ongoing transfers. The maximum number of concurrent file transfers
     * is 256 per friend per direction (sending and receiving).
     */
    OCTSendFileErrorTooMany,
};

typedef NS_ENUM(NSInteger, OCTAcceptFileError) {
    /**
     * Internal error occured while sending file.
     * Check logs for more info.
     */
    OCTAcceptFileErrorInternalError,

    /**
     * File is not available for writing.
     */
    OCTAcceptFileErrorCannotWriteToFile,

    /**
     * Friend to send file to was not found.
     */
    OCTAcceptFileErrorFriendNotFound,

    /**
     * Friend is not connected at the moment.
     */
    OCTAcceptFileErrorFriendNotConnected,

    /**
     * Wrong message specified (with no friend, no file or not waiting for confirmation).
     */
    OCTAcceptFileErrorWrongMessage,
};

typedef NS_ENUM(NSInteger, OCTFileTransferError) {
    /**
     * Wrong message specified (with no file).
     */
    OCTFileTransferErrorWrongMessage,
};
