# source: pages 8 and 16 on PDF:
# https://global.download.synology.com/download/Document/Software/DeveloperGuide/Os/DSM/All/enu/DSM_Login_Web_API_Guide_enu.pdf

# NOTE: https://global.synologydownload.com/download/Document/Software/DeveloperGuide/Package/Calendar/2.4/enu
# /Synology_Calendar_API_Guide_enu.pdf, Refers to common error code # 160, "Insufficient application privilege" Page 10.
from __future__ import annotations

CODE_SUCCESS = 0
CODE_UNKNOWN = 9999
# 'Common' Error Codes:
error_codes = {
    CODE_SUCCESS: 'Success',
    100: 'Unknown error',
    101: 'No parameter of API, method or version',
    102: 'The requested API does not exist',
    103: 'The requested method does not exist',
    104: 'The requested version does not support the functionality',
    105: 'The logged in session does not have permission',
    106: 'Session timeout',
    107: 'Session interrupted by duplicated login',
    108: 'Failed to upload the file',
    109: 'The network connection is unstable or the system is busy',
    110: 'The network connection is unstable or the system is busy',
    111: 'The network connection is unstable or the system is busy',
    112: 'Preserve for other purpose',
    113: 'Preserve for other purpose',
    114: 'Lost parameters for this API',
    115: 'Not allowed to upload a file',
    116: 'Not allowed to perform for a demo site',
    117: 'The network connection is unstable or the system is busy',
    118: 'The network connection is unstable or the system is busy',
    119: 'Invalid session / SID not found.',
    # 120-149 Preserve for other purpose
    120: 'Preserve for other purpose',
    121: 'Preserve for other purpose',
    122: 'Preserve for other purpose',
    123: 'Preserve for other purpose',
    124: 'Preserve for other purpose',
    125: 'Preserve for other purpose',
    126: 'Preserve for other purpose',
    127: 'Preserve for other purpose',
    128: 'Preserve for other purpose',
    129: 'Preserve for other purpose',
    130: 'Preserve for other purpose',
    131: 'Preserve for other purpose',
    132: 'Preserve for other purpose',
    133: 'Preserve for other purpose',
    134: 'Preserve for other purpose',
    135: 'Preserve for other purpose',
    136: 'Preserve for other purpose',
    137: 'Preserve for other purpose',
    138: 'Preserve for other purpose',
    139: 'Preserve for other purpose',
    140: 'Preserve for other purpose',
    141: 'Preserve for other purpose',
    142: 'Preserve for other purpose',
    143: 'Preserve for other purpose',
    144: 'Preserve for other purpose',
    145: 'Preserve for other purpose',
    146: 'Preserve for other purpose',
    147: 'Preserve for other purpose',
    148: 'Preserve for other purpose',
    149: 'Preserve for other purpose',
    150: 'Request source IP does not match the login IP',
    160: 'Insufficient application privilege',
    CODE_UNKNOWN: 'Unknown Error',
}
# Source: https://global.synologydownload.com/download/Document/Software/DeveloperGuide/Os/DSM/All/enu
# /DSM_Login_Web_API_Guide_enu.pdf Page 16.
# https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/SurveillanceStation/All/enu
# /Surveillance_Station_Web_API.pdf Pages 32,33 Refers to Auth error code #411: 'Account Locked (when account max try
# exceed).'
auth_error_codes: dict[int, str] = {
    400: 'No such account or incorrect password',
    401: 'Disabled account',
    402: 'Denied permission',
    403: '2 - factor authentication code required',
    404: 'Failed to authenticate 2 - factor authentication code',
    406: 'Enforce to authenticate with 2 - factor authentication code',
    407: 'Blocked IP source',
    408: 'Expired password cannot change',
    409: 'Expired password',
    410: 'Password must be changed',
    411: 'Account Locked (when account max try exceed).',
}

# Source:https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/DownloadStation/All/enu/Synology_Download_Station_Web_API.pdf
# Page 29
download_station_error_codes: dict[int, str] = {
    400: 'File upload failed',
    401: 'Max number of tasks reached',
    402: 'Destination denied',
    403: 'Destination does not exist',
    404: 'Invalid task id',
    405: 'Invalid task action',
    406: 'No default destination',
    407: 'Set destination failed',
    408: 'File does not exist',
}

# TODO use the error code source https://cndl.synology.cn/download/Document/Software/DeveloperGuide/Package
#  /FileStation/All/enu/Synology_File_Station_API_Guide.pdf page 10~11
file_station_error_codes: dict[int, str] = {
    400: 'Invalid parameter of file operation',
    401: 'Unknown error of file operation',
    402: 'System is too busy',
    403: 'Invalid user does this file operation',
    404: 'Invalid group does this file operation',
    405: 'Invalid user and group does this file operation',
    406: "Can't get user/group information from the account server",
    407: 'Operation not permitted',
    408: 'No such file or directory',
    409: 'Non-supported file system',
    410: 'Failed to connect internet-based file system (e.g., CIFS)',
    411: 'Read-only file system',
    412: 'Filename too long in the non-encrypted file system',
    413: 'Filename too long in the encrypted file system',
    414: 'File already exists',
    415: 'Disk quota exceeded',
    416: 'No space left on device',
    417: 'Input/output error',
    418: 'Illegal name or path',
    419: 'Illegal file name',
    420: 'Illegal file name on FAT file system',
    421: 'Device or resource busy',
    599: 'No such task of the file operation',
}

# Source: https://global.synologydownload.com/download/Document/Software/DeveloperGuide/Package/Virtualization/All
# /enu/Synology_Virtual_Machine_Manager_API_Guide.pdf Page 8,9
virtualization_error_codes: dict[int, str] = {
    401: 'Bad parameter.',
    402: 'Operation failed.',
    403: 'Name conflict.',
    404: 'The number of iSCSI LUNs has reached the system limit. Note: vdisk is based on iSCSI LUN, which is also '
         'limited by the system.',
    500: 'The cluster is frozen. More than half of the hosts are offline.',
    501: 'The cluster is in the incompatible mode. Please upgrade to a compatible DSM version and try again.',
    600: 'The cluster is not ready.',
    601: 'The host is offline.',
    700: 'The storage is in invalid.',
    900: 'Failed to set a host to a virtual machine.',
    901: 'The virtual machine does not have a host.',
    902: 'Failed to power on a virtual machine due to insufficient CPU threads.',
    903: 'Failed to power on a virtual machine due to insufficient memory.',
    904: 'The status of virtual machine is online.',
    905: 'MAC conflict.',
    906: 'Failed to create virtual machine because the selected image is not found.',
    907: 'The status of virtual machine is offline.',
    908: 'Failed to power on a virtual machine due to insufficient CPU threads for reservation on the host.',
    909: 'Failed to power on the virtual machine because there is no corresponding networking on the host.',
    910: 'Only the VirtIO hard disk controller can be used to boot the virtual machine remotely.',
    911: 'Virtual machines with UEFI enabled cannot be powered on remotely.',
    1000: 'Cannot find task_id.',
    1001: 'Need Virtual Machine Manager Pro.',
    1400: 'The result of image creating is partial success.',
    1600: 'The virtual machine has been successfully edited. However, errors occurred while reserving the memory or '
          'CPU on the HA hosts.',
}

# Source: https://global.synologydownload.com/download/Document/Software/DeveloperGuide/Package/Calendar/2.4/enu
# /Synology_Calendar_API_Guide_enu.pdf Pages 10,11.
calendar_error_codes: dict[int, str] = {
    400: 'Invalid parameter of file operation',
    401: 'Unknown error of file operation',
    402: 'System is too busy',
    403: 'This user does not have permission to execute this operation',
    404: 'This group does not have permission to execute this operation',
    405: 'This user/group does not have permission to execute this operation',
    406: 'Cannot obtain user/group information from the account server',
    407: 'Operation not permitted',
    408: 'No such file or directory',
    409: 'File system not supported',
    410: 'Failed to connect internet-based file system (ex: CIFS)',
    411: 'Read-only file system',
    412: 'Filename too long in the non-encrypted file system',
    413: 'Filename too long in the encrypted file system',
    414: 'File already exists',
    415: 'Disk quota exceeded',
    416: 'No space left on device',
    417: 'Input/output error',
    418: 'Illegal name or path',
    419: 'Illegal file name',
    420: 'Illegal file name on FAT file system',
    421: 'Device or resource busy',
    599: 'No such task of the file operation',
}

# # Source: https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package
# /SurveillanceStation/All/enu/Surveillance_Station_Web_API.pdf NOTE: Pages 81, 131,132, 155, 190, 222, 305, 314,
# 321, 328, 451, 473 539, 556, contain unique items. Most of these are duplicate information, but they describe
# different methods, all the error codes I found are on # Pages: 71, 81, 85, 93, 103, 113, 131, 132, 139, 144, 155,
# 167, 169, 176, 187, 190, 191, 201, 211, 212, 217, 222, 227, #         241, 245, 249, 253, 264, 279, 281, 305, 314,
# 321, 328, 363, 365, 368, 369, 393, 395, 397, 403, 410, 412, 415, #         419, 430, 451, 473, 539, 556
surveillance_station_error_codes: dict[int, str] = {
    400: 'Execution failed.',
    401: 'Parameter invalid.',
    402: 'Camera disabled.',
    403: 'Insufficient license.',
    404: 'Codec activation failed',
    405: 'CMS server connection failed.',
    407: 'CMS closed.',
    412: 'Need to add license.',
    413: 'Reach the maximum of platform',
    414: 'Some events not exist.',
    415: 'message connect failed.',
    417: 'Test Connection Error.',
    418: 'Object is not exist. / The VisualStation ID does not exist.',
    419: 'Visualstation name repetition.',
    439: 'Too many items selected',
    446: 'Task Path already exist.',
    522: 'Original Task is Migrating',
    534: 'Exceed name length limitation.',
    543: 'The number of DVA tasks and face tasks exceed the limitation',
    548: 'The input video type of the DVA task is invalid',
    553: 'No face detected.',
    554: 'Face detected is too small.',
    555: 'Multiple faces detected.',
    556: 'The account try to set has exists.',
    557: 'No image data appended.',
    558: 'Add face group failed.',
    560: 'The camera try to apply to face task is occupied by another face task.',
    561: 'The number of face profile exceeds the maximum limit.',
    562: 'The number of face group exceeds the maximum limit.',
    563: 'The face profile is created or edited failed due to duplicated account.',
    564: 'The face result try to query doesn\'t exist',
    567: 'The face database is under synchronization.',
}
