/**
 * This file is part of the NocoBase (R) project.
 * Copyright (c) 2020-2024 NocoBase Co., Ltd.
 * Authors: NocoBase Team.
 *
 * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
 * For more information, please refer to: https://www.nocobase.com/agreement.
 */

export default {
  info: {
    title: 'NocoBase API - Backup & Restore plugin',
  },
  tags: [],
  paths: {
    '/backupFiles:create': {
      post: {
        summary: 'Create a new backup file',
        requestBody: {
          required: true,
          content: {
            'application/json': {
              schema: {
                $ref: '#/components/schemas/DumpOptions',
              },
            },
          },
        },
        responses: {
          '200': {
            description: 'Dump successful',
            content: {
              'application/json': {
                schema: {
                  type: 'object',
                  properties: {
                    key: {
                      type: 'string',
                    },
                  },
                },
              },
            },
          },
        },
      },
    },
    '/backupFiles:list': {
      get: {
        summary: 'Get backup file list',
        parameters: [
          {
            name: 'page',
            in: 'query',
            description: 'Page number of item to retrieve',
            required: false,
            schema: {
              type: 'integer',
              format: 'int32',
              default: 1,
            },
          },
          {
            name: 'pageSize',
            in: 'query',
            description: 'Number of item to retrieve per page',
            required: false,
            schema: {
              type: 'integer',
              format: 'int32',
              default: 10,
            },
          },
        ],

        responses: {
          '200': {
            description: 'A paged array of backup statuses',
            content: {
              'application/json': {
                schema: {
                  type: 'object',
                  properties: {
                    data: {
                      type: 'array',
                      items: {
                        oneOf: [
                          {
                            $ref: '#/components/schemas/BackUpStatusOk',
                          },
                          {
                            $ref: '#/components/schemas/BackUpStatusDoing',
                          },
                        ],
                      },
                    },
                    meta: {
                      type: 'object',
                      properties: {
                        page: {
                          type: 'integer',
                          format: 'int32',
                        },
                        pageSize: {
                          type: 'integer',
                          format: 'int32',
                        },
                        count: {
                          type: 'integer',
                          format: 'int64',
                        },
                        totalPage: {
                          type: 'integer',
                          format: 'int32',
                        },
                      },
                    },
                  },
                  required: ['data', 'meta'],
                },
              },
            },
          },
        },
      },
    },
    '/backupFiles:get': {
      get: {
        summary: 'Get backup file info',
        parameters: [
          {
            name: 'filterByTk',
            in: 'query',
            required: true,
            schema: {
              type: 'string',
            },
          },
        ],

        responses: {
          '200': {
            description: 'Status of the backup operation',
            content: {
              'application/json': {
                schema: {
                  oneOf: [
                    {
                      $ref: '#/components/schemas/BackUpStatusOk',
                    },
                    {
                      $ref: '#/components/schemas/BackUpStatusDoing',
                    },
                  ],
                },
              },
            },
          },
        },
      },
    },
    '/backupFiles:download': {
      get: {
        summary: 'Download a backup file',
        parameters: [
          {
            name: 'filterByTk',
            in: 'query',
            required: true,
            schema: {
              type: 'string',
            },
          },
        ],
        responses: {
          '200': {
            description: 'Download successful',
            content: {
              'application/octet-stream': {
                schema: {
                  type: 'string',
                  format: 'binary',
                },
              },
            },
          },
        },
      },
    },
    '/backupFiles:destroy': {
      post: {
        summary: 'Destroy a backup file',
        parameters: [
          {
            name: 'filterByTk',
            in: 'query',
            required: true,
            schema: {
              type: 'string',
            },
          },
        ],
        responses: {
          '200': {
            description: 'Destroy successful',
            content: {
              'application/json': {
                schema: {
                  type: 'object',
                  properties: {
                    status: {
                      type: 'string',
                    },
                  },
                },
              },
            },
          },
        },
      },
    },
    '/backupFiles:upload': {
      post: {
        summary: 'Upload a backup file',
        requestBody: {
          required: true,
          content: {
            'multipart/form-data': {
              schema: {
                type: 'object',
                properties: {
                  file: {
                    type: 'string',
                    format: 'binary',
                  },
                },
              },
            },
          },
        },

        responses: {
          200: {
            description: 'Upload successful',
            content: {
              'application/json': {
                schema: {
                  type: 'object',
                  properties: {
                    key: {
                      type: 'string',
                    },
                  },
                },
              },
            },
          },
        },
      },
    },

    '/backupFiles:restore': {
      post: {
        summary: 'Restore from a backup file',
        requestBody: {
          required: true,
          content: {
            'application/json': {
              schema: {
                type: 'object',
                properties: {
                  filterByTk: {
                    type: 'string',
                  },
                  dataTypes: {
                    type: 'array',
                    items: {
                      $ref: '#/components/schemas/DumpDataType',
                    },
                    uniqueItems: true,
                  },
                  key: {
                    type: 'string',
                  },
                },
                oneOf: [
                  {
                    required: ['filterByTk', 'dataTypes'],
                  },
                  {
                    required: ['key', 'dataTypes'],
                  },
                ],
              },
            },
          },
        },

        responses: {
          '200': {
            description: 'Restore successful',
            content: {
              'application/json': {
                schema: {
                  type: 'object',
                  properties: {
                    status: {
                      type: 'string',
                    },
                  },
                },
              },
            },
          },
        },
      },
    },
    '/backupFiles:dumpableCollections': {
      get: {
        summary: 'Get dumpable collections',
        responses: {
          '200': {
            description: 'A list of dumpable collections',
            content: {
              'application/json': {
                schema: {
                  type: 'object',
                  properties: {
                    meta: {
                      type: 'array',
                      items: {
                        type: 'object',
                        properties: {
                          name: {
                            type: 'string',
                          },
                          title: {
                            type: 'string',
                          },
                        },
                      },
                    },
                    config: {
                      type: 'array',
                      items: {
                        type: 'object',
                        properties: {
                          name: {
                            type: 'string',
                          },
                          title: {
                            type: 'string',
                          },
                        },
                      },
                    },
                    business: {
                      type: 'array',
                      items: {
                        type: 'object',
                        properties: {
                          name: {
                            type: 'string',
                          },
                          title: {
                            type: 'string',
                          },
                        },
                      },
                    },
                  },
                  required: ['meta', 'config', 'business'],
                },
              },
            },
          },
        },
      },
    },
  },

  components: {
    schemas: {
      BackUpStatusOk: {
        type: 'object',
        properties: {
          name: {
            type: 'string',
          },
          createdAt: {
            type: 'string',
            format: 'date-time',
          },
          fileSize: {
            type: 'string',
          },
          status: {
            type: 'string',
            enum: ['ok'],
          },
        },
        required: ['name', 'createdAt', 'fileSize', 'status'],
      },

      BackUpStatusDoing: {
        type: 'object',
        properties: {
          name: {
            type: 'string',
          },
          inProgress: {
            type: 'boolean',
            enum: [true],
          },
          status: {
            type: 'string',
            enum: ['in_progress'],
          },
        },
        required: ['name', 'inProgress', 'status'],
      },

      DumpDataType: {
        type: 'string',
        enum: ['meta', 'config', 'business'],
      },
      DumpOptions: {
        type: 'object',
        properties: {
          dataTypes: {
            type: 'array',
            items: {
              $ref: '#/components/schemas/DumpDataType',
            },
            uniqueItems: true,
          },
        },
        required: ['dataTypes'],
      },
    },
  },
};
