/**
 * @todo: documentation
 * Register a post connector
 * @param string $unique_name The slug for this connector
 * @param array $new_post_connector Args for this connector
 */
function simple_fields_register_post_connector($unique_name = "", $new_post_connector = array())
{
    #sf_d($new_post_connector);
    global $sf;
    $post_connectors = $sf->get_post_connectors();
    // Id of found or new connector
    $connector_id = NULL;
    // Id of highest connector, if no connector found for slug
    $highest_connector_id = 0;
    $is_new_connector = FALSE;
    // Check if connector already exist
    // or if it does not then get a new id for it
    foreach ($post_connectors as $oneConnector) {
        if ($oneConnector["slug"] == $unique_name && !empty($unique_name)) {
            // Connector already exists
            $connector_id = $oneConnector["id"];
            // No need to loop further once we found the connector
            break;
        } else {
            if (!isset($connector_id) && $oneConnector["id"] > $highest_connector_id) {
                // Connector not found so far and id of this connector is the highest so far
                $highest_connector_id = $oneConnector["id"];
            }
        }
    }
    // If no connector_id was found then this is a new connector
    // Set connector_id to the highest connector_id + 1
    if (!isset($connector_id) || !is_numeric($connector_id)) {
        $is_new_connector = TRUE;
        if (!empty($post_connectors[$highest_connector_id]) || $highest_connector_id > 0) {
            $highest_connector_id++;
        }
        $connector_id = $highest_connector_id;
        // If $connector_id is 0 here then it's the first ever created
        // But 0 is the id to tell SF to create new (in admin), so we must up it to 1
        if ($connector_id === 0) {
            $connector_id = 1;
        }
    }
    // Make sure connector has a slug
    if (empty($unique_name)) {
        $unique_name = "post_connector_" . $connector_id;
    }
    $unique_name = sanitize_key($unique_name);
    // Make sure name is not empty
    if (!isset($new_post_connector["name"]) || empty($new_post_connector["name"])) {
        $new_post_connector["name"] = $unique_name;
    }
    // Make sure post_types is an array (this allows for post_types to be a string)
    if (isset($new_post_connector["post_types"]) && !is_array($new_post_connector["post_types"])) {
        $new_post_connector["post_types"] = (array) $new_post_connector["post_types"];
    }
    // Setup defaults to merge to
    if ($is_new_connector) {
        // New connector, setup defaults
        $post_connector_defaults = array("id" => $connector_id, "key" => $unique_name, "slug" => $unique_name, "name" => $unique_name . "_" . $connector_id, "field_groups" => array(), "post_types" => array(), "deleted" => false, "hide_editor" => false, "added_with_code" => true);
    } else {
        // Existing connector, get old values
        $post_connector_defaults = $post_connectors[$connector_id];
        // make sure all values are set
        // added_with_code since 1.2.4
        if (!isset($post_connector_defaults["added_with_code"])) {
            $post_connector_defaults["added_with_code"] = true;
        }
    }
    // Create or update this connector_id id the array of existing connectors
    $post_connectors[$connector_id] = simple_fields_merge_arrays($post_connector_defaults, $new_post_connector);
    $post_connectors[$connector_id]['post_types'] = array_unique($post_connectors[$connector_id]['post_types']);
    // If field group passed as args is a non-empty array
    // This is where field groups get attached to this connector
    if (isset($new_post_connector["field_groups"]) && is_array($new_post_connector["field_groups"]) && !empty($new_post_connector["field_groups"])) {
        // Array with all field groups that this connector has
        $field_group_connectors = array();
        // Default values
        $field_group_connector_defaults = array("id" => "", "key" => "", "deleted" => 0, "context" => "normal", "priority" => "low");
        // For each field group that we want to connect to this connector
        foreach ($new_post_connector["field_groups"] as $field_group_options) {
            // Key is deprecated, use slug
            if (isset($field_group_options["key"]) && !empty($field_group_options["key"])) {
                $field_group_options["slug"] = $field_group_options["key"];
            } else {
                if (isset($field_group_options["slug"]) && !empty($field_group_options["slug"])) {
                    $field_group_options["key"] = $field_group_options["slug"];
                }
            }
            // Check if the field group we want to connect actually exists
            // First check by id, then if not found by slug - slug is prefered and the only options kinda supported...by me at least :)
            $found_field_group = NULL;
            $found_field_group = isset($field_group_options["id"]) ? $sf->get_field_group_by_slug($field_group_options["id"]) : NULL;
            $found_field_group = !isset($found_field_group) && isset($field_group_options["slug"]) ? $sf->get_field_group_by_slug($field_group_options["slug"]) : NULL;
            // Field group was found, so now add it to the connector
            if (isset($found_field_group)) {
                $field_group_id = $found_field_group["id"];
                $field_group_slug = $found_field_group["slug"];
                $field_group_name = $found_field_group["name"];
                // If field group is deleted or not
                // default_field_group_connector = a copy of new field group defaults or a copy of existing field group values
                $default_field_group_connector = NULL;
                if (isset($field_group_connectors[$field_group_id]) && !$field_group_connectors[$field_group_id]["deleted"]) {
                    // A little unsure on how when we get here
                    $default_field_group_connector = $field_group_connectors[$field_group_id];
                } else {
                    $default_field_group_connector = $field_group_connector_defaults;
                }
                // Add id from found field group
                // And slug + also key for backwards compatibility
                // And name
                $field_group_connectors[$field_group_id]["id"] = $field_group_id;
                $field_group_connectors[$field_group_id]["slug"] = $field_group_slug;
                $field_group_connectors[$field_group_id]["key"] = $field_group_slug;
                $field_group_connectors[$field_group_id]["name"] = $field_group_name;
                // Go through all default values and make sure field array has each of them set
                foreach ($default_field_group_connector as $oneGroupConnectorDefaultKey => $oneGroupConnectorDefaultValue) {
                    // Skip some keys, that are added always above
                    if (in_array($oneGroupConnectorDefaultKey, array("id", "slug", "name"))) {
                        continue;
                    }
                    // Ok, what happens here?
                    // field_group_options is one of the field groups what we want to connect to post connector, as send here by parameter (not as saved in db or such)
                    // field_group_connectors is array with all field groups that this connector will have
                    if (isset($field_group_options[$oneGroupConnectorDefaultKey])) {
                        // If the key from the defaults array did exist in the field group sent in to this function
                        // So use the value that we got as an parameter, overwriting the default value
                        $field_group_connectors[$field_group_id][$oneGroupConnectorDefaultKey] = $field_group_options[$oneGroupConnectorDefaultKey];
                    } else {
                        // Key from defaults array was not found in the field group sent to this function
                        // So use default value
                        $field_group_connectors[$field_group_id][$oneGroupConnectorDefaultKey] = $oneGroupConnectorDefaultValue;
                    }
                }
                // make sure all keys form default values exists
            }
            // if field group found
        }
        // foreach field group
        // Done adding field group
        $post_connectors[$connector_id]["field_groups"] = $field_group_connectors;
    }
    // if field groups was sent along as arg
    // Clear cache, store values, and return
    $sf->clear_caches();
    update_option("simple_fields_post_connectors", $post_connectors);
    return $sf->get_connector_by_id($connector_id);
}
/**
 * @todo: documentation
 */
function simple_fields_register_post_connector($unique_name = "", $new_post_connector = array())
{
    global $sf;
    $post_connectors = $sf->get_post_connectors();
    $highest_connector_id = 0;
    foreach ($post_connectors as $oneConnector) {
        if ($oneConnector["key"] == $unique_name && !empty($unique_name)) {
            // Connector already exists
            $connector_id = $oneConnector["id"];
        } else {
            if (!isset($connector_id) && $oneConnector["id"] > $highest_connector_id) {
                $highest_connector_id = $oneConnector["id"];
            }
        }
    }
    if (!isset($connector_id) || !is_numeric($connector_id)) {
        if (!empty($post_connectors[$highest_connector_id]) || $highest_connector_id > 0) {
            $highest_connector_id++;
        }
        $connector_id = $highest_connector_id;
    }
    // If $connector_id is 0 here then it's the first ever created
    // But 0 is the id to tell SF to create new, so we must up it to 1
    if ($connector_id === 0) {
        $connector_id = 1;
    }
    if (empty($unique_name)) {
        $unique_name = "post_connector_" . $connector_id;
    } else {
        if (!isset($new_post_connector["name"]) || empty($new_post_connector["name"])) {
            $new_post_connector["name"] = $unique_name;
        }
    }
    $unique_name = sanitize_key($unique_name);
    $post_connector_defaults = array("id" => $connector_id, "key" => $unique_name, "slug" => $unique_name, "name" => $unique_name . "_" . $connector_id, "field_groups" => array(), "post_types" => array(), "deleted" => false, "hide_editor" => false);
    if (isset($post_connectors[$connector_id])) {
        $post_connector_defaults = $post_connectors[$connector_id];
    }
    $post_connectors[$connector_id] = simple_fields_merge_arrays($post_connector_defaults, $new_post_connector);
    $post_connectors[$connector_id]['post_types'] = array_unique($post_connectors[$connector_id]['post_types']);
    if (isset($new_post_connector["field_groups"]) && is_array($new_post_connector["field_groups"]) && !empty($new_post_connector["field_groups"])) {
        $field_group_connectors = array();
        $field_groups = $sf->get_field_groups();
        $field_group_connector_defaults = array("id" => "", "key" => "", "slug" => "", "name" => "", "deleted" => 0, "context" => "normal", "priority" => "low");
        foreach ($new_post_connector["field_groups"] as $field_group_options) {
            $field_group_found = false;
            foreach ($field_groups as $oneGroup) {
                if (isset($oneGroup["id"]) && isset($field_group_options["id"]) && $oneGroup["id"] == $field_group_options["id"] || $oneGroup["key"] == $field_group_options["key"]) {
                    // Field group found
                    $field_group_found = true;
                    $field_group_id = $oneGroup["id"];
                    $field_group_key = $oneGroup["key"];
                }
            }
            if ($field_group_found !== false) {
                if (isset($field_group_connectors[$field_group_id]) && !$field_group_connectors[$field_group_id]["deleted"]) {
                    $default_field_group_connector = $field_group_connectors[$field_group_id];
                } else {
                    $default_field_group_connector = $field_group_connector_defaults;
                }
                foreach ($default_field_group_connector as $oneGroupConnectorDefaultKey => $oneGroupConnectorDefaultValue) {
                    if ($oneGroupConnectorDefaultKey == "id") {
                        $field_group_connectors[$field_group_id]["id"] = $field_group_id;
                    } else {
                        if ($oneGroupConnectorDefaultKey == "key") {
                            $field_group_connectors[$field_group_id]["key"] = $field_group_key;
                        } else {
                            if (isset($field_group_options[$oneGroupConnectorDefaultKey])) {
                                $field_group_connectors[$field_group_id][$oneGroupConnectorDefaultKey] = $field_group_options[$oneGroupConnectorDefaultKey];
                            } else {
                                $field_group_connectors[$field_group_id][$oneGroupConnectorDefaultKey] = $oneGroupConnectorDefaultValue;
                            }
                        }
                    }
                }
            }
        }
        $post_connectors[$connector_id]["field_groups"] = $field_group_connectors;
    }
    $sf->clear_caches();
    update_option("simple_fields_post_connectors", $post_connectors);
    return $post_connectors[$connector_id];
}