#include "jsoncdaccord.h"
#include "internal.h"
#include "optional.h"

int _jdac_check_contains_and_minmaxcontains(json_object *jobj, json_object *jschema) {
    int err;

    json_object *jcontains = json_object_object_get(jschema, "contains");
    if (!jcontains) {
        return JDAC_ERR_VALID;
    }

    if (!json_object_is_type(jcontains, json_type_object) && !json_object_is_type(jcontains, json_type_boolean)) {
        return JDAC_ERR_SCHEMA_ERROR;
    }

    int arraylen = json_object_array_length(jobj);

    int match_count = 0;
    for (int i = 0; i < arraylen; i++) {
        json_object *iobj = json_object_array_get_idx(jobj, i);
        err               = _jdac_validate_instance(iobj, jcontains);
        if (err == JDAC_ERR_VALID) {
            match_count++;
        } else if (err == JDAC_ERR_SCHEMA_ERROR) {
            return JDAC_ERR_SCHEMA_ERROR;
        }
    }

    json_object *jmaxcontains = json_object_object_get(jschema, "maxContains");
    if (jmaxcontains) {
        int max = json_object_get_int(jmaxcontains);
        if (match_count > max) {
            return JDAC_ERR_INVALID_CONTAINS;
        }
    }

    json_object *jmincontains = json_object_object_get(jschema, "minContains");
    if (jmincontains) {
        int min = json_object_get_int(jmincontains);
        if (min == 0) {
            return JDAC_ERR_VALID;
        } else if (match_count < min) {
            return JDAC_ERR_INVALID_CONTAINS;
        }
    }

    if (match_count == 0) {
        return JDAC_ERR_INVALID_CONTAINS;
    }

    return JDAC_ERR_VALID;
}