import controller from "../../controllers/public/tables"
import Endpoint from "./utils/Endpoint"
import { tableValidator, nameValidator } from "../utils/validators"

const read = [],
  write = []

/**
 * @openapi
 * /tables:
 *   post:
 *     summary: Create a table
 *     description: Create a table, this could be internal or external.
 *     tags:
 *       - tables
 *     parameters:
 *       - $ref: '#/components/parameters/appId'
 *     requestBody:
 *       content:
 *         application/json:
 *           schema:
 *             $ref: '#/components/schemas/table'
 *           examples:
 *             table:
 *               $ref: '#/components/examples/table'
 *     responses:
 *       200:
 *         description: Returns the created table, including the ID which has been generated for it. This can be
 *           internal or external data sources.
 *         content:
 *           application/json:
 *             schema:
 *               $ref: '#/components/schemas/tableOutput'
 *             examples:
 *               table:
 *                 $ref: '#/components/examples/table'
 */
write.push(
  new Endpoint("post", "/tables", controller.create).addMiddleware(
    tableValidator()
  )
)

/**
 * @openapi
 * /tables/{tableId}:
 *   put:
 *     summary: Update a table
 *     description: Update a table, this could be internal or external.
 *     tags:
 *       - tables
 *     parameters:
 *       - $ref: '#/components/parameters/tableId'
 *       - $ref: '#/components/parameters/appId'
 *     requestBody:
 *       content:
 *         application/json:
 *           schema:
 *             $ref: '#/components/schemas/table'
 *           examples:
 *             table:
 *               $ref: '#/components/examples/table'
 *     responses:
 *       200:
 *         description: Returns the updated table.
 *         content:
 *           application/json:
 *             schema:
 *               $ref: '#/components/schemas/tableOutput'
 *             examples:
 *               table:
 *                 $ref: '#/components/examples/table'
 */
write.push(
  new Endpoint("put", "/tables/:tableId", controller.update).addMiddleware(
    tableValidator()
  )
)

/**
 * @openapi
 * /tables/{tableId}:
 *   delete:
 *     summary: Delete a table
 *     description: Delete a table, this could be internal or external.
 *     tags:
 *       - tables
 *     parameters:
 *       - $ref: '#/components/parameters/tableId'
 *       - $ref: '#/components/parameters/appId'
 *     responses:
 *       200:
 *         description: Returns the deleted table.
 *         content:
 *           application/json:
 *             schema:
 *               $ref: '#/components/schemas/tableOutput'
 *             examples:
 *               table:
 *                 $ref: '#/components/examples/table'
 */
write.push(new Endpoint("delete", "/tables/:tableId", controller.destroy))

/**
 * @openapi
 * /tables/{tableId}:
 *   get:
 *     summary: Retrieve a table
 *     description: Lookup a table, this could be internal or external.
 *     tags:
 *       - tables
 *     parameters:
 *       - $ref: '#/components/parameters/tableId'
 *       - $ref: '#/components/parameters/appId'
 *     responses:
 *       200:
 *         description: Returns the retrieved table.
 *         content:
 *           application/json:
 *             schema:
 *               $ref: '#/components/schemas/tableOutput'
 *             examples:
 *               table:
 *                 $ref: '#/components/examples/table'
 */
read.push(new Endpoint("get", "/tables/:tableId", controller.read))

/**
 * @openapi
 * /tables/search:
 *   post:
 *     summary: Search for tables
 *     description: Based on table properties (currently only name) search for tables. This could be
 *       an internal or an external table.
 *     tags:
 *       - tables
 *     parameters:
 *       - $ref: '#/components/parameters/appId'
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             $ref: '#/components/schemas/nameSearch'
 *     responses:
 *       200:
 *         description: Returns the found tables, based on the search parameters.
 *         content:
 *           application/json:
 *             schema:
 *               $ref: '#/components/schemas/tableSearch'
 *             examples:
 *               tables:
 *                 $ref: '#/components/examples/tables'
 */
read.push(
  new Endpoint("post", "/tables/search", controller.search).addMiddleware(
    nameValidator()
  )
)

export default { read, write }
