"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 __rest = (this && this.__rest) || function (s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
            t[p[i]] = s[p[i]];
    return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
var assign = require("lodash/assign");
var React = require("react");
var utils = require("../../utils");
var Input_1 = require("../Input");
var Textarea_1 = require("../Textarea");
exports.operators = {
    contains: {
        getLabel: function (_s) { return 'contains'; },
    },
    not_contains: {
        getLabel: function (_s) { return 'does not contain'; },
    },
};
exports.decodeFilter = function (filter) {
    var operator = filter.title;
    var value;
    var field;
    if (filter.properties) {
        var keys = Object.keys(filter.properties);
        if (!keys.length) {
            return null;
        }
        field = keys[0];
        if (operator === 'contains') {
            value = filter.properties[field].contains.const;
        }
        else {
            return null;
        }
    }
    else if (filter.anyOf) {
        if (filter.anyOf.length === 0 || !filter.anyOf[0].properties) {
            return null;
        }
        var keys = Object.keys(filter.anyOf[0].properties);
        if (!keys.length) {
            return null;
        }
        field = keys[0];
        if (operator === 'not_contains') {
            value = filter.anyOf[0].properties[field].not.contains.const;
        }
        else {
            return null;
        }
    }
    else {
        return null;
    }
    return {
        field: field,
        operator: operator,
        value: value,
    };
};
exports.createFilter = function (field, operator, value, schema) {
    var _a, _b, _c;
    var title = schema.title;
    var base = {
        $id: utils.randomString(),
        title: operator,
        description: (title || field) + " " + exports.operators[operator].getLabel(schema) + " " + value,
        type: 'object',
    };
    if (operator === 'contains') {
        return assign(base, {
            properties: (_a = {},
                _a[field] = {
                    type: 'array',
                    contains: {
                        const: value,
                    },
                },
                _a),
            required: [field],
        });
    }
    if (operator === 'not_contains') {
        return assign(base, {
            anyOf: [
                {
                    properties: (_b = {},
                        _b[field] = {
                            type: 'array',
                            not: {
                                contains: {
                                    const: value,
                                },
                            },
                        },
                        _b),
                },
                {
                    properties: (_c = {},
                        _c[field] = {
                            type: 'null',
                        },
                        _c),
                },
            ],
        });
    }
    return base;
};
exports.Edit = function (_a) {
    var onUpdate = _a.onUpdate, slim = _a.slim, props = __rest(_a, ["onUpdate", "slim"]);
    if (slim) {
        return (React.createElement(Input_1.default, __assign({ onChange: function (e) {
                return onUpdate(e.currentTarget.value);
            } }, props)));
    }
    return (React.createElement(Textarea_1.default, __assign({ onChange: function (e) {
            return onUpdate(e.currentTarget.value);
        } }, props)));
};
