/**************************************************************************//**
 * @file     NVTFAT_ERROR.c
 * @brief    Get szDescription of the error nErrCode
 *
 * SPDX-License-Identifier: Apache-2.0
 * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#ifdef ECOS 
#include "stdio.h"
#include "string.h"
#include "drv_api.h"
#else
#include <stdio.h>
#include <string.h>
#endif

#include "N9H26.h"

#ifdef ECOS
#include "kapi.h"
#define sysprintf  diag_printf
#else
#define sysprintf  sysprintf
#endif

typedef struct fs_err_code_S
{
    INT  nErrorCode;
    CHAR  *szDescription;
}   FS_ERR_T;


static FS_ERR_T     _ptErrorCodeList[] =
{
    ERR_FILE_EOF,                    "end of file",
    ERR_GENERAL_FILE_ERROR,          "general file error",
    ERR_NO_FREE_MEMORY,              "no available memory",
    ERR_NO_FREE_BUFFER,              "no available sector buffer",
    ERR_NOT_SUPPORTED,               "operation was not supported",
    ERR_UNKNOWN_OP_CODE,             "unrecognized operation nErrCode",
    ERR_INTERNAL_ERROR,              "file system internal error",
    ERR_SYSTEM_LOCK,                 "file system locked by ScanDisk or Defragment",

    ERR_FILE_NOT_FOUND,              "file not found",
    ERR_FILE_INVALID_NAME,           "invalid file name",
    ERR_FILE_INVLAID_HANDLE,         "invalid file handle",
    ERR_FILE_IS_DIRECTORY,           "the file to be opened is a directory",
    ERR_FILE_IS_NOT_DIRECTORY,       "the directory to be opened is a file",
    ERR_FILE_CREATE_NEW,             "can not create new directory entry",
    ERR_FILE_OPEN_MAX_LIMIT,         "number of opened files has reached limitation",
    ERR_FILE_EXIST,                  "file already exist",
    ERR_FILE_INVALID_OP,             "invalid file operation",
    ERR_FILE_INVALID_ATTR,           "invalid file attribute",
    ERR_FILE_INVALID_TIME,           "invalid time format",
    ERR_FILE_TRUNC_UNDER,            "truncate file underflow, size < pos", 
    ERR_FILE_IS_CORRUPT,             "file is corrupt",

    ERR_PATH_INVALID,                "invalid path name",
    ERR_PATH_TOO_LONG,               "path too long",
    ERR_PATH_NOT_FOUND,              "path not found",

    ERR_DRIVE_NOT_FOUND,             "drive not found, the disk may have been unmounted",
    ERR_DRIVE_INVALID_NUMBER,        "invalid drive number",
    ERR_DRIVE_NO_FREE_SLOT,          "can not mount more drive",

    ERR_DIR_BUILD_EXIST,             "try to build an existent directory",
    ERR_DIR_REMOVE_MISS,             "try to remove a nonexistent directory",
    ERR_DIR_REMOVE_ROOT,             "try to remoe root directory",
    ERR_DIR_REMOVE_NOT_EMPTY,        "try to remove a non-empty directory",
    ERR_DIR_DIFFERENT_DRIVE,         "specified files on different drive",
    ERR_DIR_ROOT_FULL,               "FAT12/FAT16 root directory full",
    ERR_DIR_SET_SIZE,                "try to set file size of a directory",

    ERR_READ_VIOLATE,                "user has no read privilege",
    ERR_WRITE_VIOLATE,               "user has no write privilege",
    ERR_ACCESS_VIOLATE,              "can not access",
    ERR_READ_ONLY,                   "try to open a read-only file with write access",
    ERR_WRITE_CAP,                   "try to write file/directory which was opened with read-only",

    ERR_NO_DISK_MOUNT,               "there's no any disk mounted",
    ERR_DISK_CHANGE_DIRTY,           "disk change, buffer is dirty",
    ERR_DISK_REMOVED,                "portable disk has been removed",
    ERR_DISK_WRITE_PROTECT,          "disk is write-protected",
    ERR_DISK_FULL,                   "disk full",
    ERR_DISK_BAD_PARTITION,          "bad partition",
    ERR_DISK_UNKNOWN_PARTITION,      "unknown or not supported partition type",
    ERR_DISK_UNKNOWN_FORMAT,         "unknown disk format",
    ERR_DISK_BAD_BPB,                "bad BPB, disk may not be formatted",
    ERR_DISK_IO,                     "disk I/O failure",
    ERR_DISK_IO_TIMEOUT,             "disk I/O time-out",
    ERR_DISK_FAT_BAD_CLUS,           "bad cluster number in FAT table",
    ERR_DISK_INVALID_PARM,           "invalid parameter",
    ERR_DISK_CANNOT_LOCK,            "cannot lock disk, the disk was in-use or locked by other one",

    ERR_SEEK_SET_EXCEED,             "file seek set exceed end-of-file",
    ERR_ACCESS_SEEK_WRITE,           "try to seek a file which was opened for written",

    ERR_FILE_SYSTEM_NOT_INIT,        "file system was not initialized",
    ERR_ILLEGAL_ATTR_CHANGE,         "illegal file attribute change",

    0,                               ""
};



/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*      fsGetErrorDescription                                            */
/*                                                                       */
/* DESCRIPTION                                                           */
/*      Get the human readable szDescription of error reason.            */
/*                                                                       */
/* INPUTS                                                                */
/*      nErrCode    The error code                                       */
/*      bIsPrint    Print the szDescription string on console or not     */
/*                                                                       */
/*                                                                       */
/* OUTPUTS                                                               */
/*      szDescription    The container to receive the szDescription      */
/*                       string. If it was passed as NULL, then this     */
/*                       parameter will be ignored. It it is not NULL,   */
/*                       its length must at least be 128 bytes long.     */                                   
/*                                                                       */
/* RETURN                                                                */
/*      0           Success                                              */
/*      Otherwise   Failed, use GET_LAST_ERROR to obtain the reason      */
/*                                                                       */
/*************************************************************************/
void  fsGetErrorDescription(INT nErrCode, CHAR *szDescription, INT bIsPrint)
{
    FS_ERR_T    *ptErrCodePtr = _ptErrorCodeList;
    
    if (!nErrCode)
        return;
        
    if (nErrCode == ERR_FILE_NO_MORE)
        return;
    
    while (ptErrCodePtr->nErrorCode != 0)
    {
        if (ptErrCodePtr->nErrorCode == nErrCode)
        {
            if (szDescription != NULL)
                strcpy(szDescription, ptErrCodePtr->szDescription);
            if (bIsPrint)
            {
                sysprintf("Error - %s\n", ptErrCodePtr->szDescription);
            }
            return;
        }
        ptErrCodePtr++;
    }
    sysprintf("fsGetErrorDescription - undefined error nErrCode: %d\n", nErrCode);
}

