"use strict";
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useViewForm = void 0;
var react_1 = require("react");
var is_promise_1 = __importDefault(require("is-promise"));
var use_immer_1 = require("use-immer");
var utils_service_1 = require("../../services/utils.service");
var index_1 = require("../useView/index");
function useViewForm(_a) {
    var id = _a.id, resolveGet = _a.resolveGet, resolveCreate = _a.resolveCreate, resolveUpdate = _a.resolveUpdate, onErrorValidate = _a.onErrorValidate, onSuccess = _a.onSuccess, onFailed = _a.onFailed, yupValidateSchema = _a.yupValidateSchema, onValidateFormData = _a.onValidateFormData, handleFormData = _a.handleFormData, _b = _a.resolves, resolves = _b === void 0 ? {} : _b, _c = _a.firstLoad, firstLoad = _c === void 0 ? true : _c;
    var resolvesForm = __assign({}, resolves);
    if (id)
        resolvesForm.resource = resolveGet;
    var _d = index_1.useView({
        resolves: resolvesForm,
        firstLoad: firstLoad,
    }), statusInfo = _d.statusInfo, setStatusInfo = _d.setStatusInfo, registerOnInit = _d.registerOnInit, registerOnInitError = _d.registerOnInitError, getParamsResolve = _d.getParamsResolve, registerResolveParams = _d.registerResolveParams, $destroy = _d.$destroy, reloadPage = _d.reloadPage;
    var formRef = react_1.useRef();
    var _e = use_immer_1.useImmer({}), resource = _e[0], setResource = _e[1];
    react_1.useLayoutEffect(function () {
        setStatusInfo({
            saving: false,
            notFound: false,
        });
    }, []);
    registerResolveParams('resource', function () { return id; });
    registerOnInit(function (res) {
        if (res.resource) {
            setResource(function (draft) { return res.resource; });
        }
    });
    function validateFormData(data) {
        return __awaiter(this, void 0, void 0, function () {
            var valid, _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        valid = true;
                        if (!yupValidateSchema) return [3, 3];
                        _a = valid;
                        if (!_a) return [3, 2];
                        return [4, utils_service_1.setErrorUnFormWithYup(formRef, data, yupValidateSchema)];
                    case 1:
                        _a = (_b.sent());
                        _b.label = 2;
                    case 2:
                        valid = _a;
                        _b.label = 3;
                    case 3:
                        if (onValidateFormData) {
                            valid = valid && onValidateFormData(data);
                        }
                        return [2, valid];
                }
            });
        });
    }
    function onSubmitForm(data) {
        return __awaiter(this, void 0, void 0, function () {
            var newData;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        newData = data;
                        if (!handleFormData) return [3, 3];
                        if (!is_promise_1.default(handleFormData(data))) return [3, 2];
                        return [4, handleFormData(data)];
                    case 1:
                        newData = _a.sent();
                        return [3, 3];
                    case 2:
                        newData = handleFormData(data);
                        _a.label = 3;
                    case 3: return [4, validateFormData(newData)];
                    case 4:
                        if (!(_a.sent())) {
                            if (onErrorValidate)
                                onErrorValidate();
                            return [2];
                        }
                        setStatusInfo({
                            saving: true,
                        });
                        if (!id) {
                            if (resolveCreate) {
                                resolveCreate(newData).subscribe(function (response) {
                                    setStatusInfo({
                                        saving: false,
                                    });
                                    if (onSuccess)
                                        onSuccess(true, response);
                                }, function (err) {
                                    setStatusInfo({
                                        saving: false,
                                    });
                                    if (onFailed)
                                        onFailed(true, err);
                                });
                            }
                            else {
                                setStatusInfo({
                                    saving: false,
                                });
                            }
                        }
                        else if (resolveUpdate) {
                            resolveUpdate(newData).subscribe(function (response) {
                                setStatusInfo({
                                    saving: false,
                                });
                                if (onSuccess)
                                    onSuccess(false, response);
                            }, function (err) {
                                setStatusInfo({
                                    saving: false,
                                });
                                if (onFailed)
                                    onFailed(false, err);
                            });
                        }
                        else {
                            setStatusInfo({
                                saving: false,
                            });
                        }
                        return [2];
                }
            });
        });
    }
    function submit() {
        formRef.current.submitForm();
    }
    return __assign(__assign({}, statusInfo), { statusInfo: statusInfo,
        setStatusInfo: setStatusInfo,
        registerOnInit: registerOnInit,
        registerOnInitError: registerOnInitError,
        getParamsResolve: getParamsResolve,
        registerResolveParams: registerResolveParams,
        $destroy: $destroy,
        reloadPage: reloadPage,
        resource: resource,
        formRef: formRef,
        onSubmitForm: onSubmitForm,
        submit: submit });
}
exports.useViewForm = useViewForm;
//# sourceMappingURL=useViewForm.js.map