import express from 'express';

/**
 * ScenariosController. API for the scenarios manager, граничен клас за комуникация с модула за игрови сценарии
 */
class ScenariosController{
    
    name = 'scenariosApi'
    route = '/api/scenario'

    /**
     * Initializes the ScenariosController plugin, инициализация
     * @param {App} app The application instance, апликация
     */
    init(app){
        const router = express.Router();
        const { scenario, am } = app;

        /**
         * API: PUT /api/scenario/ Create or update scenario, създаване/обновяване на игрови сценарий
         * @function createOrUpdate
         * @memberof ScenariosController
         */
        router.put('/', async (req, res)=>{
            try{
                let data = req.body;
                let action = data.id ? 'update' : 'create';
                let object = await scenario[action](req, data)
                res.json({status: 'OK', object});
                am.audit(req, `scenario-${action}`, object.id);
            }catch(err){
                console.error(err);
                res.status(500).json({status: 'ERR', err});
                am.audit(req, `scenario-alter-error`, req.body?.id, {q: req.body, e: err});
            }
        });

        /**
         * API: POST /api/scenario/ List scenarios by given criteria, търсене в игровите сценарии
         * @function list
         * @returns {Scenario[]}
         * @memberof ScenariosController
         */
        router.post('/', async (req, res)=>{
            let result = await scenario.list(req.body);
            res.json(result);
            am.audit(req, `scenario-list`, null, {q: req.body});
        })

        /**
         * API: GET /api/scenario/:id Retrieve scenario by ID, извличане на игрови сценарий
         * @function read
         * @param {string} id The id of the scenario, идентификатор
         * @returns {Scenario}
         * @memberof ScenariosController
         */
        router.get('/:id', async (req, res)=>{
            let object = await scenario.read(parseInt(req.params.id));
            res.json(object);
            am.audit(req, `scenario-read`, object.id);
        })

        /**
         * API: DELETE /api/scenario/:id Delete scenario by ID, изтриване на игрови сценарий
         * @function remove
         * @param {string} id The id of the scenario, идентификатор
         * @memberof ScenariosController
         */
        router.delete('/:id', async (req, res)=>{
            await scenario.remove(req.params.id);
            res.json({status: 'OK'});
            am.audit(req, `scenario-delete`, req.params.id);
        })

        app.webServer.xapp.use(this.route, router);
    }
}

export { ScenariosController }