<?php

namespace App\Classes\BBS\Server;

use App\Classes\BBS\Server as AbstractServer;
use App\Classes\Sock\SocketClient;

class Videotex extends AbstractServer
{
	protected const LOGKEY = 'BVS';

	/* CONSTS */

	public const PORT			= 516;

	protected function init(SocketClient $client)
	{
		define('ESC',   chr(27));
		define('CON',   chr(17)); // Cursor On
		define('COFF',  chr(20)); // Cursor Off
		define('HOME',  chr(30));
		define('LEFT',  chr(8));  // Move Cursor
		define('RIGHT', chr(9));  // Move Cursor
		define('DOWN',  chr(10)); // Move Cursor
		define('UP',    chr(11)); // Move Cursor
		define('CR',    chr(13));
		define('LF',    chr(10));
		define('CLS',   chr(12));
		define('HASH',  '_'); // Enter
		define('STAR',  '*'); // Star Entry
		define('SPACE',  ''); // Space

		// NOTE: This consts are effective output
		define('RESET',     '');
		define('RED',       ESC.'A');
		define('GREEN',     ESC.'B');
		define('YELLOW',    ESC.'C');
		define('BLUE',      ESC.'D');
		define('MAGENTA',   ESC.'E');
		define('CYAN',      ESC.'F');
		define('WHITE',     ESC.'G');
		define('NEWBG',     ESC.']');

		// Raw attributes - used when storing frames.
		define('R_RED',     chr(1));
		define('R_GREEN',   chr(2));
		define('R_YELLOW',  chr(3));
		define('R_BLUE',    chr(4));
		define('R_MAGENTA', chr(5));
		define('R_CYAN',    chr(6));
		define('R_WHITE',   chr(7));
		define('FLASH',     chr(8));

		define('KEY_DELETE',    chr(0x7f));
		define('KEY_LEFT',      chr(0x08));
		define('KEY_RIGHT',     chr(0x09));
		define('KEY_DOWN',      chr(0x0a));
		define('KEY_UP',        chr(0x0b));

		parent::init($client);
	}

	public function moveCursor($x,$y): string
	{
		// Take the shortest path.
		if ($y < 12) {
			return HOME.
				(($x < 21)
					? str_repeat(DOWN,$y-1).str_repeat(RIGHT,$x)
					: str_repeat(DOWN,$y).str_repeat(LEFT,40-$x));

		} else {
			return HOME.str_repeat(UP,24-$y+1).
				(($x < 21)
					? str_repeat(RIGHT,$x)
					: str_repeat(LEFT,40-$x));
		}
	}

	public function sendBaseline(string $text,bool $reposition=FALSE) {
		$this->client->send(HOME.UP.$text.
			($this->blp > $this->po->strlenv($text)
				? str_repeat(' ',$this->blp-$this->po->strlenv($text)).
				($reposition ? HOME.UP.str_repeat(RIGHT,$this->po->strlenv($text)) : '')
				: ''),
			static::TIMEOUT
		);

		$this->blp = $this->po->strlenv($text);
	}
}