<?php

namespace App\Services;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Container\ContainerInterface;
use App\Model\Session;
use App\Model\Call;
use App\Model\CallList;
use App\Modules\FSAPI\DuplicatSessionException;

class ApiService
{
    private $server;
    private $request;
    
    public function __construct($data)
    {
        $this->server = $data['server'];
        $this->request = curl_init();
        curl_setopt($this->request, CURLOPT_PORT, 9001);
        curl_setopt($this->request, CURLOPT_HEADER, 0);
        curl_setopt($this->request, CURLOPT_NOBODY, 0);
        curl_setopt($this->request, CURLOPT_RETURNTRANSFER, true); // Return, do not echo result 
        curl_setopt($this->request, CURLOPT_HTTPHEADER, array("Accept: application/json"));
    }

    function __destruct() {
	if($this->request){
	    curl_close($this->request);
	}
    }

    public function system($data){
	/* $data = ['name' => $filename, 'number' => $number]; */
        $url = "/system/";
        $result = $this->post($url, $data);
        echo var_dump($result);
        return $result;
    }
    
    public function status(){
	$url = "/api/v1/status";
	$status = $this->get($url);
	return $status;
    }

    public function config(){
	$url = "/api/v1/config";
	$status = $this->get($url);
	return $status;
    }

    public function set_config($data){
	$url = "/api/v1/config";
	$status = $this->post($url, $data);
	return $status;
    }

    public function session(){
	$url = "/api/v1/session";
	$session = $this->get($url);
	$sessions = [];

    if($session){
	foreach($session['data'] as $s){
	    $s1 = new Session($s['name']);
	    $s1->uuid = $s['uuid'];
	    $s1->status = $s['status'];
	    $s1->meta = $s['meta'];
	    $sessions[] = $s1;
	}
	return $sessions;
    } else {
        return [];
    }}

    public function session_update($uuid, $data){
	/* $url = "/api/v1/session/".str_replace('+','%20', urlencode($name)); */
	$url = "/api/v1/session/".$uuid;
	$session = $this->patch($url, $data);
	return $session;
    }

    public function session_info($uuid){
	/* $name = explode(" ", $name);
	   $name = implode("_", $name); */
	/* $url = "/api/v1/session/".str_replace('+','%20', urlencode($name)); */
	$url = "/api/v1/session/".$uuid;
	$session = $this->get($url);
	/* var_dump($session['data']); */
	$s = new Session($session['data'][0]['name']);
	$s->uuid = $session['data'][0]['uuid'];
	/* echo var_dump($session); */
	$s->setMedia($session['data'][0]['media']);
	$s->setAnonce($session['data'][0]['anonce']);
	$s->repeate = $session['data'][0]['repeate'];
	$s->parallel = $session['data'][0]['parallel'];
	$s->pause = $session['data'][0]['pause'];
	$s->status = $session['data'][0]['status'];
	$s->from_user = $session['data'][0]['number_from'];
	$s->number_for_record = $session['data'][0]['number_for_record'];
	$s->pattern = $session['data'][0]['pattern'];
	$s->meta = $session['data'][0]['meta'];
	$s->createTime = $session['data'][0]['time'][0];
	$s->startTime = $session['data'][0]['time'][1];
	$s->compliteTime = $session['data'][0]['time'][2];
	foreach($session['data'][0]['done'] as $n => $d){
	    $call = new Call($n, $d[0]);
	    $call->cancel_time = $d[4];
	    $call->attempt = intval($d[2]);
	    $call->wait = intval($d[3]);
	    $call->meta = $d[1];
	    $s->setCall($call);
	}
	return $s;
    }

    public function create_session($data){
	/* $data = ['name' => $filename, 'number' => $number]; */
	$url = "/api/v1/session";
	$session = $this->post($url, $data);
	/* echo var_dump($session); */
	if(isset($session['error'])){
	    throw new DuplicatSessionException("сессия с таким " .
					       $data['name'] .
					       " названием уже существует", 200);
	}
	return $session;
    }

    public function start_session($uuid){
	/* $data = ['name' => $filename, 'number' => $number]; */
	/* $url = "/api/v1/session/$name"; */
	/* $url = "/api/v1/session/".str_replace('+','%20', urlencode($name)); */
	$url = "/api/v1/session/".$uuid;
	$session = $this->put($url, []);
	return $session;
    }

    public function restart_session($uuid, $data){
	/* $data = ['name' => $filename, 'number' => $number]; */
	/* $url = "/api/v1/session/$name"; */
	/* $url = "/api/v1/session/".str_replace('+','%20', urlencode($name)); */
	$url = "/api/v1/session/".$uuid;
	$session = $this->put($url, $data);
	return $session;
    }

    public function stop_session($uuid){
	/* $data = ['name' => $filename, 'number' => $number]; */
	/* $url = "/api/v1/session/$name"; */
	/* $url = "/api/v1/session/".str_replace('+','%20', urlencode($name)); */
	$url = "/api/v1/session/".$uuid;
	$res = $this->delete($url);
	return $res;
    }
    
    public function record($filename, $number, $from){
	$data = ['name' => $filename,
		 'number' => $number,
		 'from_user' => $from,
		 'anonce' => "anonce_record.wav",
		 'actions' => [
		     ["sleep" => "1500"],
		     ['play'=> "anonce_record"],
		     ['tone' => ""],
		     ["record" => $filename],
		     ["sleep" => "30000"]]];
	$url = "/api/v1/call";
	$session = $this->post($url, $data);
	return $session;
    }

    public function test_call($data){
	$url = "/api/v1/call";
	$this->post($url, $data);
	return json_decode("start test call", true);
    }
    
    private function get($url){
	$url = "http://".$this->server.$url;
	curl_setopt($this->request, CURLOPT_URL, $url);
	$res = curl_exec($this->request);
	return json_decode($res, true);
    }

    private function post($url, $data){
	$url = "http://".$this->server.$url;
	$payload = json_encode($data);
	curl_setopt( $this->request, CURLOPT_POSTFIELDS, $payload );
	curl_setopt( $this->request, CURLOPT_HTTPHEADER,
		     array('Content-Type:application/json'));
	curl_setopt($this->request, CURLOPT_URL, $url);
	$res = curl_exec($this->request);
	return json_decode($res, true);
    }

    private function put($url, $data){
	$url = "http://".$this->server.$url;
	$payload = json_encode($data);
	curl_setopt( $this->request, CURLOPT_POSTFIELDS, $payload );
	curl_setopt( $this->request, CURLOPT_HTTPHEADER,
		     array('Content-Type:application/json'));
	curl_setopt($this->request, CURLOPT_CUSTOMREQUEST, "PUT");
	curl_setopt($this->request, CURLOPT_URL, $url);
	$res = curl_exec($this->request);
	return json_decode($res, true);
    }

    private function patch($url, $data){
	$url = "http://".$this->server.$url;
	$payload = json_encode($data);
	curl_setopt( $this->request, CURLOPT_POSTFIELDS, $payload );
	curl_setopt( $this->request, CURLOPT_HTTPHEADER,
		     array('Content-Type:application/json'));
	curl_setopt($this->request, CURLOPT_CUSTOMREQUEST, "PATCH");
	curl_setopt($this->request, CURLOPT_URL, $url);
	$res = curl_exec($this->request);
	return json_decode($res, true);
    }

    private function delete($url){
	$url = "http://".$this->server.$url;
	// $payload = json_encode($data);
	// curl_setopt( $this->request, CURLOPT_POSTFIELDS, $payload );
	// curl_setopt( $this->request, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
	curl_setopt($this->request, CURLOPT_CUSTOMREQUEST, "DELETE");
	curl_setopt($this->request, CURLOPT_URL, $url);
	$res = curl_exec($this->request);
	return $res;
    }

    
}
