import { ServerRoute } from '@hapi/hapi'
import { PromotionHandler } from '../handlers/promotion.handler'
import { options } from "../validators/global.validator.schema"
import { Common } from "../../utils/common"
import {
    promotionResponse,
    promotionRequest,
    promotionIdentifier,
    promotionStringIdentifier,
    promotionListRequest,
    promotionListResponse,
    promotionListAllRequest,
    promotionListAllResponse,
    promotionSortOrderRequest,
    updatePromotionRequest,
    promotionTypes,
    promotionStatusRequest,
    promotionActiveListRequest
} from "../validators/promotion.validator"
const promotionHandler = new PromotionHandler();
import { I18N } from '../../utils/i18n';
import { error400, error401, error403, error404, error500, confirmationOnly } from "../validators/global.validator.schema"
const routes: ServerRoute[] = [
    {
        method: 'POST',
        path: '/promotion',
        handler: promotionHandler.create,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('CREATE_PROMOTIONS_DESCRIPTION'),
            notes: I18N.t('CREATE_PROMOTIONS_NOTE'),
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            plugins: { 'hapi-swagger': { order: 1 } },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: promotionRequest,
            },
            response: {
                status: {
                    201: promotionResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'PATCH',
        path: '/promotion/{id}',
        handler: promotionHandler.update,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('UPDATE_PROMOTIONS_DESCRIPTION'),
            notes: I18N.t('UPDATE_PROMOTIONS_NOTE'),
            plugins: { 'hapi-swagger': { order: 2 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: updatePromotionRequest,
                params: promotionIdentifier
            },
            response: {
                status: {
                    200: promotionResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/promotion/{id}',
        handler: promotionHandler.getById,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('GET_PROMOTIONS_BY_ID_DESCRIPTION'),
            notes: I18N.t('GET_PROMOTIONS_BY_ID_NOTE'),
            plugins: { 'hapi-swagger': { order: 3 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: promotionIdentifier
            },
            response: {
                status: {
                    200: promotionResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/promotion/{code}/byCode',
        handler: promotionHandler.getByCode,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('GET_PROMOTIONS_BY_CODE_DESCRIPTION'),
            notes: I18N.t('GET_PROMOTIONS_BY_CODE_NOTE'),
            plugins: { 'hapi-swagger': { order: 4 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: promotionStringIdentifier
            },
            response: {
                status: {
                    200: promotionResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'DELETE',
        path: '/promotion/{id}',
        handler: promotionHandler.delete,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('DELETE_PROMOTIONS_DESCRIPTION'),
            notes: I18N.t('DELETE_PROMOTIONS_NOTE'),
            plugins: { 'hapi-swagger': { order: 5 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: promotionIdentifier
            },
            response: {
                status: {
                    200: promotionResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/promotion/{type}/list',
        handler: promotionHandler.list,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('LIST_PROMOTIONS_DESCRIPTION'),
            notes: I18N.t('LIST_PROMOTIONS_NOTE'),
            plugins: { 'hapi-swagger': { order: 6 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: promotionTypes,
                query: promotionListRequest
            },
            response: {
                status: {
                    200: promotionListResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/promotion/{type}/listAll',
        handler: promotionHandler.listAll,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('LIST_ALL_PROMOTIONS_DESCRIPTION'),
            notes: I18N.t('LIST_ALL_PROMOTIONS_NOTE'),
            plugins: { 'hapi-swagger': { order: 7 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: promotionTypes,
                query: promotionListAllRequest
            },
            response: {
                status: {
                    200: promotionListAllResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/promotion/{id}/listRevisions',
        handler: promotionHandler.listRevisions,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('LIST_PROMOTIONS_REVISIONS_DESCRIPTION'),
            notes: I18N.t('LIST_PROMOTIONS_REVISIONS_NOTE'),
            plugins: { 'hapi-swagger': { order: 8 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: promotionIdentifier,
                query: promotionListRequest
            },
            response: {
                status: {
                    200: promotionListResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'POST',
        path: '/promotion/{id}/restoreRevision',
        handler: promotionHandler.restoreRevision,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('RESTORE_PROMOTIONS_REVISION'),
            notes: I18N.t('RESTORE_PROMOTIONS_REVISION_NOTE'),
            plugins: { 'hapi-swagger': { order: 9 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: promotionIdentifier
            },
            response: {
                status: {
                    200: promotionResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'PATCH',
        path: '/promotion/{id}/sortOrder',
        handler: promotionHandler.setSortOrder,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('PROMOTIONS_SORT_ORDER_DESCRIPTION'),
            notes: I18N.t('PROMOTIONS_SORT_ORDER_NOTE'),
            plugins: { 'hapi-swagger': { order: 10 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: promotionIdentifier,
                payload: promotionSortOrderRequest
            },
            response: {
                status: {
                    200: confirmationOnly,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/promotions/{type}',
        handler: promotionHandler.getUserPromotions,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('GET_ACTIVE_USER_PROMOTIONS'),
            notes: I18N.t('GET_ACTIVE_USER_PROMOTIONS_NOTE'),
            plugins: { 'hapi-swagger': { order: 11 } },
            auth: { strategies: ['jwt'], mode: 'optional' },
            validate: {
                headers: Common.routeHeaders("optionalauthorized"),
                options: options,
                failAction: Common.failover,
                params: promotionTypes,
                query: promotionActiveListRequest
            },
            response: {
                status: {
                    200: promotionListResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'PATCH',
        path: '/promotion/{id}/status',
        handler: promotionHandler.updateStatus,
        options: {
            tags: ['api', 'Promotions'],
            description: I18N.t('PROMOTION_STATUS_UPDATE_DESCRIPTION'),
            notes: I18N.t('PROMOTION_STATUS_UPDATE_NOTE'),
            plugins: { 'hapi-swagger': { order: 12 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePromotions'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: promotionIdentifier,
                payload: promotionStatusRequest
            },
            response: {
                status: {
                    200: promotionResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
]
export default routes