import ApiRequest from "@services/Api.Service";
import {
    IClient,
    OrganizationClientsResults,
    CreateCustomClientParams,
    PaginateOrganizationClientsParams,
} from "@models/Clients.model";

import * as Yup from "yup";

const schemaClientAdd = Yup.object().shape({
    firstName: Yup.string().required("Debe introducir el nombre del cliente."),
    lastName: Yup.string().required("Debe introducir el apellido del cliente."),
    email: Yup.string().required().email("Debe introducir un E-mail valido."),
    phoneAreaCode: Yup.number()
        .required("Debe introducir el código de area.")
        .typeError("El código de área debe ser un número."),
    phoneNumber: Yup.number()
        .required("Debe introducir el número de teléfono.")
        .typeError("El número de teléfono debe ser un número."),
    sessionUser: Yup.string().required("Para crear una organización debe iniciar sesión."),
});

export const createClient = async (data: CreateCustomClientParams): Promise<IClient> => {
    let yupErrors: Yup.ValidationError = new Yup.ValidationError("");

    const validateData = async () => {
        try {
            await schemaClientAdd.validate(data, { abortEarly: true });
            return true;
        } catch (error) {
            if (error instanceof Yup.ValidationError) {
                yupErrors = error as Yup.ValidationError;
            }
            return false;
        }
    };

    if ((await validateData()) == false) {
        throw new Error(yupErrors.message);
    }

    return ApiRequest.post<IClient>("clients/create", data);
};

export const findClientsByOrganization = async (
    data: PaginateOrganizationClientsParams
): Promise<OrganizationClientsResults> => {
    return ApiRequest.post<OrganizationClientsResults>("clients/find", data);
};
