const express = require('express');

const Modelos_bim_asbuiltService = require('../services/modelos_bim_asbuilt');
const Modelos_bim_asbuiltDBApi = require('../db/api/modelos_bim_asbuilt');
const wrapAsync = require('../helpers').wrapAsync;

const config = require('../config');

const router = express.Router();

const { parse } = require('json2csv');

const { checkCrudPermissions } = require('../middlewares/check-permissions');

router.use(checkCrudPermissions('modelos_bim_asbuilt'));

/**
 *  @swagger
 *  components:
 *    schemas:
 *      Modelos_bim_asbuilt:
 *        type: object
 *        properties:

 *          nome_modelo:
 *            type: string
 *            default: nome_modelo
 *          descricao:
 *            type: string
 *            default: descricao
 *          arquivo_modelo:
 *            type: string
 *            default: arquivo_modelo
 *          formato:
 *            type: string
 *            default: formato
 *          plataforma_origem:
 *            type: string
 *            default: plataforma_origem
 *          responsavel_modelagem:
 *            type: string
 *            default: responsavel_modelagem
 *          nivel_detalhamento:
 *            type: string
 *            default: nivel_detalhamento
 *          comentarios:
 *            type: string
 *            default: comentarios

 */

/**
 *  @swagger
 * tags:
 *   name: Modelos_bim_asbuilt
 *   description: The Modelos_bim_asbuilt managing API
 */

/**
 *  @swagger
 *  /api/modelos_bim_asbuilt:
 *    post:
 *      security:
 *        - bearerAuth: []
 *      tags: [Modelos_bim_asbuilt]
 *      summary: Add new item
 *      description: Add new item
 *      requestBody:
 *        required: true
 *        content:
 *          application/json:
 *            schema:
 *              properties:
 *                data:
 *                  description: Data of the updated item
 *                  type: object
 *                  $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *      responses:
 *        200:
 *          description: The item was successfully added
 *          content:
 *            application/json:
 *              schema:
 *                $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *        401:
 *          $ref: "#/components/responses/UnauthorizedError"
 *        405:
 *          description: Invalid input data
 *        500:
 *          description: Some server error
 */
router.post(
  '/',
  wrapAsync(async (req, res) => {
    const referer =
      req.headers.referer ||
      `${req.protocol}://${req.hostname}${req.originalUrl}`;
    const link = new URL(referer);
    await Modelos_bim_asbuiltService.create(
      req.body.data,
      req.currentUser,
      true,
      link.host,
    );
    const payload = true;
    res.status(200).send(payload);
  }),
);

/**
 * @swagger
 * /api/budgets/bulk-import:
 *  post:
 *    security:
 *      - bearerAuth: []
 *    tags: [Modelos_bim_asbuilt]
 *    summary: Bulk import items
 *    description: Bulk import items
 *    requestBody:
 *      required: true
 *      content:
 *        application/json:
 *         schema:
 *          properties:
 *            data:
 *              description: Data of the updated items
 *              type: array
 *              items:
 *                $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *    responses:
 *      200:
 *        description: The items were successfully imported
 *    content:
 *      application/json:
 *        schema:
 *          $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *      401:
 *        $ref: "#/components/responses/UnauthorizedError"
 *      405:
 *        description: Invalid input data
 *      500:
 *        description: Some server error
 *
 */
router.post(
  '/bulk-import',
  wrapAsync(async (req, res) => {
    const referer =
      req.headers.referer ||
      `${req.protocol}://${req.hostname}${req.originalUrl}`;
    const link = new URL(referer);
    await Modelos_bim_asbuiltService.bulkImport(req, res, true, link.host);
    const payload = true;
    res.status(200).send(payload);
  }),
);

/**
 *  @swagger
 *  /api/modelos_bim_asbuilt/{id}:
 *    put:
 *      security:
 *        - bearerAuth: []
 *      tags: [Modelos_bim_asbuilt]
 *      summary: Update the data of the selected item
 *      description: Update the data of the selected item
 *      parameters:
 *        - in: path
 *          name: id
 *          description: Item ID to update
 *          required: true
 *          schema:
 *            type: string
 *      requestBody:
 *        description: Set new item data
 *        required: true
 *        content:
 *          application/json:
 *            schema:
 *              properties:
 *                id:
 *                  description: ID of the updated item
 *                  type: string
 *                data:
 *                  description: Data of the updated item
 *                  type: object
 *                  $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *              required:
 *                - id
 *      responses:
 *        200:
 *          description: The item data was successfully updated
 *          content:
 *            application/json:
 *              schema:
 *                $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *        400:
 *          description: Invalid ID supplied
 *        401:
 *          $ref: "#/components/responses/UnauthorizedError"
 *        404:
 *          description: Item not found
 *        500:
 *          description: Some server error
 */
router.put(
  '/:id',
  wrapAsync(async (req, res) => {
    await Modelos_bim_asbuiltService.update(
      req.body.data,
      req.body.id,
      req.currentUser,
    );
    const payload = true;
    res.status(200).send(payload);
  }),
);

/**
 * @swagger
 *  /api/modelos_bim_asbuilt/{id}:
 *    delete:
 *      security:
 *        - bearerAuth: []
 *      tags: [Modelos_bim_asbuilt]
 *      summary: Delete the selected item
 *      description: Delete the selected item
 *      parameters:
 *        - in: path
 *          name: id
 *          description: Item ID to delete
 *          required: true
 *          schema:
 *            type: string
 *      responses:
 *        200:
 *          description: The item was successfully deleted
 *          content:
 *            application/json:
 *              schema:
 *                $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *        400:
 *          description: Invalid ID supplied
 *        401:
 *          $ref: "#/components/responses/UnauthorizedError"
 *        404:
 *          description: Item not found
 *        500:
 *          description: Some server error
 */
router.delete(
  '/:id',
  wrapAsync(async (req, res) => {
    await Modelos_bim_asbuiltService.remove(req.params.id, req.currentUser);
    const payload = true;
    res.status(200).send(payload);
  }),
);

/**
 *  @swagger
 *  /api/modelos_bim_asbuilt/deleteByIds:
 *    post:
 *      security:
 *        - bearerAuth: []
 *      tags: [Modelos_bim_asbuilt]
 *      summary: Delete the selected item list
 *      description: Delete the selected item list
 *      requestBody:
 *        required: true
 *        content:
 *          application/json:
 *            schema:
 *              properties:
 *                ids:
 *                  description: IDs of the updated items
 *                  type: array
 *      responses:
 *        200:
 *          description: The items was successfully deleted
 *          content:
 *            application/json:
 *              schema:
 *                $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *        401:
 *          $ref: "#/components/responses/UnauthorizedError"
 *        404:
 *          description: Items not found
 *        500:
 *          description: Some server error
 */
router.post(
  '/deleteByIds',
  wrapAsync(async (req, res) => {
    await Modelos_bim_asbuiltService.deleteByIds(
      req.body.data,
      req.currentUser,
    );
    const payload = true;
    res.status(200).send(payload);
  }),
);

/**
 *  @swagger
 *  /api/modelos_bim_asbuilt:
 *    get:
 *      security:
 *        - bearerAuth: []
 *      tags: [Modelos_bim_asbuilt]
 *      summary: Get all modelos_bim_asbuilt
 *      description: Get all modelos_bim_asbuilt
 *      responses:
 *        200:
 *          description: Modelos_bim_asbuilt list successfully received
 *          content:
 *            application/json:
 *              schema:
 *                type: array
 *                items:
 *                  $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *        401:
 *          $ref: "#/components/responses/UnauthorizedError"
 *        404:
 *          description: Data not found
 *        500:
 *          description: Some server error
 */
router.get(
  '/',
  wrapAsync(async (req, res) => {
    const filetype = req.query.filetype;

    const globalAccess = req.currentUser.app_role.globalAccess;

    const currentUser = req.currentUser;
    const payload = await Modelos_bim_asbuiltDBApi.findAll(
      req.query,
      globalAccess,
      { currentUser },
    );
    if (filetype && filetype === 'csv') {
      const fields = [
        'id',
        'nome_modelo',
        'descricao',
        'arquivo_modelo',
        'formato',
        'plataforma_origem',
        'responsavel_modelagem',
        'nivel_detalhamento',
        'comentarios',

        'data_modelagem',
      ];
      const opts = { fields };
      try {
        const csv = parse(payload.rows, opts);
        res.status(200).attachment(csv);
        res.send(csv);
      } catch (err) {
        console.error(err);
      }
    } else {
      res.status(200).send(payload);
    }
  }),
);

/**
 *  @swagger
 *  /api/modelos_bim_asbuilt/count:
 *    get:
 *      security:
 *        - bearerAuth: []
 *      tags: [Modelos_bim_asbuilt]
 *      summary: Count all modelos_bim_asbuilt
 *      description: Count all modelos_bim_asbuilt
 *      responses:
 *        200:
 *          description: Modelos_bim_asbuilt count successfully received
 *          content:
 *            application/json:
 *              schema:
 *                type: array
 *                items:
 *                  $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *        401:
 *          $ref: "#/components/responses/UnauthorizedError"
 *        404:
 *          description: Data not found
 *        500:
 *          description: Some server error
 */
router.get(
  '/count',
  wrapAsync(async (req, res) => {
    const globalAccess = req.currentUser.app_role.globalAccess;

    const currentUser = req.currentUser;
    const payload = await Modelos_bim_asbuiltDBApi.findAll(
      req.query,
      globalAccess,
      { countOnly: true, currentUser },
    );

    res.status(200).send(payload);
  }),
);

/**
 *  @swagger
 *  /api/modelos_bim_asbuilt/autocomplete:
 *    get:
 *      security:
 *        - bearerAuth: []
 *      tags: [Modelos_bim_asbuilt]
 *      summary: Find all modelos_bim_asbuilt that match search criteria
 *      description: Find all modelos_bim_asbuilt that match search criteria
 *      responses:
 *        200:
 *          description: Modelos_bim_asbuilt list successfully received
 *          content:
 *            application/json:
 *              schema:
 *                type: array
 *                items:
 *                  $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *        401:
 *          $ref: "#/components/responses/UnauthorizedError"
 *        404:
 *          description: Data not found
 *        500:
 *          description: Some server error
 */
router.get('/autocomplete', async (req, res) => {
  const globalAccess = req.currentUser.app_role.globalAccess;

  const organizationId = req.currentUser.organization?.id;

  const payload = await Modelos_bim_asbuiltDBApi.findAllAutocomplete(
    req.query.query,
    req.query.limit,
    req.query.offset,
    globalAccess,
    organizationId,
  );

  res.status(200).send(payload);
});

/**
 * @swagger
 *  /api/modelos_bim_asbuilt/{id}:
 *    get:
 *      security:
 *        - bearerAuth: []
 *      tags: [Modelos_bim_asbuilt]
 *      summary: Get selected item
 *      description: Get selected item
 *      parameters:
 *        - in: path
 *          name: id
 *          description: ID of item to get
 *          required: true
 *          schema:
 *            type: string
 *      responses:
 *        200:
 *          description: Selected item successfully received
 *          content:
 *            application/json:
 *              schema:
 *                $ref: "#/components/schemas/Modelos_bim_asbuilt"
 *        400:
 *          description: Invalid ID supplied
 *        401:
 *          $ref: "#/components/responses/UnauthorizedError"
 *        404:
 *          description: Item not found
 *        500:
 *          description: Some server error
 */
router.get(
  '/:id',
  wrapAsync(async (req, res) => {
    const payload = await Modelos_bim_asbuiltDBApi.findBy({
      id: req.params.id,
    });

    res.status(200).send(payload);
  }),
);

router.use('/', require('../helpers').commonErrorHandler);

module.exports = router;
