import { Request, ResponseToolkit, ResponseObject } from '@hapi/hapi';
import { TestimonialService } from "../services/testimonial.service";
import { AppError } from "../../utils/errors";
import { Common } from "../../utils/common";

export class TestimonialHandler {
    private getServiceObject = async (request: Request) => {
        let variables = await Common.getVariables(request)
        return new TestimonialService(variables);
    }

    create = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let service = await this.getServiceObject(request);
            const payload = request.payload as testimonialRequest;
            let testimonial = await service.createTestimonial(payload);
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: testimonial }).code(201);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }

    update = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let service = await this.getServiceObject(request);
            const payload = request.payload as testimonialRequest;
            const { id } = request.params as TestimonialIdentifierObject;
            let testimonial = await service.updateTestimonial({ ...payload, id });
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: testimonial }).code(200);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }

    delete = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let service = await this.getServiceObject(request);
            const { id } = request.params as TestimonialIdentifierObject;
            let testimonial = await service.deleteTestimonial({ id });
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: testimonial }).code(200);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }

    getById = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let service = await this.getServiceObject(request);
            const { id } = request.params as TestimonialIdentifierObject;
            let testimonial = await service.getById({ id });
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: testimonial }).code(200);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }

    list = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let service = await this.getServiceObject(request);
            let listRequest = request.query as TestimonialListRequestObject;
            let result = await service.getTestimonials({ listRequest });
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: result }).code(200);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }

    listAll = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let service = await this.getServiceObject(request);
            let listRequest = request.query as TestimonialListAllRequestObject;
            let result = await service.getAllTestimonials({ listRequest });
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: result }).code(200);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }

    updateStatus = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let service = await this.getServiceObject(request);
            const { id } = request.params as TestimonialIdentifierObject;
            const { status } = request.payload as TestimonialStatusObject;
            let testimonial = await service.updateStatus({ id, status });
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: testimonial }).code(200);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }

    publicList = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let service = await this.getServiceObject(request);
            let listRequest = request.query as TestimonialListRequestObject;
            const status = 1;
            let result = await service.getTestimonials({ listRequest, status });
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: result }).code(200);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }
}
