import { ServerRoute } from '@hapi/hapi'
import Joi from '@hapi/joi'
import { SettingHandler } from '../handlers/setting.handler'
import { options } from "../validators/global.validator.schema"
import { Common } from "../../utils/common"
import {
    settingResponse,
    settingRequest,
    settingIdentifier,
    settingStringIdentifier,
    settingListRequest,
    settingListResponse,
    settingListAllRequest,
    settingListAllResponse,
    categoryCodeIdentifier,
    settingSortOrderRequest,
    settingUpdateCategoryRequest
} from "../validators/setting.validator"
const settingHandler = new SettingHandler();
import { I18N } from '../../utils/i18n';
import { error400, error401, error403, error404, error500, confirmationOnly } from "../validators/global.validator.schema"
const routes: ServerRoute[] = [
    {
        method: 'POST',
        path: '/setting',
        handler: settingHandler.create,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('SETTING_DESCRIPTION'),
            notes: I18N.t('SETTING_NOTE'),
            auth: { strategies: ['jwt'], scope: ['admin', 'manageSettings'] },
            plugins: { 'hapi-swagger': { order: 1 } },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: settingRequest,
            },
            response: {
                status: {
                    201: settingResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'GET',
        path: '/setting/{id}',
        handler: settingHandler.getById,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('GET_SETTING_BY_ID_DESCRIPTION'),
            notes: I18N.t('GET_SETTING_BY_ID_NOTE'),
            plugins: { 'hapi-swagger': { order: 2 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageSettings'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: settingIdentifier
            },
            response: {
                status: {
                    200: settingResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'GET',
        path: '/setting/{code}/byCode',
        handler: settingHandler.getByCode,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('GET_SETTING_BY_CODE_DESCRIPTION'),
            notes: I18N.t('GET_SETTING_BY_CODE_NOTE'),
            plugins: { 'hapi-swagger': { order: 3 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageSettings'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: settingStringIdentifier
            },
            response: {
                status: {
                    200: settingResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'PATCH',
        path: '/setting/{id}',
        handler: settingHandler.update,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('UPDATE_SETTING_DESCRIPTION'),
            notes: I18N.t('UPDATE_SETTING_NOTE'),
            plugins: { 'hapi-swagger': { order: 4 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageSettings'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: settingRequest,
                params: settingIdentifier
            },
            response: {
                status: {
                    200: settingResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'PATCH',
        path: '/setting/updateCategorySettings',
        handler: settingHandler.updateCategorySettings,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('UPDATE_CATEGORY_SETTING_DESCRIPTION'),
            notes: I18N.t('UPDATE_CATEGORY_SETTING_NOTE'),
            plugins: { 'hapi-swagger': { order: 5 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageSettings'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: settingUpdateCategoryRequest
            },
            response: {
                status: {
                    200: settingListAllResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'DELETE',
        path: '/setting/{id}',
        handler: settingHandler.delete,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('DELETE_SETTING_DESCRIPTION'),
            notes: I18N.t('DELETE_SETTING_NOTE'),
            plugins: { 'hapi-swagger': { order: 6 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageSettings'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: settingIdentifier
            },
            response: {
                status: {
                    200: settingResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'GET',
        path: '/setting/{categoryCode}/list',
        handler: settingHandler.list,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('LIST_SETTING_DESCRIPTION'),
            notes: I18N.t('LIST_SETTING_NOTE'),
            plugins: { 'hapi-swagger': { order: 7 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageSettings'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: categoryCodeIdentifier,
                query: settingListRequest
            },
            response: {
                status: {
                    200: settingListResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'GET',
        path: '/setting/{categoryCode}/listAll',
        handler: settingHandler.listAll,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('LIST_ALL_SETTING_DESCRIPTION'),
            notes: I18N.t('LIST_ALL_SETTING_NOTE'),
            plugins: { 'hapi-swagger': { order: 8 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageSettings'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: categoryCodeIdentifier,
                query: settingListAllRequest
            },
            response: {
                status: {
                    200: settingListAllResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'GET',
        path: '/setting/{id}/listRevisions',
        handler: settingHandler.listRevisions,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('LIST_SETTING_REVISIONS_DESCRIPTION'),
            notes: I18N.t('LIST_SETTING_REVISIONS_NOTE'),
            plugins: { 'hapi-swagger': { order: 9 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageSettings'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: settingIdentifier,
                query: settingListRequest
            },
            response: {
                status: {
                    200: settingListResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'POST',
        path: '/setting/{id}/restoreRevision',
        handler: settingHandler.restoreRevision,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('RESTORE_SETTING_REVISION'),
            notes: I18N.t('RESTORE_SETTING_REVISION_NOTE'),
            plugins: { 'hapi-swagger': { order: 10 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageSettings'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: settingIdentifier
            },
            response: {
                status: {
                    200: settingResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'GET',
        path: '/setting/{categoryCode}/tree',
        handler: settingHandler.getSettingTree,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('LIST_SETTING_REVISIONS_DESCRIPTION'),
            notes: I18N.t('LIST_SETTING_REVISIONS_NOTE'),
            plugins: { 'hapi-swagger': { order: 11 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageCategories'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: categoryCodeIdentifier
            },
            response: {
                status: {
                    //200: settingTreeResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
    {
        method: 'PATCH',
        path: '/setting/{id}/sortOrder',
        handler: settingHandler.setSortOrder,
        options: {
            tags: ['api', 'Settings'],
            description: I18N.t('SETTING_SORT_ORDER_DESCRIPTION'),
            notes: I18N.t('SETTING_SORT_ORDER_NOTE'),
            plugins: { 'hapi-swagger': { order: 12 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'manageCategories'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: settingIdentifier,
                payload: settingSortOrderRequest
            },
            response: {
                status: {
                    200: confirmationOnly,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }

            }
        },
    },
]
export default routes