import { ServerRoute } from '@hapi/hapi'
import { PlanHandler } from '../handlers/plan.handler'
import { options } from "../validators/global.validator.schema"
import { Common } from "../../utils/common"
import {
    planResponse,
    planRequest,
    planIdentifier,
    planStringIdentifier,
    planListRequest,
    planListResponse,
    planListAllRequest,
    planListAllResponse,
    planSortOrderRequest,
    updatePlanRequest,
    priceRequest,
    pricePlanIdentifier,
    StatusRequest,
    planAdminListRequest
} from "../validators/plan.validator"
const planHandler = new PlanHandler();
import { I18N } from '../../utils/i18n';
import { error400, error401, error403, error404, error500, confirmationOnly } from "../validators/global.validator.schema"
const routes: ServerRoute[] = [
    {
        method: 'POST',
        path: '/plan',
        handler: planHandler.create,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('CREATE_PLAN_DESCRIPTION'),
            notes: I18N.t('CREATE_PLAN_NOTE'),
            auth: { strategies: ['jwt'], scope: ['admin', 'managePlans'] },
            plugins: { 'hapi-swagger': { order: 1 } },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: planRequest,
            },
            response: {
                status: {
                    201: planResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
        {
        method: 'PATCH',
        path: '/plan/{id}',
        handler: planHandler.update,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('UPDATE_PLAN_DESCRIPTION'),
            notes: I18N.t('UPDATE_PLAN_NOTE'),
            plugins: { 'hapi-swagger': { order: 2 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePlans'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: updatePlanRequest,
                // payload: planRequest,
                params: planIdentifier
            },
            response: {
                status: {
                    200: planResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/plan/{id}',
        handler: planHandler.getById,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('GET_PLAN_BY_ID_DESCRIPTION'),
            notes: I18N.t('GET_PLAN_BY_ID_NOTE'),
            plugins: { 'hapi-swagger': { order: 3 } },
            auth: { strategies: ['jwt'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: planIdentifier
            },
            response: {
                status: {
                    200: planResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/plan/{code}/byCode',
        handler: planHandler.getByCode,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('GET_PLAN_BY_CODE_DESCRIPTION'),
            notes: I18N.t('GET_PLAN_BY_CODE_NOTE'),
            plugins: { 'hapi-swagger': { order: 4 } },
            auth: { strategies: ['jwt'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: planStringIdentifier
            },
            response: {
                status: {
                    200: planResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'DELETE',
        path: '/plan/{id}',
        handler: planHandler.delete,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('DELETE_PLAN_DESCRIPTION'),
            notes: I18N.t('DELETE_PLAN_NOTE'),
            plugins: { 'hapi-swagger': { order: 5 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePlans'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: planIdentifier
            },
            response: {
                status: {
                    200: planResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/plan/list',
        handler: planHandler.list,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('LIST_PLAN_DESCRIPTION'),
            notes: I18N.t('LIST_PLAN_NOTE'),
            plugins: { 'hapi-swagger': { order: 6 } },
            auth: { strategies: ['jwt'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                query: planAdminListRequest
            },
            response: {
                status: {
                    200: planListResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/plans',
        handler: planHandler.listPlan,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('LIST_PLAN_DESCRIPTION'),
            notes: I18N.t('LIST_PLAN_NOTE'),
            plugins: { 'hapi-swagger': { order: 6 } },
            auth: { strategies: ['jwt'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                query: planListRequest
            },
            response: {
                status: {
                    200: planListResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/plan/listAll',
        handler: planHandler.listAll,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('LIST_ALL_PLAN_DESCRIPTION'),
            notes: I18N.t('LIST_ALL_PLAN_NOTE'),
            plugins: { 'hapi-swagger': { order: 7 } },
            auth: { strategies: ['jwt'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                query: planListAllRequest
            },
            response: {
                status: {
                    200: planListAllResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'GET',
        path: '/plan/{id}/listRevisions',
        handler: planHandler.listRevisions,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('LIST_PLAN_REVISIONS_DESCRIPTION'),
            notes: I18N.t('LIST_PLAN_REVISIONS_NOTE'),
            plugins: { 'hapi-swagger': { order: 8 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePlans'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: planIdentifier,
                query: planListRequest
            },
            response: {
                status: {
                    200: planListResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'POST',
        path: '/plan/{id}/restoreRevision',
        handler: planHandler.restoreRevision,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('RESTORE_PLAN_REVISION'),
            notes: I18N.t('RESTORE_PLAN_REVISION_NOTE'),
            plugins: { 'hapi-swagger': { order: 9 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePlans'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: planIdentifier
            },
            response: {
                status: {
                    200: planResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'PATCH',
        path: '/plan/{id}/sortOrder',
        handler: planHandler.setSortOrder,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('PLAN_SORT_ORDER_DESCRIPTION'),
            notes: I18N.t('PLAN_SORT_ORDER_NOTE'),
            plugins: { 'hapi-swagger': { order: 10 } },
            auth: { strategies: ['jwt'], scope: ['admin', 'managePlans'] },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                params: planIdentifier,
                payload: planSortOrderRequest
            },
            response: {
                status: {
                    200: confirmationOnly,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'POST',
        path: '/plan/{id}/price',
        handler: planHandler.createPrice,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('CREATE_PLAN_DESCRIPTION'),
            notes: I18N.t('CREATE_PLAN_NOTE'),
            auth: { strategies: ['jwt'], scope: ['admin', 'managePlans'] },
            plugins: { 'hapi-swagger': { order: 11 } },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: priceRequest,
                params: planIdentifier,
            },
            response: {
                status: {
                    201: planResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'PATCH',
        path: '/plan/{id}/status',
        handler: planHandler.updateStatus,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('CREATE_PLAN_DESCRIPTION'),
            notes: I18N.t('CREATE_PLAN_NOTE'),
            auth: { strategies: ['jwt'], scope: ['admin', 'managePlans'] },
            plugins: { 'hapi-swagger': { order: 12 } },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: StatusRequest,
                params: planIdentifier,
            },
            response: {
                status: {
                    201: planResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
    {
        method: 'PATCH',
        path: '/plan/{id}/price/{priceId}/status',
        handler: planHandler.updateStatus,
        options: {
            tags: ['api', 'Plans'],
            description: I18N.t('CREATE_PLAN_DESCRIPTION'),
            notes: I18N.t('CREATE_PLAN_NOTE'),
            auth: { strategies: ['jwt'], scope: ['admin', 'managePlans'] },
            plugins: { 'hapi-swagger': { order: 13 } },
            validate: {
                headers: Common.routeHeaders("authorized"),
                options: options,
                failAction: Common.failover,
                payload: StatusRequest,
                params: pricePlanIdentifier,
            },
            response: {
                status: {
                    201: planResponse,
                    400: error400,
                    401: error401,
                    403: error403,
                    404: error404,
                    500: error500
                }
            }
        },
    },
]
export default routes