<?php

class OsMetaModel extends OsModel{
  var $id,
      $meta_key,
      $meta_value,
      $object_id,
      $created_at,
      $updated_at;

  protected static $encrypted_settings = array();

  function __construct($object_id = false){
    $this->nice_names = array();
    $this->object_id = $object_id;
    parent::__construct();
  }

  public function delete_by_key($meta_key, $object_id){
    if(!$object_id) return false;
    $meta_to_delete = $this->where(array('meta_key' => $meta_key, 'object_id' => $object_id))->get_results_as_models();
    if($meta_to_delete){
      foreach($meta_to_delete as $meta_obj){
        $meta_obj->delete();
      }
    }
    return true;
  }

  public function save_by_key($meta_key, $meta_value, $object_id = false){
    if(!$object_id) $object_id = $this->object_id;
    if(!$object_id) return false;
    $existing_meta = $this->where(array('meta_key' => $meta_key, 'object_id' => $object_id))->set_limit(1)->get_results_as_models();
    if($existing_meta){
      $existing_meta->meta_value = self::prepare_value($meta_key, $meta_value);
	  if (empty($existing_meta->meta_value)) {
		return $existing_meta->delete();
	  }
      return $existing_meta->save();
    }else{
      $new_meta = $this;
      $new_meta->object_id = $object_id;
      $new_meta->meta_key = $meta_key;
      $new_meta->meta_value = self::prepare_value($meta_key, $meta_value);
      return $new_meta->save();
    }
  }

  private static function prepare_value($meta_key, $meta_value){
    if(in_array($meta_key, self::$encrypted_settings)){
      $meta_value = OsEncryptHelper::encrypt_value($meta_value);
    }
    return $meta_value;
  }

  public function get_by_key($meta_key, $object_id = false, $default = false){
    if(!$object_id) $object_id = $this->object_id;
    if(!$object_id) return $default;
    $record = $this->where(array('meta_key' => $meta_key, 'object_id' => $object_id))->set_limit(1)->get_results_as_models();
    if($record){
      if(in_array($meta_key, self::$encrypted_settings)){
        return OsEncryptHelper::decrypt_value($record->meta_value);
      }else{
        return $record->meta_value;
      }
    }else{
      return $default;
    }
  }

  public function get_by_object_id($object_id = false, $default = []){
    if(!$object_id) $object_id = $this->object_id;
    if(!$object_id) return $default;
    $records = $this->where(array('object_id' => $object_id))->get_results();
    if($records){
      $metas = [];
      foreach($records as $record){
        $value = in_array($record->meta_key, self::$encrypted_settings) ? OsEncryptHelper::decrypt_value($record->meta_value) : $record->meta_value;
        $metas[$record->meta_key] = $value;
      }
      return $metas;
    }else{
      return $default;
    }
  }

  public function get_object_id_by_value($meta_key, $meta_value){
    if(!$meta_value || !$meta_key) return false;
    $record = $this->select('object_id')->where(array('meta_key' => $meta_key, 'meta_value' => $meta_value))->set_limit(1)->get_results_as_models();
    if($record){
      return $record->object_id;
    }else{
      return false;
    }
  }


  protected function allowed_params($role = 'admin'){
    $allowed_params = array('object_id',
                            'meta_key',
                            'meta_value');
    return $allowed_params;
  }
  
  protected function params_to_save($role = 'admin'){
    $params_to_save = array('object_id',
                            'meta_key',
                            'meta_value');
    return $params_to_save;
  }

  protected function properties_to_validate(){
    $validations = array(
      'object_id' => array('presence'),
      'meta_key' => array('presence'),
      'meta_value' => array('presence'),
    );
    return $validations;
  }
}