<?php
/**
 * @package Unlimited Elements
 * @author unlimited-elements.com
 * @copyright (C) 2021 Unlimited Elements, All Rights Reserved. 
 * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 * */
if ( ! defined( 'ABSPATH' ) ) exit;


	class UniteCssParserUC{
		
		private $cssContent;
		
		public function __construct(){
			
		}
		
		/**
		 * 
		 * init the parser, set css content
		 */
		public function initContent($cssContent){
			$this->cssContent = $cssContent;
		}		
		
		
		/**
		 * 
		 * get array of slide classes, between two sections.
		 */
		public function getArrClasses($startText = "",$endText=""){
			
			$content = $this->cssContent;
			
			//trim from top
			if(!empty($startText)){
				$posStart = strpos($content, $startText);
				if($posStart !== false)
					$content = substr($content, $posStart,strlen($content)-$posStart);
			}
			
			//trim from bottom
			if(!empty($endText)){
				$posEnd = strpos($content, $endText);
				if($posEnd !== false)
					$content = substr($content,0,$posEnd);
			}
			
			//get styles
			$lines = explode("\n",$content);
			$arrClasses = array();
			foreach($lines as $key=>$line){
				$line = trim($line);
				
				if(strpos($line, "{") === false)
					continue;

				//skip unnessasary links
				if(strpos($line, ".caption a") !== false)
					continue;
					
				if(strpos($line, ".tp-caption a") !== false)
					continue;
					
				//get style out of the line
				$class = str_replace("{", "", $line);
				$class = trim($class);
				
				//skip captions like this: .tp-caption.imageclass img
				if(strpos($class," ") !== false)
					continue;
				
				//skip captions like this: .tp-caption.imageclass:hover, :before, :after
				if(strpos($class,":") !== false)
					continue;
				
				$class = str_replace(".caption.", ".", $class);
				$class = str_replace(".tp-caption.", ".", $class);
				
				$class = str_replace(".", "", $class);
				$class = trim($class);
				$arrWords = explode(" ", $class);
				$class = $arrWords[count($arrWords)-1];
				$class = trim($class);
				
				$arrClasses[] = $class;	
			}
			
			sort($arrClasses);
			
			return($arrClasses);
		}
		
		public static function parseCssToArray($css){
			
			while(strpos($css, '/*') !== false){
				if(strpos($css, '*/') === false) return false;
				$start = strpos($css, '/*');
				$end = strpos($css, '*/') + 2;
				$css = str_replace(substr($css, $start, $end - $start), '', $css);
			}
			
			preg_match_all( '/(?ims)([a-z0-9\s\.\:#_\-@]+)\{([^\}]*)\}/', $css, $arr);

			$result = array();
			foreach ($arr[0] as $i => $x){
				$selector = trim($arr[1][$i]);
				if(strpos($selector, '{') !== false || strpos($selector, '}') !== false) return false;
				$rules = explode(';', trim($arr[2][$i]));
				$result[$selector] = array();
				foreach ($rules as $strRule){
					if (!empty($strRule)){
						$rule = explode(":", $strRule);
						if(strpos($rule[0], '{') !== false || strpos($rule[0], '}') !== false || strpos($rule[1], '{') !== false || strpos($rule[1], '}') !== false) return false;
						
						//put back everything but not $rule[0];
						$key = trim($rule[0]);
						unset($rule[0]);
						$values = implode(':', $rule);
						
						$result[$selector][trim($key)] = trim(str_replace("'", '"', $values));
					}
				}
			}   
			return($result);
		}
		
		public static function parseDbArrayToCss($cssArray, $nl = "\n\r"){
						
			$css = '';
			foreach($cssArray as $id => $attr){
								
				$params = $attr['params'];
				
				$styles = json_decode($params);
				
				if(empty($styles))
					$styles = json_decode($params);

				if(!empty($styles))
					$styles = (array)$styles;
				
				$css.= $attr['handle']." {".$nl;
				if(is_array($styles)){
					foreach($styles as $name => $style){
						$css.= $name.':'.$style.";".$nl;
					}
				}
				$css.= "}".$nl.$nl;
								
				//add hover
				$setting = json_decode($attr['settings'], true);
				if(@$setting['hover'] == 'true'){
					$hover = json_decode($attr['hover'], true);
					if(is_array($hover)){
						$css.= $attr['handle'].":hover {".$nl;
						foreach($hover as $name => $style){
							$css.= $name.':'.$style.";".$nl;
						}
						$css.= "}".$nl.$nl;
					}
				}
			}
			return $css;
		}
		
		public static function parseArrayToCss($cssArray, $nl = "\n\r"){
			$css = '';
			foreach($cssArray as $id => $attr){
				$styles = (array)$attr['params'];
				$css.= $attr['handle']." {".$nl;
				if(is_array($styles) && !empty($styles)){
					foreach($styles as $name => $style){
						if($name == 'background-color' && strpos($style, 'rgba') !== false){ //rgb && rgba
							$rgb = explode(',', str_replace('rgba', 'rgb', $style));
							unset($rgb[count($rgb)-1]);
							$rgb = implode(',', $rgb).')';
							$css.= $name.':'.$rgb.";".$nl;
						}
						$css.= $name.':'.$style.";".$nl;
					}
				}
				$css.= "}".$nl.$nl;
				
				//add hover
				$setting = (array)$attr['settings'];
				if(@$setting['hover'] == 'true'){
					$hover = (array)$attr['hover'];
					if(is_array($hover)){
						$css.= $attr['handle'].":hover {".$nl;
						foreach($hover as $name => $style){
							if($name == 'background-color' && strpos($style, 'rgba') !== false){ //rgb && rgba
								$rgb = explode(',', str_replace('rgba', 'rgb', $style));
								unset($rgb[count($rgb)-1]);
								$rgb = implode(',', $rgb).')';
								$css.= $name.':'.$rgb.";".$nl;
							}
							$css.= $name.':'.$style.";".$nl;
						}
						$css.= "}".$nl.$nl;
					}
				}
			}
			return $css;
		}
		
		
		public static function parseStaticArrayToCss($cssArray, $nl = "\n"){
			$css = '';
			foreach($cssArray as $class => $styles){
				$css.= $class." {".$nl;
				if(is_array($styles) && !empty($styles)){
					foreach($styles as $name => $style){
						$css.= $name.':'.$style.";".$nl;
					}
				}
				$css.= "}".$nl.$nl;
			}
			return $css;
		}
		
		public static function parseDbArrayToArray($cssArray, $handle = false){
			
			if(!is_array($cssArray) || empty($cssArray)) return false;
			
			foreach($cssArray as $key => $css){
				if($handle != false){
					if($cssArray[$key]['handle'] == '.tp-caption.'.$handle){
						$cssArray[$key]['params'] = json_decode($css['params']);
						$cssArray[$key]['hover'] = json_decode($css['hover']);
						$cssArray[$key]['settings'] = json_decode($css['settings']);
						return $cssArray[$key];
					}else{
						unset($cssArray[$key]);
					}
				}else{
					$cssArray[$key]['params'] = json_decode($css['params']);
					$cssArray[$key]['hover'] = json_decode($css['hover']);
					$cssArray[$key]['settings'] = json_decode($css['settings']);
				}
			}

			
			return $cssArray;
		}
		
		
		public static function compress_css($buffer){
			/* remove comments */
			$buffer = preg_replace("!/\*[^*]*\*+([^/][^*]*\*+)*/!", "", $buffer) ;
			/* remove tabs, spaces, newlines, etc. */
			$arr = array("\r\n", "\r", "\n", "\t", "  ", "    ", "    ");
			$rep = array("", "", "", "", " ", " ", " ");
			$buffer = str_replace($arr, $rep, $buffer);
			/* remove whitespaces around {}:, */
			$buffer = preg_replace("/\s*([\{\}:,])\s*/", "$1", $buffer);
			/* remove last ; */
			$buffer = str_replace(';}', "}", $buffer);
		
			return $buffer;
		}
		
		
	}
