<?php
/**
 * Used to store custom data for membership levels.
 */

 class SwpmMembershipLevelCustom {
    private static $instances = array();
    private $level_id;
    private $fields;
    private function __construct() {
        $this->fields = array();
    }
    public static function get_instance_by_id($level_id){
        if (!isset(self::$instances[$level_id])){
            self::$instances[$level_id] = new SwpmMembershipLevelCustom();
            self::$instances[$level_id]->level_id = $level_id;
            self::$instances[$level_id]->load_by_id($level_id);
        }
        return self::$instances[$level_id];
    }
    public function load_by_id($level_id){
        global $wpdb;
        $query = 'SELECT * FROM ' . $wpdb->prefix . 'swpm_membership_meta_tbl WHERE level_id=%d';
        $results = $wpdb->get_results($wpdb->prepare($query, $level_id), ARRAY_A);
        foreach($results as $result){
            $this->fields[$result['meta_key']] = $result;
        }
    }
    public function set($item){
        $meta_key = preg_replace('|[^A-Z0-9_]|i', '', $item['meta_key']);
        $new = array(
            'meta_key'=>$meta_key,
            'level_id'=>$this->level_id,
            'meta_label'=> isset($item['meta_label'])?$item['meta_label']:'',
            'meta_value'=>$item['meta_value'],
            'meta_type'=> isset($item['meta_type'])?$item['meta_type']:'text',
            'meta_default'=> isset($item['meta_default'])?$item['meta_default']:'',
            'meta_context'=> $item['meta_context'],
            );
        if (isset($this->fields[$meta_key])){
            $new['id'] = $this->fields[$meta_key]['id'];
            $this->fields[$meta_key] = $new;
        }
        else{
            $this->fields[$meta_key] = $new;
        }
        $this->save($this->fields[$meta_key]);
        return $this;
    }
    public function get($meta_key, $default=''){
        $meta_key = preg_replace('|[^A-Z0-9_]|i', '', $meta_key);
        if (isset($this->fields[$meta_key])){
            return maybe_unserialize($this->fields[$meta_key]['meta_value']);

        }
        return $default;
    }
    public function get_by_context($context){
        $result = array();
        foreach ($this->fields as $key=>$field){
            if ($field['meta_context'] == $context){
                $result[$key] = $field;
            }
        }
        return $result;
    }
    private function save($field){
        global $wpdb;
        if (!isset($field['meta_key'])){return;} // cannot continue without key field.
        $meta_key = preg_replace('|[^A-Z0-9_]|i', '', $field['meta_key']);
        $query = $wpdb->prepare(
                'REPLACE INTO ' . $wpdb->prefix. 'swpm_membership_meta_tbl
                (level_id, meta_key, meta_label, meta_value, meta_type, meta_default, meta_context)
                VALUES(%d, %s, %s, %s, %s, %s, %s); ',
                $this->level_id,
                $meta_key,
                isset($field['meta_label'])? sanitize_text_field($field['meta_label']): '',
                isset($field['meta_value'])? sanitize_text_field($field['meta_value']): '',
                'text', // at the moment we have only one type
                '',
                isset($field['meta_context'])? sanitize_text_field($field['meta_context']): 'default'
                );

        $wpdb->query($query);
    }
    public static function get_value_by_key($level_id, $key, $default= ''){
        return SwpmMembershipLevelCustom::get_instance_by_id($level_id)->get($key, $default);
    }
    public static  function get_value_by_context($level_id, $context){
        return SwpmMembershipLevelCustom::get_instance_by_id($level_id)->get_by_context($context);
    }
}
