<?php

/*
 *
 * Class: iapiQuery
 * 
 * Osnovna klasa za definiciju upita koji se salju API funkciji. 
 * Ne upotrebljava se direktno vec samo preko naslednika iapiQueryEnvelope.
 *  
 */ 

abstract class iapiQuery implements JsonSerializable  {

    public $JSONExcluded = ''; // lista svojstava koja se ne upisuju u JSON (razdvojeni zarezima BEZ RAZMAKA!!!)
    public $JSONIncluded = ''; // lista svojstava koja se upisuju u JSON (razdvoejeni zarezima BEZ RAZMAKA!!!). Ako j eprayno, upusuju se sva svojstva sem onih u $JSONExcluded 
    public $_class_name = '';  // univerzalni naziv klase - definisan je API-jem. Moze se razlikovati od stvarnog imena klase.
    
    
    public function __construct() {
      $this->_class_name = $this->getClassName();
    } 
    
    abstract public function getClassName(); // treba da vrati univerzalni naziv klase koji ce biti upisan u svojstvo $this->_class_name.  
	
    /*
    *   jsonSerialize()
    *
    *   Intervenise u postupku serijalizacije objekta: izbacuje prazna svojstva, iskljucena svojstva, sistemska svojstva ili prilagodjava formate podataka.
    *  
    */
    public function jsonSerialize() {
       
        $m_properties = get_object_vars($this);

        $m_result = [];
        
        $mForcedExcluded = 'JSONExcluded,JSONIncluded';
                
        $mExcludedProperties = strtolower($mForcedExcluded . ',' . $this->JSONExcluded);
        $mIncludedProperties = strtolower($this->JSONIncluded);
        
        foreach ($m_properties as $m_key => $m_value) {

            if (! $this->strContains (strtolower($m_key), $mExcludedProperties, ',')) {

                if (empty ($mIncludedProperties) || ($this->strContains (strtolower($m_key), $mIncludedProperties, ','))) {
/*
                    if (! empty ($m_value)) {
        
                        switch ($m_key) {
                            case 'data':
                                $m_value = trim (json_encode ($m_value), '\t\n\r\0');
                                if (strlen($m_value)<3) {
                                    unset ($m_value);
                                }
                                break;
                        }
                    } // ! empty
*/
                    if (! empty ($m_value)) {
                        $m_value_type = gettype($m_value);
                      
                        switch ($m_value_type) {
                          case 'object':

                            $m_result[$m_key] = $this->SerializeObject ($m_value);
                            break;
                            
                          default:
                            $m_result[$m_key] = $m_value;
                        }
                        
                    } // ! empty
                }; // if included
                
            }; // if excluded     
        };

      return $m_result;
    }
    
    private function SerializeObject($pObject) {

      $m_class_name = get_class ($pObject);

      switch ($m_class_name) {
        case ("DateTime"):
          //$m_result = $pObject->Format('Y-m-d HH:d:sP');
          $m_result = $pObject->Format('c');
          break;
        default:
          $m_result = $pObject;
          
      }    
      return $m_result;
    }
    
    /*
     * toString()
     * 
     * Vraca serijalizovan objekat
     * 
     */
    public function toString() {
        return trim (json_encode ($this, JSON_UNESCAPED_UNICODE), '\t\n\r\0');
    }
    
    /*
     * strContains ($pSearchStr, $pSearchedStr, $pDelimiter)
     * 
     * Vraca da li trazeni string postoji u datom stringu koristeci zadati delimiter
     * 
     */
    public function strContains ($pSearchStr, $pSearchedStr, $pDelimiter =',') {
       
        $mTemp = explode($pDelimiter, $pSearchedStr);
        $mItems = array_combine ($mTemp, $mTemp);
        
        $mResult = isset ($mItems[$pSearchStr]);

        return ($mResult); 
        
    }
    
    


}

?>