import ApiRequest from "@services/Api.Service";
import { ApiVoidResult } from "@models/Api.VoidResult.type";
import * as Yup from "yup";
import { SignUpParams } from "@models/User.model";
import { ApiError } from "@models/Server.Error.model";

const schemaSignUpUser = Yup.object().shape({
    firstName: Yup.string().required("El nombre es obligatorio."),
    lastName: Yup.string().required("El apellido es obligatorio."),
    email: Yup.string()
        .required("El E-mail es obligatorio.")
        .email("Debe introducir un E-mail valido."),
    password: Yup.string()
        .matches(/^[a-zA-Z0-9]+$/, "La contraseña debe contener caracteres alfanuméricos")
        .required("La contraseña es obligatoria.")
        .min(8, "La contraseña debe tener 8 caracteres como minimo."),
    phoneAreaCode: Yup.number()
        .required("Debe introducir el código de área.")
        .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."),
    phoneCountryCode: Yup.number().optional().typeError("El código de pais debe ser un número."),
});

export const signUp = async (data: SignUpParams): Promise<ApiVoidResult> => {
    return new Promise<ApiVoidResult>((resolve, reject) => {
        schemaSignUpUser
            .validate(data, { abortEarly: true })
            .then(() => {
                resolve(ApiRequest.post<ApiVoidResult>("users/signup", data));
            })
            .catch((error) => {
                reject(new ApiError(500, error.message));
            });
    });
};
