<?php
/**
 * @link      http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
 * @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace Application\Controller;

use Application\Master;
use Laminas\View\Model\ViewModel;
use Khansia\Generic\Result;

class ApiController extends \Application\Master\GlobalActionController {


    public function getAccessAction(){

        $result     = new Result();
        $request    = $this->getRequest();
        $post       = $request->getPost();

        if ($request->isPost()) {

            try{

                $username = $this->isFieldMandatory($post->usernam3, 'usernam3');
                $password = $this->isFieldMandatory($post->passw0rds, 'passw0rds');
                $devid    = $this->isFieldMandatory($post->devid, 'devid');

                $thisData = array(
                    'username'  => $username,
                    'password'  => $password,
                    'devid'     => $devid,
                );

                /* instance user */
                $access    = $this->authenticateApi($password, $thisData);     
                
                if($access->code == $result::CODE_SUCCESS){
                    $result->code = $access->code;
                    $result->info = $access->info;
                    $result->data = $access->data;
                }else{
                    $result->code = $access->code;
                    $result->info = $access->info;
                }


            }catch (\Exception $exc) {
                $result = new Result(0,1,$exc->getMessage() .'-'.$exc->getTraceAsString());
            }
        }else{
            $result = new Result(0,411,'Method is not compatible');
        }
        return $this->getOutput($result->toJson());
    }
	
	public function testAction(){
		$db = $this->getDb();
		
		echo '<pre>';
		print_r($db);die;
		
	}

    public function ssoLoginAction(){
        $result     = new Result();
        $request    = $this->getRequest();
        $post       = $request->getPost();
        // print_r($post->username);die;
        if($request->isPost()){

            try{
                $tag = 'ns1:loginResponse';
                $strip = 'ns1:';
                $strip2 = null;
                
                $username = $this->isFieldMandatory($post->username, 'username');
                $password = $this->isFieldMandatory($post->passwd, 'password');

                $curl = curl_init();

                curl_setopt_array($curl, array(
                  CURLOPT_URL => 'https://nic.itb.ac.id:443/riset/sson.php',
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_ENCODING => '',
                  CURLOPT_MAXREDIRS => 10,
                  CURLOPT_TIMEOUT => 0,
                  CURLOPT_FOLLOWLOCATION => true,
                  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                  CURLOPT_CUSTOMREQUEST => 'POST',
                  CURLOPT_POSTFIELDS =>'<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:loc="http://localhost/">
                   <soapenv:Header/>
                   <soapenv:Body>
                      <loc:login soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                         <username xsi:type="xsd:string">'.$username.'</username>
                         <password xsi:type="xsd:string">'.$password.'</password>
                      </loc:login>
                   </soapenv:Body>
                </soapenv:Envelope>',
                  CURLOPT_HTTPHEADER => array(
                    'Content-Type: text/xml'
                  ),
                ));

                $response = curl_exec($curl);
                $err      = curl_error($curl);
                $info     = curl_getinfo($curl);
                $status   = array();
                curl_close($curl);

                $jsonResponse = $response;
                $xml = $jsonResponse;


                $offset = strpos($xml, $tag);
                if ($offset !== false) {
                    $xml = '<?xml version="1.0" encoding="utf-8"?>' . substr($xml, $offset-1);
                    $offset = strrpos($xml, '/' . $tag);
                    if ($offset !== false) {
                        $xml = substr($xml, 0, $offset-1) . '</' . $tag . '>';
                        if ($strip) {
                            $xml = str_replace($strip, '', $xml);
                        }

                        if($strip2){
                            $xml = str_replace($strip2, '', $xml);
                        }
                    }
                }

                $xmlres = simplexml_load_string($xml);

                $out = array ();
                $xmlObject = $xmlres;

                $status = json_decode(json_encode($xmlObject), true);

                if(is_array($status["return"])){
                  $out = false;
                }else{

                  foreach ( (array) $xmlObject as $index => $node )
                      $out[$index] = ( is_object ( $node ) ) ? xml2array ( $node ) : $node;

                }

                if($out){
                    $result->code = 0;
                    $result->info = 'success';
                    $result->data = $out;
                }else{
                    $result->code = 1;
                    $result->info = 'failed';
                }

                // print_r($result);die;
            }catch(\Exception $exc){
                $result = new Result(0,1,$exc->getMessage() .'-'.$exc->getTraceAsString());
            }
        }else{
            $result = new Result(0,411,'Method is not compatible');
        }
        return $this->getOutput($result->toJson());
    }

    public function ssoGetAllAttributeAction(){

        $result     = new Result();
        $request    = $this->getRequest();
        $post       = $request->getPost();

        if ($request->isPost()) {

            try{

                $tag = 'ns1:getAllAtributeResponse';
                $strip = 'ns1:';
                $strip2 = null;

                $username = $this->isFieldMandatory($post->username, 'usernam3');

                $curl = curl_init();

                curl_setopt_array($curl, array(
                  CURLOPT_URL => 'https://nic.itb.ac.id:443/riset/sson.php',
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_ENCODING => '',
                  CURLOPT_MAXREDIRS => 10,
                  CURLOPT_TIMEOUT => 0,
                  CURLOPT_FOLLOWLOCATION => true,
                  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                  CURLOPT_SSL_VERIFYPEER => false,
                  CURLOPT_CUSTOMREQUEST => 'POST',
                  CURLOPT_POSTFIELDS =>'<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:loc="http://localhost/">
                                         <soapenv:Header/>
                                         <soapenv:Body>
                                            <loc:getAllAtribute soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                                               <SID xsi:type="xsd:string">'.$username.'</SID>
                                            </loc:getAllAtribute>
                                         </soapenv:Body>
                                      </soapenv:Envelope>',
                  CURLOPT_HTTPHEADER => array(
                    'Content-Type: text/xml'
                  ),
                ));

                $response = curl_exec($curl);
                $err      = curl_error($curl);
                $info     = curl_getinfo($curl);
                $status   = array();
                curl_close($curl);

                $jsonResponse = $response;
                $xml = $jsonResponse;


                $offset = strpos($xml, $tag);
                if ($offset !== false) {
                    $xml = '<?xml version="1.0" encoding="utf-8"?>' . substr($xml, $offset-1);
                    $offset = strrpos($xml, '/' . $tag);
                    if ($offset !== false) {
                        $xml = substr($xml, 0, $offset-1) . '</' . $tag . '>';
                        if ($strip) {
                            $xml = str_replace($strip, '', $xml);
                        }

                        if($strip2){
                            $xml = str_replace($strip2, '', $xml);
                        }
                    }
                }

                $xmlres = simplexml_load_string($xml);

                $out = array ();
                $xmlObject = $xmlres;
                $status = json_decode(json_encode($xmlObject), true);

                if(is_array($status["return"])){
                  $return = false;
                }else{
                  foreach ( (array) $xmlObject as $index => $node )
                      $out[$index] = ( is_object ( $node ) ) ? xml2array ( $node ) : $node;

                  $return = $out['return'];
                  $return = rtrim($return, ';');
                  $return = str_replace('=>','":"', $return);
                  $pattern = '/;(?!([\\p{P}]))/';
                  $return = preg_replace($pattern, '","', $return);
                  $return = '{"'.$return.'"}';
                  $return = json_decode($return,true);
                }

                  if($return){
                      $result->code = 0;
                      $result->info = 'success';
                      $result->data = $return;
                  }else{
                      $result->code = 1;
                      $result->info = 'failed';
                  }

            }catch (\Exception $exc) {
                $result = new Result(0,1,$exc->getMessage() .'-'.$exc->getTraceAsString());
            }
        }else{
            $result = new Result(0,411,'Method is not compatible');
        }
        return $this->getOutput($result->toJson());
    }

    public function ssoTestAction(){
        $this->cas = new \phpCAS();
        $this->cas_server_url = "https://login.itb.ac.id/cas";
        $defaults = array('path'=> '', 'port'=>443);
        $cas_url = array_merge($defaults, parse_url($this->cas_server_url));
        
        $this->cas::client(CAS_VERSION_2_0,
                        $cas_url['host'],
                        $cas_url['port'],
                        $cas_url['path']);

        $this->cas->forceAuthentication();
        
        $userProfile = $this->cas->getAttributes();
        
        $message = $this->param()->fromQuery('message', 'hello');
        
        
    }

}
