<?php

acf_register_store('local-fields');
acf_register_store('local-groups');
acf_register_store('local-empty');
acf_enable_filter('local');
function acf_enable_local()
{
    acf_enable_filter('local');
}
function acf_disable_local()
{
    acf_disable_filter('local');
}
function acf_is_local_enabled()
{
    return acf_is_filter_enabled('local') && acf_get_setting('local');
}
function acf_get_local_store($name = '')
{
    if (acf_is_local_enabled()) {
        return acf_get_store("local-{$name}");
    } else {
        return acf_get_store('local-empty');
    }
}
function acf_reset_local()
{
    acf_get_local_store('fields')->reset();
    acf_get_local_store('groups')->reset();
}
function acf_get_local_field_groups()
{
    return acf_get_local_store('groups')->get();
}
function acf_have_local_field_groups()
{
    return acf_get_local_store('groups')->count() ? true : false;
}
function acf_count_local_field_groups()
{
    return acf_get_local_store('groups')->count();
}
function acf_add_local_field_group($field_group)
{
    $field_group = wp_parse_args($field_group, array('key' => '', 'title' => '', 'fields' => array(), 'local' => 'php'));
    if (!$field_group['key']) {
        $field_group['key'] = 'group_' . acf_slugify($field_group['title'], '_');
    }
    if (acf_is_local_field_group($field_group['key'])) {
        return false;
    }
    $field_group = acf_prepare_field_group_for_import($field_group);
    $fields = acf_extract_var($field_group, 'fields');
    acf_get_local_store('groups')->set($field_group['key'], $field_group);
    if ($fields) {
        acf_add_local_fields($fields);
    }
    return true;
}
function register_field_group($field_group)
{
    acf_add_local_field_group($field_group);
}
function acf_remove_local_field_group($key = '')
{
    return acf_get_local_store('groups')->remove($key);
}
function acf_is_local_field_group($key = '')
{
    return acf_get_local_store('groups')->has($key);
}
function acf_is_local_field_group_key($key = '')
{
    return acf_get_local_store('groups')->is($key);
}
function acf_get_local_field_group($key = '')
{
    return acf_get_local_store('groups')->get($key);
}
function acf_add_local_fields($fields = array())
{
    $fields = acf_prepare_fields_for_import($fields);
    foreach ($fields as $field) {
        acf_add_local_field($field, true);
    }
}
function acf_get_local_fields($parent = '')
{
    if ($parent) {
        return acf_get_local_store('fields')->query(array('parent' => $parent));
    } else {
        return acf_get_local_store('fields')->get();
    }
}
function acf_have_local_fields($parent = '')
{
    return acf_get_local_fields($parent) ? true : false;
}
function acf_count_local_fields($parent = '')
{
    return count(acf_get_local_fields($parent));
}
function acf_add_local_field($field, $prepared = false)
{
    $field = wp_parse_args($field, array('key' => '', 'name' => '', 'type' => '', 'parent' => ''));
    if (!$field['key']) {
        $field['key'] = 'field_' . $field['name'];
    }
    if (!$prepared) {
        return acf_add_local_fields(array($field));
    }
    $key = $field['key'];
    $name = $field['name'];
    $store = acf_get_local_store('fields');
    if ($store->is($key)) {
        $old_key = _acf_generate_local_key($store->get($key));
        $new_key = _acf_generate_local_key($field);
        if ($old_key !== $new_key) {
            $key = $new_key;
        }
    }
    $store->set($key, $field)->alias($key, $name);
}
function _acf_generate_local_key($field)
{
    return "{$field['key']}:{$field['parent']}";
}
function acf_remove_local_field($key = '')
{
    return acf_get_local_store('fields')->remove($key);
}
function acf_is_local_field($key = '')
{
    return acf_get_local_store('fields')->has($key);
}
function acf_is_local_field_key($key = '')
{
    return acf_get_local_store('fields')->is($key);
}
function acf_get_local_field($key = '')
{
    return acf_get_local_store('fields')->get($key);
}
function _acf_apply_get_local_field_groups($groups = array())
{
    $local = acf_get_local_field_groups();
    if ($local) {
        $map = wp_list_pluck($groups, 'key');
        foreach ($local as $group) {
            $i = array_search($group['key'], $map);
            if ($i !== false) {
                unset($group['ID']);
                $groups[$i] = array_merge($groups[$i], $group);
            } else {
                $groups[] = acf_get_field_group($group['key']);
            }
        }
        $groups = wp_list_sort($groups, array('menu_order' => 'ASC', 'title' => 'ASC'));
    }
    return $groups;
}
add_filter('acf/load_field_groups', '_acf_apply_get_local_field_groups', 20, 1);
function _acf_apply_is_local_field_key($bool, $id)
{
    return acf_is_local_field_key($id);
}
add_filter('acf/is_field_key', '_acf_apply_is_local_field_key', 20, 2);
function _acf_apply_is_local_field_group_key($bool, $id)
{
    return acf_is_local_field_group_key($id);
}
add_filter('acf/is_field_group_key', '_acf_apply_is_local_field_group_key', 20, 2);
function _acf_do_prepare_local_fields()
{
    $fields = acf_get_local_fields();
    if ($fields) {
        acf_add_local_fields($fields);
    }
}
add_action('acf/include_fields', '_acf_do_prepare_local_fields', 0, 1);