<?php

namespace ControlScripts\Scopes;

use \SHServ\Entities\Device;

class LightHubScope extends \SHServ\Middleware\ControlScripts implements \SHServ\Implements\ControlScriptsInterface {

	use \ControlScripts\Common;

	public function register_sync_map(): void {
		$this -> add_sync_connection([
			["type" => "relay", "alias" => "light_hub_1", "channel" => 1],
			["type" => "button", "alias" => "master_room_btns", "channel" => 0],
		]);
	}
	
	public function register_events_handlers(): void {
		$this -> btn_on_online("master_room_btns", [2, 3]);
		$this -> btn_on_online("btns_hall2_1", [1]);
		$this -> btns_click_handlers("master_room_btns");
		$this -> btns_click_handlers("btns_hall2_1");
	}

	public function register_actions_scripts(): void {
		$this -> add_action_script([
			"alias" => "master_room_lamp_switcher",
			"name" => "Осн. свет в спальне",
			"icon" => '<i class="ph ph-lightbulb"></i>',
			"description" => "Включить/выключить основной свет в спальне",
			"author" => "Eugene Sukhodolskiy"
		], function($params) {
			return $this -> lamp_switch("light_hub_1", 1);
		});

		$this -> add_action_script([
			"alias" => "hallway2_lamp_switcher",
			"name" => "Осн. свет в холе, эт2",
			"icon" => '<i class="ph ph-lightbulb"></i>',
			"description" => "Включить/выключить основной свет в холе на втором этаже",
			"author" => "Eugene Sukhodolskiy"
		], function($params) {
			return $this -> lamp_switch("light_hub_1", 2);
		});

		$this -> add_action_script([
			"alias" => "bathroom2_lamp_switcher",
			"name" => "Осн. свет в ванной 2",
			"icon" => '<i class="ph ph-lightbulb"></i>',
			"description" => "Включить/выключить основной свет в ванной комнате на верху",
			"author" => "Eugene Sukhodolskiy"
		], function($params) {
			return $this -> lamp_switch("light_hub_1", 3);
		});
	}

	public function register_regular_scripts(): void {
	}

	// ACTIONS
	
	protected function lamp_switch(String $relay_alias, int $channel): Array {
		$relay_api = $this -> devices() -> by_alias($relay_alias) -> device_api();

		$result = false;
		if($relay_api instanceof \SHServ\Tools\DeviceAPI\Relay) {
			$result = $relay_api -> toggle_channel($channel);
			$this -> helper() -> sync_relay_to_btns($this -> sync_map(), $relay_alias);
		}
		
		return [
			"result" => $result
		];
	}

	protected function btns_click_handlers($alias): void {
		$self = $this;
		$buttons = $this -> helper() -> prepare_sync_map_by_alias($this -> sync_map(), $alias);
		foreach($buttons as $btn_channel => $entry) { 
			if($entry[0]["type"] != "relay") {
				continue;
			}

			$relay_alias = $entry[0]["alias"];
			$relay_channel = $entry[0]["channel"];

			$this -> add_event_handler("button@{$alias}({$btn_channel}).press", function(Device $btns_block, Array $data) use ($self, $btn_channel, $relay_alias, $relay_channel) {
				$btns_block_api = $btns_block -> device_api();
				$relay_api = $this -> devices() -> by_alias($relay_alias) -> device_api();

				if($relay_api instanceof \SHServ\Tools\DeviceAPI\Relay and $btns_block_api instanceof \SHServ\Tools\DeviceAPI\Button) {
					$relay_api -> toggle_channel($relay_channel);
					$this -> helper() -> sync_relay_to_btns($this -> sync_map(), $relay_alias);
				}
			});
		}
	}
	
}
