<?php
/**
 * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
 *
 * @author Double Bastion LLC
 *
 * @license GNU AGPL version 3 or any later version
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 *
 * You should have received a copy of the GNU Affero General Public
 * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

declare(strict_types=1);

namespace OCA\PaxFax\Controller;

use OCA\PaxFax\Service\PaxfaxService;
use OCP\IRequest;
use OCP\AppFramework\Controller;
use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\AppFramework\App;
use OCP\Files\NotPermittedException;
use OCP\IConfig;
use OCP\IUserSession;
use OC\Files\Filesystem;
use OC\Files\View;
use OC\URLGenerator;
use \ReflectionClass;
use \FilesystemIterator;
use Psr\Log\LoggerInterface;

use Phaxio;
use Phaxio\OperationResult;
use Phaxio\Error\AuthenticationException;
use Phaxio\Error\NotFoundException;
use Phaxio\Error\InvalidRequestException;
use Phaxio\Error\RateLimitException;
use Phaxio\Error\APIConnectionException;
use Phaxio\Error\GeneralException;


class PaxfaxController extends Controller {

    private $service;
    private $config;
    private $userId;
    private $folder;
    private $filesystem;
    private $view;
    private $userSession;
    private $urlGenerator;
    private $logger;
    private $rootFolder;

    public function __construct($appName, IRequest $request, PaxfaxService $service, IConfig $config, $userId, Folder $folder, Filesystem $filesystem, View $view, IUserSession $userSession, URLGenerator $urlGenerator, LoggerInterface $logger, IRootFolder $rootFolder) {

           parent::__construct($appName, $request);

           $this->service = $service;
           $this->config = $config;
           $this->userId = $userId;
           $this->folder = $folder;
           $this->filesystem = $filesystem;
           $this->view = $view;
           $this->userSession = $userSession;
           $this->urlGenerator = $urlGenerator;
           $this->logger = $logger;
           $this->rootFolder = $rootFolder;
    }

    /**
     * @NoAdminRequired
     */
    public function cleantempdir() {

           // If the 'temp_files' folder doesn't exist create it
           if ($this->folder->nodeExists('Pax_Fax/temp_files') == false) {
               $this->folder->newFolder('Pax_Fax/temp_files');
           }

           $gettempdir = $this->folder->get("/Pax_Fax/temp_files");
           $fileSystemIterator = $gettempdir->getDirectoryListing();

           $dirfiles = [];
           foreach ($fileSystemIterator as $fileInfo){
                    $dirfiles[] = $fileInfo->getName();
           }

           foreach ($dirfiles as $key => $indfile) {
                    $tempfile = "/Pax_Fax/temp_files/" . $indfile;
                    $userFolder = $this->rootFolder->getUserFolder($this->userSession->getUser()->getUID());
                    $removetmpfile = $userFolder->get($tempfile)->delete();
           }
    }


    /**
     * @NoAdminRequired
     */
    public function object_to_array($obj) {

           if(is_object($obj)) $obj = (array)$this->dismount($obj);
           if(is_array($obj)) {
              $new = array();
              foreach($obj as $key => $val) {
                      $new[$key] = $this->object_to_array($val);
              }
           }
           else $new = $obj;
           return $new;
    }


    /**
     * @NoAdminRequired
     */
    public function dismount($object) {
           $reflectionClass = new ReflectionClass(get_class($object));
           $array = array();
           foreach ($reflectionClass->getProperties() as $property) {
                    $property->setAccessible(true);
                    $array[$property->getName()] = $property->getValue($object);
                    $property->setAccessible(false);
           }
           return $array;
    }


    /**
     * @NoAdminRequired
     */
    public function getbalance() {

           $thisapicred = $this->service->getapicredentials($this->userSession->getUser()->getUID());

           $sinchKeyId = $thisapicred[5];
           $sinchKeySecret = $thisapicred[6];

           if ($sinchKeyId && $sinchKeySecret) {

               // Use Sinch
               return "n/a";

           } else {

               // Use Phaxio
               $apiMode = 'live';
               $apiKeys[$apiMode] = $thisapicred[0];
               $apiSecrets[$apiMode] = $thisapicred[1];

               $apiHost = 'https://api.phaxio.com/v2.1/';

               $phaxio = new Phaxio($apiKeys[$apiMode], $apiSecrets[$apiMode], $apiHost);

               try {
                    // Get Phaxio account balance
                    $phaxioresulttert = $phaxio->doRequest("GET", 'account/status');

                    $balancetoarr = $this->object_to_array($phaxioresulttert);

                    $phaxiobalance = $balancetoarr['data']['balance'];

               } catch (InvalidRequestException $e) {
                    $phaxiobalance = 'unknown';
                    $phaxiosuccess = 'false';
                    $errortype = 'invalid request error';
               } catch (AuthenticationException $e) {
                    $phaxiobalance = 'unknown';
                    $phaxiosuccess = 'false';
                    $errortype = 'authentication error';
               } catch (APIConnectionException $e) {
                    $phaxiobalance = 'unknown';
                    $phaxiosuccess = 'false';
                    $errortype = 'API connection error';
               } catch (RateLimitException $e) {
                    $phaxiobalance = 'unknown';
                    $phaxiosuccess = 'false';
                    $errortype = 'rate limit error';
               } catch (NotFoundException $e) {
                    $phaxiobalance = 'unknown';
                    $phaxiosuccess = 'false';
                    $errortype = 'not found error';
               } catch (GeneralException $e) {
                    $phaxiobalance = 'unknown';
                    $phaxiosuccess = 'false';
                    $errortype = 'undefined error';
               }

               return $phaxiobalance;
           }
    }


    /**
     * @NoAdminRequired
     */
    public function getfaxnumbers() {

           $thisapicred = $this->service->getapicredentials($this->userSession->getUser()->getUID());

           $sinchKeyId = $thisapicred[5];
           $sinchKeySecret = $thisapicred[6];

           if ($sinchKeyId && $sinchKeySecret) {

               // Use Sinch
	       $sinchProjectId = $thisapicred[4];
	       $sinchServiceId = $thisapicred[7];

	       $nbquery = [ "pageSize" => "100", "page" => "string" ];

	       $curl = curl_init();

	       curl_setopt_array($curl, [
		    CURLOPT_HTTPHEADER => [ "Authorization: Basic " . base64_encode("" . $sinchKeyId . ":" . $sinchKeySecret ."") ],
                    CURLOPT_PORT => "",
		    CURLOPT_URL => "https://fax.api.sinch.com/v3/projects/" . $sinchProjectId . "/services/" . $sinchServiceId . "/numbers?" . http_build_query($nbquery),
		    CURLOPT_RETURNTRANSFER => true,
		    CURLOPT_CUSTOMREQUEST => "GET",
		]);

		$responsesnb = curl_exec($curl);
		$errorsnb = curl_error($curl);

		curl_close($curl);

		if ($errorsnb) { $this->logger->error('cURL Error #: '. $errorsnb . '.'); }

                $sincharr = [];
                $sinchnmbrs = json_decode($responsesnb, true);

	        foreach ($sinchnmbrs['numbers'] as $snkey => $snvalue) {
	                 if (is_array($snvalue)) {
	                        foreach ($snvalue as $snkeysec => $snvaluesec) {
	                               if ($snkeysec == 'phoneNumber') {
	                                   $sincharr[] = $snvaluesec;
	                               }
	                        }
	                 }
	        }

                $sinchnbdata = ["nblist" => $sincharr, "provider" => "sinch"];

		return $sinchnbdata;

           } else {

                // Use Phaxio
		$apiMode = 'live';
		$apiKeys[$apiMode] = $thisapicred[0];
		$apiSecrets[$apiMode] = $thisapicred[1];

		$apiHost = 'https://api.phaxio.com/v2.1/';

		$phaxio = new Phaxio($apiKeys[$apiMode], $apiSecrets[$apiMode], $apiHost);

		try {
	            // Get all Phaxio fax numbers
	            $phaxioresultfour = $phaxio->doRequest("GET", 'phone_numbers');

	            $phaxionbstoarr = $this->object_to_array($phaxioresultfour);

	            $phaxioarr = [];

	            foreach ($phaxionbstoarr['data'] as $phkey => $phvalue) {
	                   if (is_array($phvalue)) {
	                         foreach ($phvalue as $phkeysec => $phvaluesec) {
	                               if ($phkeysec == 'phone_number') {
	                                   $phaxioarr[] = $phvaluesec;
	                               }
	                         }
	                   }
	            }

		} catch (InvalidRequestException $e) {
	            $phaxiobalance = 'unknown';
	            $phaxiosuccess = 'false';
	            $errortype = 'invalid request error';
		} catch (AuthenticationException $e) {
	            $phaxiobalance = 'unknown';
	            $phaxiosuccess = 'false';
	            $errortype = 'authentication error';
		} catch (APIConnectionException $e) {
	            $phaxiobalance = 'unknown';
	            $phaxiosuccess = 'false';
	            $errortype = 'API connection error';
		} catch (RateLimitException $e) {
	            $phaxiobalance = 'unknown';
	            $phaxiosuccess = 'false';
	            $errortype = 'rate limit error';
		} catch (NotFoundException $e) {
	            $phaxiobalance = 'unknown';
	            $phaxiosuccess = 'false';
	            $errortype = 'not found error';
		} catch (GeneralException $e) {
	            $phaxiobalance = 'unknown';
	            $phaxiosuccess = 'false';
	            $errortype = 'undefined error';
		}

                $phaxionbdata = ["nblist" => $phaxioarr, "provider" => "phaxio"];

		return $phaxionbdata;
           }
    }


    /**
     * @NoAdminRequired
     */
    public function uploadfile($uploadfileforfax) {

           $fileContent = file_get_contents($_FILES['uploadfileforfax']['tmp_name']);
           $fileName = $_FILES['uploadfileforfax']['name'];
           $fileSizeinit = $_FILES['uploadfileforfax']['size'];
           $fileSize = $fileSizeinit / 1048576;

           if ($this->folder->nodeExists('Pax_Fax/faxes_sent') == false) {
               $this->folder->newFolder('Pax_Fax/faxes_sent');
           }
           if ($this->folder->nodeExists('Pax_Fax/faxes_received') == false) {
               $this->folder->newFolder('Pax_Fax/faxes_received');
           }
           if ($this->folder->nodeExists('Pax_Fax/faxes_sent_failed') == false) {
               $this->folder->newFolder('Pax_Fax/faxes_sent_failed');
           }
           if ($this->folder->nodeExists('Pax_Fax/faxes_received_failed') == false) {
               $this->folder->newFolder('Pax_Fax/faxes_received_failed');
           }
           if ($this->folder->nodeExists('Pax_Fax/temp_files') == false) {
               $this->folder->newFolder('Pax_Fax/temp_files');
           }

           $targetfile = "/Pax_Fax/temp_files/" . $fileName;

           $target = $this->folder->newFile($targetfile);
           $target->putContent($fileContent);

           // Get the cumulative files size of the uploaded files
           $gettmpdir = $this->folder->get("/Pax_Fax/temp_files");
           $fliterator = $gettmpdir->getDirectoryListing();


           $dirfiles = [];
           foreach ($fliterator as $fileInfo){
                    $dirfiles[] = $fileInfo->getName();
           }

           $totalflsizeinit = 0;
           foreach ($dirfiles as $key => $indfile) {
                    $flsize = $this->folder->get("/Pax_Fax/temp_files/" . $indfile);
                    $fileSizeinit = $flsize->getSize();
                    $mbSize = $fileSizeinit / 1048576;
                    $totalflsizeinit += $mbSize;
           }

           $totalflsize = number_format($totalflsizeinit, 2) . ' MB';

           return $totalflsize;

    }

    /**
     * @NoAdminRequired
     */
    public function pickfile($path) {

           if ($this->folder->nodeExists('Pax_Fax/faxes_sent') == false) {
               $this->folder->newFolder('Pax_Fax/faxes_sent');
           }
           if ($this->folder->nodeExists('Pax_Fax/faxes_received') == false) {
               $this->folder->newFolder('Pax_Fax/faxes_received');
           }
           if ($this->folder->nodeExists('Pax_Fax/faxes_sent_failed') == false) {
               $this->folder->newFolder('Pax_Fax/faxes_sent_failed');
           }
           if ($this->folder->nodeExists('Pax_Fax/faxes_received_failed') == false) {
               $this->folder->newFolder('Pax_Fax/faxes_received_failed');
           }
           if ($this->folder->nodeExists('Pax_Fax/temp_files') == false) {
               $this->folder->newFolder('Pax_Fax/temp_files');
           }

           $getfl = $this->folder->get($path);

           $fileContentpk = $getfl->getContent();

           $patharr = explode("/", $path);

           $revarr = array_reverse($patharr);

           $relflpath = "/Pax_Fax/temp_files/" . $revarr[0]; 

           $target = $this->folder->newFile($relflpath);

           $target->putContent($fileContentpk);

           $gettmpdir = $this->folder->get("/Pax_Fax/temp_files");

           $fileitrt = $gettmpdir->getDirectoryListing();

           $dirfls = [];
           foreach ($fileitrt as $fileInfo) {
                    $dirfls[] = $fileInfo->getName();
           }

           $totalflsizeinitp = 0;

           foreach ($dirfls as $keyp => $indfilep) {

                    $flsizep = $this->folder->get("/Pax_Fax/temp_files/" . $indfilep);
                    $fileSizeinitp = $flsizep->getSize();
                    $mbSizep = $fileSizeinitp / 1048576;
                    $totalflsizeinitp += $mbSizep;
           }

           $totalflsizep = number_format($totalflsizeinitp, 2) . ' MB';

           return $totalflsizep;
    }

    /**
     * @NoAdminRequired
     */
    public function removeupfile($removedfilename) {

           $upfile = "/Pax_Fax/temp_files/" . $removedfilename;
           $userFolder = $this->rootFolder->getUserFolder($this->userSession->getUser()->getUID());
           $removetmpfile = $userFolder->get($upfile)->delete();

           $gettmpdir = $this->folder->get("/Pax_Fax/temp_files");
           $fliterator = $gettmpdir->getDirectoryListing();

           $dirfiles = [];
           foreach ($fliterator as $fileInfo){
                    $dirfiles[] = $fileInfo->getName();
           }

           $totalflsizeinit = 0;
           foreach ($dirfiles as $key => $indfile) {
                    $flsize = $this->folder->get("/Pax_Fax/temp_files/" . $indfile);
                    $fileSizeinit = $flsize->getSize();
                    $mbSize = $fileSizeinit / 1048576;
                    $totalflsizeinit += $mbSize;
           }

           $totalflsize = number_format($totalflsizeinit, 2) . ' MB';

           return $totalflsize;
    }

    /**
     * @NoAdminRequired
     */
    public function prevpickedfile($pickedfilename) {

           $getfl = $this->folder->get("/Pax_Fax/temp_files/" . $pickedfilename);
           $getfilecontent = $getfl->getContent();

           $namesplit = explode(".", $pickedfilename);
           $extension = end($namesplit);

           if ($extension == "txt" || $extension == "html") {
               $getpickedfile = $getfilecontent;
           } elseif ($extension == "jpg") {
               $getpickedfile = 'data:image/jpeg;base64,' . base64_encode($getfilecontent);
           } elseif ($extension == "png") {
               $getpickedfile = 'data:image/png;base64,' . base64_encode($getfilecontent);
           } else { $getpickedfile = ""; }

           return $getpickedfile;
    }

    /**
     * @NoAdminRequired
     */
    public function sendfax($uploadedtofax, $selectedcid, $toNumber) {

           $tonumbertr = str_replace("+", "", $toNumber[0]);
           $fldate = date("Y-m-d_H-i-s_").gettimeofday()["usec"];
           $fromnumberdigits = str_replace("+", "", $selectedcid);

           if ($selectedcid != '' && $selectedcid != 'click refresh button') { $fromnumber = $selectedcid; } else { $fromnumber = ''; }

           $thisapicred = $this->service->getapicredentials($this->userSession->getUser()->getUID());

           $sinchKeyId = $thisapicred[5];
           $sinchKeySecret = $thisapicred[6];

           if ($sinchKeyId && $sinchKeySecret) {

               // Use Sinch
	       $sinchProjectId = $thisapicred[4];

               $countfaxfiles = count($uploadedtofax);

               $openedfiles = [];
               $crtuser = $this->userSession->getUser()->getUID();
               $userFolder = $this->rootFolder->getUserFolder($this->userSession->getUser()->getUID());

               foreach ($uploadedtofax as $key => $flname) {

                    if ($key == 0) { $firstflname = $flname; }

                    $fileNamesec = array_reverse(explode(".", $flname));
                    $filenameext = $fileNamesec[0];

                    array_shift($fileNamesec);

                    $fileName = implode("", $fileNamesec);

                    if ($countfaxfiles == 1) {

                        $targetfile = "/Pax_Fax/faxes_sent/" . $fileName . "_" . $fromnumber . "_"  . $tonumbertr . "_" . $fldate . "." . $filenameext;

                    } else {

                         if ($this->folder->nodeExists("Pax_Fax/faxes_sent/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate) == false) {
                             $this->folder->newFolder("Pax_Fax/faxes_sent/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate);
                         }

                         $targetfile = "/Pax_Fax/faxes_sent/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext;
                    }

		    $getfl = $this->folder->get("/Pax_Fax/temp_files/" . $flname);
		    $fileContentsnd = $getfl->getContent();

		    $target = $this->folder->newFile($targetfile);
		    $target->putContent($fileContentsnd);

		    $upfilefx = "/Pax_Fax/temp_files/" . $flname;
		    $removetmpfile = $userFolder->get($upfilefx)->delete();

                    if ($countfaxfiles == 1) {
                        $gtflfx = $this->folder->get("/Pax_Fax/faxes_sent/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext);
                        $openedfiles[] = [ "file" => base64_encode($gtflfx->getContent()), "fileType" => $filenameext ];
                    } else {
                        $gtflfx = $this->folder->get("/Pax_Fax/faxes_sent/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext);
                        $openedfiles[] = [ "file" => base64_encode($gtflfx->getContent()), "fileType" => $filenameext ];
                    }
               }

               $toNumbersn = [];
               foreach ($toNumber as $nbkey => $nbvalue) { $toNumbersn[] = "+" . $nbvalue; }
               $toNumbersnfin = implode(";", $toNumbersn);

	       $datatosendsn = ["to" => $toNumbersnfin, "files" => $openedfiles];

	       $postedparamsn = json_encode($datatosendsn);

	       $chsn = curl_init();
               curl_setopt($chsn, CURLOPT_URL, "https://" . $sinchKeyId . ":" . $sinchKeySecret . "@fax.api.sinch.com/v3/projects/" . $sinchProjectId . "/faxes");
	       curl_setopt($chsn, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
	       curl_setopt($chsn, CURLOPT_TIMEOUT, 300);
	       curl_setopt($chsn, CURLOPT_RETURNTRANSFER, 1);
	       curl_setopt($chsn, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
	       curl_setopt($chsn, CURLOPT_POST, 1);
	       curl_setopt($chsn, CURLOPT_POSTFIELDS, $postedparamsn);
	       $resultsn = curl_exec($chsn);
	       $statusCodesn = curl_getinfo($chsn, CURLINFO_HTTP_CODE);
	       curl_close($chsn);

	       $decresultsn = json_decode($resultsn, true);

	       if (in_array($statusCodesn, [400, 401, 402, 404, 422, 429, 500, 800])) {
                   $sinchsuccess = false;
                   $sincherrortype = "Error: " . $decresultsn['code'] . " . Message: " . $decresultsn['message'];
               } else { $sinchsuccess = true; $sincherrortype = ''; }

               $sinchresult = [ 'success' => $sinchsuccess, 'errortype' => $sincherrortype ];

               if ($sinchsuccess != true) {

                    foreach ($uploadedtofax as $key => $flname) {

                        $fileNamesec = array_reverse(explode(".", $flname));
                        $filenameext = $fileNamesec[0];
                        array_shift($fileNamesec);

                        $fileName = implode("", $fileNamesec);

                        if ($countfaxfiles == 1) {
                            $failedfl = "/Pax_Fax/faxes_sent/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext;
                            $newtargetfl =  "/Pax_Fax/faxes_sent_failed/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext;
                        } else {

                            $failedfl = "/Pax_Fax/faxes_sent/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext;
                            $this->folder->newFolder("Pax_Fax/faxes_sent_failed/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate);
                            $newtargetfl = "/Pax_Fax/faxes_sent_failed/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "/" . $fileName . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext;
                        }

		        $getflsc = $this->folder->get($failedfl);
		        $fileContentfld = $getflsc->getContent();

		        $targetact = $this->folder->newFile($newtargetfl);
		        $targetact->putContent($fileContentfld);

		        $removetmpfile = $userFolder->get($failedfl)->delete();
                    }

                }

                return $sinchresult;

           } else {

               // Use Phaxio
               if ($selectedcid != '' && $selectedcid != 'click refresh button') { $fromnumber = $fromnumberdigits; } else { $fromnumber = 'nocallerid'; }

               $countfaxfiles = count($uploadedtofax);

               $openedfiles = [];
               $crtuser = $this->userSession->getUser()->getUID();
               $userFolder = $this->rootFolder->getUserFolder($this->userSession->getUser()->getUID());

               foreach ($uploadedtofax as $key => $flname) {

                    if ($key == 0) { $firstflname = $flname; }

                    $fileNamesec = array_reverse(explode(".", $flname));
                    $filenameext = $fileNamesec[0];
                    array_shift($fileNamesec);

                    $fileName = implode("", $fileNamesec);

                    if ($countfaxfiles == 1) {
                        $targetfile = "/Pax_Fax/faxes_sent/" . $fileName . "_" . $fromnumber . "_"  . $tonumbertr . "_" . $fldate . "." . $filenameext;
                    } else {
                         if ($this->folder->nodeExists("Pax_Fax/faxes_sent/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate) == false) {
                             $this->folder->newFolder("Pax_Fax/faxes_sent/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate);
                         }

                         $targetfile = "/Pax_Fax/faxes_sent/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext;
                    }

		    $getflsc = $this->folder->get("/Pax_Fax/temp_files/" . $flname);
		    $fileContentsnd = $getflsc->getContent();

                    $target = $this->folder->newFile($targetfile);
                    $target->putContent($fileContentsnd);

                    $fltodel = "/Pax_Fax/temp_files/" . $flname;
		    $removetmpfile = $userFolder->get($fltodel)->delete();

                    if ($countfaxfiles == 1) {
                        $getflopen = $userFolder->get("/Pax_Fax/faxes_sent/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext);
                        $openedfiles[] = $getflopen->fopen('r');
                    } else {
                        $getflopen = $userFolder->get("/Pax_Fax/faxes_sent/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext);
                        $openedfiles[] = $getflopen->fopen('r');
                    }
               }

               $params = array(
                           'to' => $toNumber,
                           'file' => $openedfiles,
                           'caller_id' => $selectedcid
                         );

               $apiMode = 'live';

               $apiKeys[$apiMode] = $thisapicred[0];
               $apiSecrets[$apiMode] = $thisapicred[1];

               $apiHost = 'https://api.phaxio.com/v2.1/';

               $phaxio = new Phaxio($apiKeys[$apiMode], $apiSecrets[$apiMode], $apiHost);

               try {
                    $phaxioresultinit = $phaxio->sendFax($params);

                    $phaxioresultsec = $phaxio->doRequest("GET", 'faxes/' . urlencode((string)$phaxioresultinit['id']));

                    $statustoarr = $this->object_to_array($phaxioresultsec);

                    $phaxiosuccess = $statustoarr['success'];

                    $errortype = 'there are no errors';

               } catch (InvalidRequestException $e) {
                    $phaxiosuccess = 'false';
                    $errortype = 'invalid request error';
               } catch (AuthenticationException $e) {
                    $phaxiosuccess = 'false';
                    $errortype = 'authentication error';
               } catch (APIConnectionException $e) {
                    $phaxiosuccess = 'false';
                    $errortype = 'API connection error';
               } catch (RateLimitException $e) {
                    $phaxiosuccess = 'false';
                    $errortype = 'rate limit error';
               } catch (NotFoundException $e) {
                    $phaxiosuccess = 'false';
                    $errortype = 'not found error';
               } catch (GeneralException $e) {
                    $phaxiosuccess = 'false';
                    $errortype = 'undefined error';
               }

               $phaxioresult = ['success' => $phaxiosuccess, 'errortype' => $errortype];

               if ($phaxiosuccess != 'true') {

                    foreach ($uploadedtofax as $key => $flname) {

                        $fileNamesec = array_reverse(explode(".", $flname));
                        $filenameext = $fileNamesec[0];
                        array_shift($fileNamesec);

                        $fileName = implode("", $fileNamesec);

                        if ($countfaxfiles == 1) {
                            $failedfl = "/Pax_Fax/faxes_sent/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext;
                            $newtargetfl =  "/Pax_Fax/faxes_sent_failed/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext;
                        } else {

                            $failedfl = "/Pax_Fax/faxes_sent/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "/" . $fileName . "_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext;
                            $this->folder->newFolder("Pax_Fax/faxes_sent_failed/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate);
                            $newtargetfl = "/Pax_Fax/faxes_sent_failed/" . $firstflname . "_et_al_" . $fromnumber . "_" . $tonumbertr . "_" . $fldate . "/" . $fileName . "_" . $tonumbertr . "_" . $fldate . "." . $filenameext;
                        }

		        $getflthrd = $this->folder->get($failedfl);
		        $fileContentfld = $getflthrd->getContent();

                        $targetact = $this->folder->newFile($targetfile);
                        $targetact->putContent($fileContentfld);

		        $removefailed = $userFolder->get($failedfl)->delete();
                    }
               }

               return $phaxioresult;
           }
    }


    /**
     * @NoAdminRequired
     */
    public function getsettings() {
           return $this->service->getsettings($this->userSession->getUser()->getUID());
    }


    /**
     * @NoAdminRequired
     */
    public function updatesettings($apiKey, $apiSecret, $webhookToken, $receiveUrl, $sinchProjectId, $sinchKeyId, $sinchKeySecret, $sinchServiceId, $sinchCallbackUrl, $getNotification, $notificationEmail) {
           return $this->service->updatesettings($this->userSession->getUser()->getUID(), $apiKey, $apiSecret, $webhookToken, $receiveUrl, $sinchProjectId, $sinchKeyId, $sinchKeySecret, $sinchServiceId, $sinchCallbackUrl, $getNotification, $notificationEmail);
    }

}
