import ApiRequest from "@services/Api.Service";
import * as Yup from "yup";
import { ApiError } from "@core/Models/Server.Error.model";
import { UploadFileResponse, UploadPostFileParams } from "@core/Models/Files.model";

const schemaUploadFile = Yup.object().shape({
    file: Yup.mixed<File>()
        .required("Debe seleccionar un archivo.")
        .test("fileSize", "El archivo es demasiado grande (máx 5 MB).", (value) => {
            return value && value.size <= 5 * 1024 * 1024; // 5 MB
        })
        .test("fileType", "Tipo de archivo no permitido.", (value) => {
            return (
                value && ["image/png", "image/jpeg", "image/webp", "image/gif"].includes(value.type)
            );
        }),
    token: Yup.string().required("Para subir un archivo debe iniciar sesión."),
    companyId: Yup.string().required("No es posible deteriminar la organización."),
    sessionUser: Yup.string().required("Para crear un descuento debe iniciar sesión."),
});

export const uploadPostFile: (data: UploadPostFileParams) => Promise<UploadFileResponse> = async (
    data
) => {
    let yupErrors: Yup.ValidationError = new Yup.ValidationError("");

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

    if (!(await validateData())) {
        throw new ApiError(400, yupErrors.message);
    }

    const form = new FormData();
    form.append("file", data.file);
    form.append("sessionUser", data.sessionUser);
    form.append("token", data.token);
    form.append("companyId", data.companyId);

    return ApiRequest.postFile<UploadFileResponse>("files/upload-post-file", form);
};
