<?php
namespace MatthiasWeb\RealMediaLibrary\metadata;
use MatthiasWeb\RealMediaLibrary\general;
use MatthiasWeb\RealMediaLibrary\attachment;
use MatthiasWeb\RealMediaLibrary\api;
use MatthiasWeb\RealMediaLibrary\base;

defined( 'ABSPATH' ) or die( 'No script kiddies please!' );

/**
 * Create general functionality for the custom folder fields.
 * 
 * For an example see the function-doc of this::content_general and this::save_general
 */
class Meta extends base\Base implements api\IMetadata {
    
    private static $me = null;
    private $view = null;
    private $boxes = array();

    private function __construct() {
        // Add our folder meta table to wpdb
        global $wpdb;
        if (!isset($wpdb->realmedialibrary_meta)) {
            $wpdb->realmedialibrarymeta = general\Core::tableName("meta");
        }
        
        $this->view = attachment\Structure::getInstance()->getView();
    }
    
    public function content($content, $folder) {
        $type = $folder->getType();
        if ($type !== RML_TYPE_ROOT) {
            $content .= '<label>' . __('Path', RML_TD) . '</label>' . $folder->getPath(' > ') . '';
        }

        $content .= '<label>' . __('Folder type', RML_TD) . '</label>' . $folder->getTypeName() . ' <i>' . $folder->getTypeDescription() . '</i>';
        return $content;
    }
    
    public function save($response, $folder, $request) {
        return $response;
    }
    
    public function scripts($assets) {
        // Silence is golden.
    }
    
    public function prepare_content($fid) {
        $folder = null;
        $inputID = "all";
        $type = RML_TYPE_ALL;
        if (!empty($fid)) {
            $folder = wp_rml_get_object_by_id($fid);
            $inputID = $folder->getId();
            $type = $folder->getType();
            
            if ($folder === null) {
                return "404";
            }
        }
        
        /**
         * Add a tab group to the folder details or user settings dialog.
         * You cam use this function together with add_rml_meta_box()
         * or add_rml_user_settings_box(). Allowed $types: "User/Settings"|"Folder/Meta".
         * 
         * @param {array} $tabs The tabs with key (unique tab name) and value (display text)
         * @hook RML/$type/Groups
         * @return {array} The tabs
         * @since 3.3
         */
        $tabs = apply_filters("RML/" . ($type === RML_TYPE_ALL ? "User/Settings" : "Folder/Meta") . "/Groups", array(
            "general" => __("General", RML_TD)
        ));
        
        // Create content form
        $content = '<form method="POST" action="">
            <input type="hidden" name="folderId" value="' . $inputID . '" />
            <input type="hidden" name="folderType" value="' . $type . '" />
            <ul class="rml-meta-errors"></ul>';
        
        // Create groups
        foreach ($tabs as $key => $value) {
            $content .= '<h3>' . $value . '</h3>';
            $hookAddition = $key === "general" ? "" : "/" . $key;
            
            // Create group content
            if ($type === RML_TYPE_ALL) {
                /**
                 * Add content to the general settings. Do not use this filter directly instead use the 
                 * add_rml_user_settings_box() function!
                 * 
                 * @param {string} $content The HTML content
                 * @param {int} $user The current user id
                 * @hook RML/User/Settings/Content[/$tabGroup]
                 * @return {string} The HTML content
                 * @since 3.2
                 */
                $content .= apply_filters('RML/User/Settings/Content' . $hookAddition, "", get_current_user_id());
            }else{
                /**
                 * Add content to the folder metabox. Do not use this filter directly instead use the 
                 * add_rml_meta_box() function!
                 * 
                 * @param {string} $content The HTML content
                 * @param {IFolder} $folder The folder object
                 * @hook RML/Folder/Meta/Content[/$tabGroup]
                 * @return {string} The HTML content
                 * @since 3.3.1 $folder can never be null
                 */
                $content .= apply_filters('RML/Folder/Meta/Content' . $hookAddition, "", $folder);
            }
        }
        
        $content .= '</form>';
        return $content;
    }
    
    public function add($name, $instance) {
        if ($this->get($name) !== null) {
            return false;
        }else{
            $this->boxes[$name] = $instance;
            return true;
        }
    }
    
    public function get($name) {
        foreach ($this->boxes as $key => $value) {
            if ($key === $name) {
                return $value;
            }
        }
        return null;
    }
    
    public function exists($name) {
        return $this->get($name) !== null;
    }
    
    public function folder_deleted($fid, $oldData) {
        truncate_media_folder_meta($fid);
    }

    public static function getInstance() {
        if (self::$me == null) {
            self::$me = new Meta();
        }
        return self::$me;
    }
}