'use strict';

const boom = require('@hapi/boom');
const joi = require('joi');
const schema = require('screwdriver-data-schema');

const isAdminPlugin = {
    name: 'isAdmin',
    async register(server) {
        server.route({
            method: 'GET',
            path: '/isAdmin',
            options: {
                description: 'Check if a user is admin of a pipeline, event, or job',
                notes: 'Returns true or false',
                tags: ['api'],
                auth: {
                    strategies: ['token'],
                    scope: ['user']
                },
                plugins: {
                    'hapi-swagger': {
                        security: [{ token: [] }]
                    }
                },
                handler: async (request, h) =>
                    Promise.resolve()
                        .then(() => {
                            const { pipelineId, eventId, jobId } = request.query;

                            if (eventId) {
                                const { eventFactory } = request.server.app;

                                return eventFactory.get(eventId).then(e => e.pipelineId);
                            }
                            if (jobId) {
                                const { jobFactory } = request.server.app;

                                return jobFactory.get(jobId).then(j => j.pipelineId);
                            }

                            return pipelineId;
                        })
                        .then(pid => {
                            const { pipelineFactory } = request.server.app;
                            const { userFactory } = request.server.app;
                            const { username } = request.auth.credentials;
                            const { scmContext } = request.auth.credentials;

                            return Promise.all([
                                pipelineFactory.get(pid),
                                userFactory.get({ username, scmContext })
                            ]).then(([pipeline, user]) => {
                                if (!pipeline) {
                                    throw boom.notFound(`Pipeline ${pid} does not exist`);
                                }

                                // ask the user for permissions on this repo
                                return user
                                    .getPermissions(pipeline.scmUri)
                                    .then(permissions => h.response(permissions.admin));
                            });
                        })
                        .catch(err => {
                            throw err;
                        }),
                validate: {
                    query: joi
                        .object()
                        .keys({
                            pipelineId: schema.models.pipeline.base.extract('id'),
                            eventId: schema.models.event.base.extract('id'),
                            jobId: schema.models.job.base.extract('id')
                        })
                        .max(1)
                        .min(1)
                }
            }
        });
    }
};

module.exports = isAdminPlugin;