<?php

namespace App\Controllers;

use App\DAO\AgendamentoVoucherDAO;
use App\DAO\DAOResponse\DAOResponse;
use App\DAO\DAOResponse\DAOResponseInterface;
use App\Infra\K2web\K2web;
use App\Services\AgendamentoService;
use App\Services\ServiceResponse\ServiceResponse;
use App\Services\ServiceResponse\ServiceResponseInterface;
use App\Services\VoucherService;
use Exception;


class MedicinaCarinhoController extends BaseController
{

    public function consultaMedicinaCarinho()
    {

        $dados = $this->getDataPost();
        if(!isset($dados['id_pet'])){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Informe os dados corretos!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Informe o pet corretamente!"
                    ]
                ] );
        }
        if(!isset($dados['cpf'])){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Informe os dados corretos!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Informe o cpf corretamente!"
                    ]
                ] );
        }
        if(!isset($dados['numero_cartao'])){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Informe os dados corretos!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Informe o cartao corretamente!"
                    ]
                ] );
        }

        if($dados['numero_cartao'] != 'MCCVET100'){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Este cartão não é válido!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Este cartão não é válido!"
                    ]
                ] );
        }

        /*
        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => 'http://www.solucaogpa.com.br/ws/pessoa.php?cv_id=21&cpf=' . $dados['cpf'],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => '',
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => 'GET',
        ));
        $cartao = json_decode( curl_exec( $curl ), true );
        curl_close($curl);

        if(!isset($cartao['st_id'])){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Nenhum cartão medicina com carinho encontrado!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Nenhum cartão medicina com carinho encontrado!"
                    ]
                ] );
        }

        $dateString = $cartao['dt_validade_carteira_dependente'];
        $dateTimestamp = strtotime($dateString);
        $currentTimestamp = time();
        if($dateTimestamp < $currentTimestamp){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'O cartão que você apresentou não possui validade!',
                    'error' => [
                        'code' => 400,
                        'msg' => "O cartão que você apresentou não possui validade!"
                    ]
                ] );
        }

        $sql = <<<SQL
            select id from pet where cartao_medicina_carinho =  = :cartao: 
        SQL;

        $conn = db_connect();
        $result = $conn->query( $sql, ['cartao' => $cartao['st_id']] )->getResultArray();

        // VALIDA SE JA ESTA EM ALGUM PET
        if(count($result) == 0){
            $sql = <<<SQL
                update pet set cartao_medicina_carinho = :cartao_medicina_carinho:, ts_id = :st_id:, telemedicina = :telemedicina:
            SQL;
            $binds = [
                'cartao_medicina_carinho' => $dados['numero_cartao'],
                'st_id' => $cartao['st_id'],
                'telemedicina' => $cartao['ts_telemedicina'],
                ];

            $conn->query( $sql, $binds );
            $errors = $conn->error();

            if ($errors ['code'] != 0) {
                return $this->response->setStatusCode( 400 )
                    ->setJSON( [
                        'message' => 'Erro ao atualizar cartão de pet!',
                        'error' => [
                            'code' => 400,
                            'msg' => "Erro ao atualizar cartão de pet!"
                        ]
                    ] );
            }

        } elseif($sql[0]['id'] != $dados['id_pet']){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Este cartão já pertence a outro pet!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Este cartão já pertence a outro pet!"
                    ]
                ] );
        }

        return $this->response->setStatusCode( 200 )
            ->setJSON( [
                'message' => 'O cartão pertence ao pet informado!',
                'error' => [
                    'code' => 200,
                    'msg' => "O cartão pertence ao pet informado!"
                ]
            ] );
        */

        $conn = db_connect();
        $sql = <<<SQL
                update pet set cartao_medicina_carinho = :cartao_medicina_carinho:, ts_id = :st_id:, telemedicina = :telemedicina:
            SQL;
        $binds = [
            'cartao_medicina_carinho' => $dados['numero_cartao'],
            'st_id' => 0,
            'telemedicina' => 'S',
        ];

        $conn->query( $sql, $binds );
        $errors = $conn->error();

        if ($errors ['code'] != 0) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Erro ao atualizar cartão de pet!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Erro ao atualizar cartão de pet!"
                    ]
                ] );
        }else{
            return $this->response->setStatusCode( 200 )
                ->setJSON( [
                    'message' => 'O cartão pertence ao pet informado!',
                    'error' => [
                        'code' => 200,
                        'msg' => "O cartão pertence ao pet informado!"
                    ]
                ] );
        }

    }


    public function encerraSalaVideo()
    {

        $dados = $this->getDataPost();
        if(!isset($dados['id_agendamento'])){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Informe os dados corretos!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Informe o agendamento corretamente!"
                    ]
                ] );
        }
        if(!isset($dados['id_status'])){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Informe os dados corretos!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Informe o status corretamente!"
                    ]
                ] );
        }


        $conn = db_connect();

        $sql = <<<SQL
            select url_meeting, tipo_meeting, stream_name_meeting 
            from requisicao_sala_video 
            where requisicao_sala_video.id_requisicao_procedimento = 
            (select id_requisicao from agendamento where id = :id_agendamento:)
            SQL;
        $binds = [
            'id_agendamento' => $dados['id_agendamento']
        ];

        $salaConferencia = $conn->query( $sql, $binds )->getResultArray();


        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => 'https://televplay.eadmeeting.com/api/v2/Meeting/?url=' . $salaConferencia[0]['url_meeting'],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => '',
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => 'DELETE',
            CURLOPT_HTTPHEADER => array(
                'Authorization: OTRhNWQ3YjY1NzRmZDU0Y2I4OTY4NDRlMjk2NGQ4M2QwYTRlYjM3Yw==',
                'Cookie: PHPSESSID=ggci81fqqo35p40beum4fpg484'
            ),
        ));

        $response = curl_exec($curl);

        curl_close($curl);

            /*
            0 => "Pendente.",
            1 => "Sala Aberta.",
            2 => "Concluido.",
            3 => "Não Compareceu.",
            4 => "Desistência.",
            5 => "Tutor perdeu a conexão.",
            6 => "Instabilidade de conexão."
            */

        if (intval( $dados ['id_status'] ) >= 3) {
            $this->voucherSetUnsed( intval( $dados ['id_agendamento'] ) );
        }

        if($dados['id_status'] == 3 || $dados['id_status'] == 4 || $dados['id_status'] == 5 || $dados['id_status'] == 6 ){
            $mensagem = new K2web();
            $mensagem->enviarMensagem(6, $dados['id_agendamento']);
        }else{
            $mensagem = new K2web();
            $mensagem->enviarMensagem(5, $dados['id_agendamento']);
        }


        $sql = <<<SQL
            update requisicao_sala_video set available = :id_status: 
            where requisicao_sala_video.id_requisicao_procedimento = (select id_requisicao from agendamento where id = :id_agendamento:)
            SQL;
        $binds = [
            'id_agendamento' => $dados['id_agendamento'],
            'id_status' => $dados['id_status']
        ];

        $conn->query( $sql, $binds );
        $errors = $conn->error();

        if ($errors ['code'] != 0) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Erro ao encerrar a sala!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Erro ao encerrar a sala!"
                    ]
                ] );
        }else{
            return $this->response->setStatusCode( 200 )
                ->setJSON( [
                    'message' => 'Sucesso ao encerrar a sala!',
                    'error' => [
                        'code' => 200,
                        'msg' => "Sucesso ao encerrar a sala!"
                    ]
                ] );
        }

    }

    public function vinculaVoucherAtendimento()
    {

        $dados = $this->getDataPost();
        if(!isset($dados['id_agendamento'])){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Informe os dados corretos!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Informe o agendamento corretamente!"
                    ]
                ] );
        }
        if(!isset($dados['id_voucher'])){
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Informe os dados corretos!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Informe o voucher corretamente!"
                    ]
                ] );
        }

        $agendamento_voucher_dao = new AgendamentoVoucherDAO();
        $response_agendamento = $agendamento_voucher_dao->register( $dados['id_agendamento'], $dados['id_voucher'] );
        if ($response_agendamento->getStatus() != DAOResponseInterface::SUCESS) {
            return $this->response->setStatusCode( 400 )
                ->setJSON( [
                    'message' => 'Erro ao vincular voucher ao agendamento!',
                    'error' => [
                        'code' => 400,
                        'msg' => "Erro ao vincular voucher ao agendamento!"
                    ]
                ] );
        }
        return $this->response->setStatusCode( 200 )
            ->setJSON( [
                'message' => 'Agendamento confirmado com sucesso!',
                'error' => [
                    'code' => 200,
                    'msg' => "Agendamento confirmado com sucesso!"
                ]
            ] );
    }

	private function voucherSetUnsed(int $id_agendamento) {

		$agendamento_service = new AgendamentoService();
		$agendamento_response = $agendamento_service->getVoucherIdByAgendamentoId( $id_agendamento );

		if ($agendamento_response->getStatus() == ServiceResponseInterface::SUCESS) {

			$dados = $agendamento_response->getData();

			$voucher_service = new VoucherService();
			$response_voucher = $voucher_service->setVoucherUnsed( intval($dados['id_voucher']) );
		}

	}


}