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

export class ContactUsHandler {
    // set the class variables
    private getContactUsServiceObject = async (request: Request) => {
        let variables = await Common.getVariables(request)
        let faqService = new ContactUsService(variables);
        return faqService;
    }
    // Handles the creation of a new faq
    create = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let contactUsService = await this.getContactUsServiceObject(request);
            let { name, email, subject, message, attachmentIds } = request.payload as ContactUsRequest;
            const createContactInput: ContactUsCreateServiceInput = { name, email, subject, message, attachmentIds: attachmentIds ?? null };
            let contactUs: ContactUsInterface = await contactUsService.createContact(createContactInput);
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: contactUs }).code(201);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }

    // // get faq by id
    getById = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let contactUsService = await this.getContactUsServiceObject(request);
            const { id } = request.params as ContactUsIdentifierObject;
            const getContactByIdInput: ContactUsGetByIdServiceInput = { id };
            let faq: ContactUsInterface = await contactUsService.getById(getContactByIdInput);
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: faq }).code(200);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }

    // list faqs with filter
    list = async (request: Request, h: ResponseToolkit): Promise<ResponseObject> => {
        try {
            let contactUsService = await this.getContactUsServiceObject(request);
            let listRequest = request.query as ContactUsListRequestObject;
            const listContactUsInput: ContactUsListServiceInput = { listRequest };
            let faqs: ContactUsPaginatedList = await contactUsService.list(listContactUsInput);
            return h.response({ message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: faqs }).code(200);
        } catch (err) {
            if (err instanceof AppError) { throw err; }
            throw new AppError(500, 'SOMETHING_WENT_WRONG_IN_SERVICE', err);
        }
    }
}
