import { ServerRoute } from '@hapi/hapi';
import { LanguageHandler } from '../handlers/language.handler';
import { options, error400, error401, error403, error404, error500 } from "../validators/global.validator.schema";
import { Common } from "../../utils/common";
import {
    languageResponse,
    languageRequest,
    languageIdentifier,
    languageStringIdentifier,
    languageStatusRequest,
    languageEnablementRequest,
    languageListRequest,
    languageListAllRequest,
    languageListResponse,
    languageListAllResponse
} from "../validators/language.validator";
import { I18N } from '../../utils/i18n';

const languageHandler = new LanguageHandler();

const routes: ServerRoute[] = [
    {
        method: 'POST',
        path: '/language',
        handler: languageHandler.create,
        options: {
            tags: ['api', 'Language'],
            description: I18N.t('CREATE_LANGUAGE_DESCRIPTION'),
            notes: I18N.t('CREATE_LANGUAGE_NOTE'),
            plugins: { 'hapi-swagger': { order: 1 } },
            auth: { strategies: ['jwt'], scope: ['admin'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: languageRequest,
            },
            response: {
                status: {
                    201: languageResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/language/{id}',
        handler: languageHandler.getById,
        options: {
            tags: ['api', 'Language'],
            description: I18N.t('GET_LANGUAGE_BY_ID_DESCRIPTION'),
            notes: I18N.t('GET_LANGUAGE_BY_ID_NOTE'),
            plugins: { 'hapi-swagger': { order: 2 } },
            auth: { strategies: ['jwt'], scope: ['admin'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: languageIdentifier
            },
            response: {
                status: {
                    200: languageResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/language/{code}/byCode',
        handler: languageHandler.getByCode,
        options: {
            tags: ['api', 'Language'],
            description: I18N.t('GET_LANGUAGE_BY_CODE_DESCRIPTION'),
            notes: I18N.t('GET_LANGUAGE_BY_CODE_NOTE'),
            plugins: { 'hapi-swagger': { order: 3 } },
            auth: { strategies: ['jwt'], scope: ['admin'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: languageStringIdentifier
            },
            response: {
                status: {
                    200: languageResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'PATCH',
        path: '/language/{id}',
        handler: languageHandler.update,
        options: {
            tags: ['api', 'Language'],
            description: I18N.t('UPDATE_LANGUAGE_DESCRIPTION'),
            notes: I18N.t('UPDATE_LANGUAGE_NOTE'),
            plugins: { 'hapi-swagger': { order: 4 } },
            auth: { strategies: ['jwt'], scope: ['admin'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: languageRequest,
                params: languageIdentifier
            },
            response: {
                status: {
                    200: languageResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'PATCH',
        path: '/language/{id}/status',
        handler: languageHandler.updateStatus,
        options: {
            tags: ['api', 'Language'],
            description: I18N.t('UPDATE_LANGUAGE_STATUS_DESCRIPTION'),
            notes: I18N.t('UPDATE_LANGUAGE_STATUS_NOTE'),
            plugins: { 'hapi-swagger': { order: 5 } },
            auth: { strategies: ['jwt'], scope: ['admin'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: languageStatusRequest,
                params: languageIdentifier
            },
            response: {
                status: {
                    200: languageResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'PATCH',
        path: '/language/{id}/enablement',
        handler: languageHandler.updateEnablement,
        options: {
            tags: ['api', 'Language'],
            description: I18N.t('UPDATE_LANGUAGE_ENABLEMENT_DESCRIPTION'),
            notes: I18N.t('UPDATE_LANGUAGE_ENABLEMENT_NOTE'),
            plugins: { 'hapi-swagger': { order: 6 } },
            auth: { strategies: ['jwt'], scope: ['admin'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: languageEnablementRequest,
                params: languageIdentifier
            },
            response: {
                status: {
                    200: languageResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'DELETE',
        path: '/language/{id}',
        handler: languageHandler.delete,
        options: {
            tags: ['api', 'Language'],
            description: I18N.t('DELETE_LANGUAGE_DESCRIPTION'),
            notes: I18N.t('DELETE_LANGUAGE_NOTE'),
            plugins: { 'hapi-swagger': { order: 7 } },
            auth: { strategies: ['jwt'], scope: ['admin'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: languageIdentifier
            },
            response: {
                status: {
                    200: languageResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/language/list',
        handler: languageHandler.list,
        options: {
            tags: ['api', 'Language'],
            description: I18N.t('LIST_LANGUAGE_DESCRIPTION'),
            notes: I18N.t('LIST_LANGUAGE_NOTE'),
            plugins: { 'hapi-swagger': { order: 8 } },
            auth: { strategies: ['jwt'], scope: ['admin'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                query: languageListRequest
            },
            response: {
                status: {
                    200: languageListResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/language/listAll',
        handler: languageHandler.listAll,
        options: {
            tags: ['api', 'Language'],
            description: I18N.t('LIST_ALL_LANGUAGE_DESCRIPTION'),
            notes: I18N.t('LIST_ALL_LANGUAGE_NOTE'),
            plugins: { 'hapi-swagger': { order: 9 } },
            auth: { strategies: ['jwt'], scope: ['admin'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                query: languageListAllRequest
            },
            response: {
                status: {
                    200: languageListAllResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    }
];

export default routes;
