<?php
/**
 * Разработал Максим Руденко
 * email: rudenko.programmer@gmail.com
 * Дата: 11.07.2018
 */

namespace common\models\bbapi;


use common\models\CT_Helpers;
use http\Exception\InvalidArgumentException;

class UtcObject {
	public $id;
	public $candidateId;
	public $clientId;
	public $status;
	public $air;
	public $earth;
	public $fire;
	public $water;
	public $skills;
	public $passions;

	public $is_water;
	public $is_air;
	public $is_earth;
	public $is_fire;

	public $radar_water;
	public $radar_air;
	public $radar_earth;
	public $radar_fire;

	public $profile_passions;
	public $profile_skills_ec;
	public $profile_skills_pc;

	const RadarMaxValue = 90;


	/**
	 * @param $json
	 *
	 * @return \common\models\bbapi\UtcObject|\Exception|\http\Exception\InvalidArgumentException
	 */
	public static function initFromJSON($json){
		try{
			/** @var \common\models\bbapi\UtcObject $utc_object */
			$utc_object = CT_Helpers::recast('common\models\bbapi\UtcObject', json_decode($json));
			$utc_object->reinitDriversValue();
			$utc_object->matchPrimaryDriver();
			$utc_object->getProfilePassions();
			$utc_object->getProfileSkills();


			return $utc_object;
		}catch(InvalidArgumentException $e){
			return $e;
		}
	}

	/**
	 *
	 */
	public function reinitDriversValue(){
		$this->water = $this->water > 1 ? $this->water:$this->water*100;
		$this->earth = $this->earth > 1 ? $this->earth:$this->earth*100;
		$this->air   = $this->air > 1 ? $this->air:$this->air*100;
		$this->fire  = $this->fire > 1 ? $this->fire:$this->fire*100;
	}

	/**
	 *
	 */
	public function matchPrimaryDriver(){
		$max_value = max($this->water, $this->earth, $this->air, $this->fire);
		$this->is_water = $this->water == $max_value;
		$this->is_earth = $this->earth == $max_value;
		$this->is_air   = $this->air   == $max_value;
		$this->is_fire  = $this->fire  == $max_value;
	}

	public function initRadarData($radar_width){
		$delta = (double)$radar_width / $this::RadarMaxValue;

		$this->radar_earth  = ($this->earth > $this::RadarMaxValue? $this::RadarMaxValue : $this->earth) * $delta;
		$this->radar_water = ($this->water > $this::RadarMaxValue? $this::RadarMaxValue : $this->water) * $delta;
		$this->radar_air   = ($this->air > $this::RadarMaxValue? $this::RadarMaxValue : $this->air) * $delta;
		$this->radar_fire  = ($this->fire > $this::RadarMaxValue? $this::RadarMaxValue : $this->fire) * $delta;
	}

	public function getProfilePassions(){
		if(is_array($this->passions) && count($this->passions) == 0) $this->profile_passions = [];

		$passions = [];

		foreach ($this->passions as $passion){
			if((int)$passion->profileIndex > 0){
				$passions[] = $passion->description;
			}
		}

		$this->profile_passions = $passions;
	}

	public function getProfileSkills(){
		if(is_array($this->skills) && count($this->skills) == 0) {
			$this->profile_skills_ec = [];
			$this->profile_skills_pc = [];
		}

		$skills_ec = [];
		$skills_pc = [];

		foreach ($this->skills as $skill){
			if((int)$skill->profileIndex > 0){
				if(strpos($skill->skill, 'PC') == 0){
					$skills_pc[(int)$skill->profileIndex] = $skill->description;
				}
				if(strpos($skill->skill, 'EC') == 0){
					$skills_ec[(int)$skill->profileIndex] = $skill->description;
				}
			}
		}

		$this->profile_skills_ec = array_values($skills_ec);
		$this->profile_skills_pc = array_values($skills_pc);
	}

}