<?php

namespace App;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use App\Foto;
use App\SouborZak;
use QrCode;
use GuzzleHttp\Client;

class servis 
{
    
    public function UploadFile($IdNumeric=0,$IdStr="",$files,$link_type){
        
        if($IdNumeric != 0){
            $insertedIdStr = sprintf("%09u", $IdNumeric);
        }else{
            $insertedIdStr = $IdStr;
        }
            
        $fileAccessArray = array();
                $fileAccessArray = array(
                'link_type' => $link_type,
                'link_id' => $insertedIdStr
                );
                
        foreach ($files as $file){
            $foto = new foto();
            $soubor = new SouborZak();
            
            if ($foto->isImage($file)){
                $idIns = $foto->FotoSave($file,$fileAccessArray);
            }else{
                $souborType =$file->getClientOriginalExtension();
                if(strtoupper($souborType) == "PDF"){
                    $idIns = $soubor->SouborSave($file,$fileAccessArray);
                }
            }
        }
    }

        public function UploadFilesApi($IdNumeric=0,$IdStr="",$files,$link_type, $user){
        
        if($IdNumeric != 0){
            $insertedIdStr = sprintf("%09u", $IdNumeric);
        }else{
            $insertedIdStr = $IdStr;
        }
            
        $fileAccessArray = array();
                $fileAccessArray = array(
                    'link_type' => $link_type,
                    'link_id' => $insertedIdStr
                );
                
        foreach ($files as $file){
            $soubor = new SouborZak();
            $soubor->setConnection($user->database);
            
            $souborType =$file->getClientOriginalExtension();
            if(strtoupper($souborType) == "PDF"){
                $idIns = $soubor->SouborSaveApi($file,$fileAccessArray, $user->database);
            }
        }
    }

    public function UploadFileApi($IdNumeric=0,$IdStr="",$file,$link_type, $database){
        
        if($IdNumeric != 0){
            $insertedIdStr = sprintf("%09u", $IdNumeric);
        }else{
            $insertedIdStr = $IdStr;
        }
            
        $fileAccessArray = array();
                $fileAccessArray = array(
                'link_type' => $link_type,
                'link_id' => $insertedIdStr
                );
                
            $soubor = new SouborZak();
            $soubor->setConnection($database);
            $idIns = $soubor->SouborSaveApi($file,$fileAccessArray, $database);
    }
    
    
    public function formatSize ($size) {
        if ($size < 1024) {
            return "{$size}B";
        } else if ($size < 1024 * 1024) {
            return sprintf("%4.2fKB", $size / 1024);
        } else {
            return sprintf("%4.2fMB", $size / (1024 * 1024));
        }
    }
    
     public function FileReference($fileName,$fileBlob){
        $id_user = Auth::user()->id;
         
        if (isset(Auth()->user()->master_id)) {
            $id_user = Auth()->user()->master_id;
        }
            if(isset($fileBlob)){
                $pathFile = 'storage/show/'.$id_user.'/'.$fileName;
                Storage::put('public/show/'.$id_user.'/'.$fileName , $fileBlob);
            }
            
            if(isset($pathFile)){
                return asset($pathFile);       
            }else{
                return;
            }
            
     }
     
     public function DeleteStorageUser(){
           $id_user = Auth::user()->id;
           if (isset(Auth()->user()->master_id)) {
            $id_user = Auth()->user()->master_id;
           }
        
         
           $filesStore = Storage::files('public/show/'.$id_user);
           foreach ($filesStore as $fileStore){
                Storage::delete($fileStore); 
           }
           return;
     }
//
     
	/**
	 * Přeformátování času z HH:MM:SS na HH:MM
	 *
	 * @param $time čas ve formátu HH:MM:SS
	 * @return čas ve formátu HH:MM
	 */
	public function formatTime($time) {
		if (empty($time)) {
			return '';
		}

		return preg_replace('/^(\d+):(\d+):(\d+)$/', '\1:\2', $time);
	}

	/**
	 * Přeformátování ISO data na české datum
	 *
	 * @param $date datum v ISO formátu YYYY-MM-DD
	 * @return datum ve formátu DD.MM.YYYY
	 */
	public function formatDate($date) {
		if (empty($date) || $date === '0000-00-00') {
			return '';
		}

		return preg_replace('/^(\d+)-(\d+)-(\d+)$/', '\3.\2.\1', $date);
	}

	/**
	 * Přeformátování ISO data a času na český formát
	 *
	 * @param $date datum v ISO formátu YYYY-MM-DD HH:MM:SS
	 * @return datum ve formátu DD.MM.YYYY HH:MM
	 */
	public function formatDateTime($date) {
		if (empty($date) || $date === '0000-00-00 00:00:00') {
			return '';
		}

		return preg_replace('/^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)$/', '\3.\2.\1 \4:\5', $date);
	}

	/**
	 * Přeformátování ISO data na české datum bez dne
	 *
	 * @param $date datum v ISO formátu YYYY-MM-DD
	 * @return datum ve formátu MM.YYYY
	 */
	public function formatMonth($date) {
		if (empty($date) || $date === '0000-00-00') {
			return '';
		}

		return preg_replace('/^(\d+)-(\d+)-(\d+)$/', '\2.\1', $date);
	}
        
        public function formatObdobi($obdobi) {
            return sprintf('%02d.%d', $obdobi % 12 + 1, $obdobi / 12);
        }
        
        public function getFirstDayMonth() {
            $datearr = getdate();
            $nmdate = $this->formatDate(date('Y-m-01', time() + (32 - $datearr['mday']) * 86400));
            return $nmdate;
        }
        
        public function getFirstDayYear() {
            $datearr = getdate();
            $nextyear = $datearr['year'] + 1;
            $nrdate = $this->formatDate("$nextyear-01-01");
            return $nrdate;
        }
        
        public function getNow() {
            $now = $this->formatDate(date('Y-m-d'));    $datearr = getdate();
            return $now;
        }
            

	public static function asciiFilename($filename) {
		$filename = iconv('UTF-8', 'ASCII//TRANSLIT', $filename);
		$filename = preg_replace('/[^a-z0-9.-]+/ui', '_', $filename);
		
		if (empty($filename)) {
			throw new Exception('Chyba kódování.');
		}

		return $filename;
	}

    /**
     * Zahashuje heslo
     *
     * @param string $username
     * @param string $password
     * @return string hash hesla
     */
    public static function hashPassword($username,$password) {
        return strtolower(sha1(strtoupper($username) . 'JGR3D7JVH9JHZB' . $password));
    }

    /**
     * Přepočítá procenta pro výsledky anket a hlasování
     *
     * @param Array $arr
     * @return Array
     */
    public function prepocitatProcenta($arr){
        // Zaokrouhli dolů na 2 desetinná místa
        $moznostiArrFloored = array_map(function($x) { return floor($x * 100) / 100; }, $arr);

        // Získej část za desetinnou čárkou
        $moznostiArrDecimals = array_map(function ($x, $y) { return abs($y-$x); }, $arr, $moznostiArrFloored);
        $moznostiArrDecimals = array_combine(array_keys($arr), $moznostiArrDecimals);

        // Seřaď podle části za desetinnou čárkou
        arsort($moznostiArrDecimals);

        // Vezmi seřazené klíče (id možností)
        $keys = array_keys($moznostiArrDecimals);

        // Vezmi sumu zaokrouhlených procent a doplň do 100 podle části za desetinnou čárkou
        $sumArr = array_sum($moznostiArrFloored);

        for ($i=0; $i < round((100-$sumArr)*100); $i++) { 
            $key = $keys[$i];
            $moznostiArrFloored[$key]+= 0.01;
        }

        return $moznostiArrFloored;
    }

    /**
     * Označí nepřečtené notifikace uživatele jako přečtené
     *
     * @param $user uživatel
     * @param $timestamp časová značka pro označení notifikací
     * @return integer počet zpracovaných notifikací
     */
    public function markNotifAsRead($user, $timestamp){
        $p = 0;
        foreach ($user->unreadNotifications as $notification) {
            //if (Carbon::parse($notification->created_at)->timezone('Europe/Prague') < $timestamp->format('Y-m-d H:i:s')) {
                $notification->markAsRead();
                $p++;
            //}
        }
        return $p;
    }
    
    /**
    * Calls the Web Service of IBAN
    *
    * @param string $api_method
    * @param array $POSTparameters
    *
    * @return string $jsonreply
    */
    public function CallWebServiceIBAN($country,$bankcode,$accountNumber) {
        $ch = curl_init();
        $url = 'https://openiban.com/v2/calculate/'.$country.'/'.$bankcode.'/'.$accountNumber;
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        //curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
        //curl_setopt($ch, CURLOPT_POST, true );
        //curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTparameters);

        $jsonreply = curl_exec ($ch);
        curl_close ($ch);
        unset($ch);
//return $url;
        return $jsonreply;
    }
    
    public function isValidEmail($email){ 
       return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
    }
    
    
    /**
     * Vrátí platební údaje ve formě QrCodu
     *
     * @param $plUdaje - array 
     * @param $user Identifikátor uživatele
     * @return cesta k vygenerovanému obrázku QR kód
     */
    public function GetQrPlatba($plUdaje,$mena='CZK',$typ_vystupu = 'T',$asBlob=0){
        $id_user = Auth::user()->id;
        $country = 'CZ';
        $bankcode = $plUdaje['banka_kod'];
        $accountNumber = $plUdaje['ucet'];
        
        $iban = $this->CallWebServiceIBAN($country,$bankcode,$accountNumber);

        $ibanC = collect($iban);
        $ibanResult = json_decode($iban,true);
        $vs = $plUdaje['vars'];
        $ss = $plUdaje['ssymbol'];
        //$jmenoPlatce = $plUdaje['jmenoPlatce'];
        $jmenoPlatce = $this->RemoveDiakrit($plUdaje['jmenoPlatce']);
        $qrRetezec =  '';
        
        //struktura QR platba
        //ACC IBAN
        $qrRetezec = 'SPD*1.0*';
        if(isset ($ibanResult['iban'])){
            $qrRetezec .= 'ACC:'.$ibanResult['iban'].'*';
        }
        //AM Výše platby
        $qrRetezec .= 'AM:'.$plUdaje['castka'].'*';
        //CC Měna
        $qrRetezec .= 'CC:'.$mena.'*';
         //DT Datum splatnosti zatím 
        //$qrRetezec += 'DT:'.$datumSplatn.'*';
         //MSG Datum splatnosti
        $qrRetezec .= 'MSG:'.$jmenoPlatce.'*';
        //X-VS VS
        $qrRetezec .= 'X-VS:'.$vs.'*';
        //specifický symbol-
        $qrRetezec .= 'X-SS:'.$ss.'*';

        if(!file_exists(public_path('generated_qrcodes/'))){
            mkdir(public_path('generated_qrcodes'));
        }
        
        if(!$ibanResult){
            return;
        }
        if(empty($iban)){
            return;
        }
        if(!$asBlob){
            QrCode::size(500)
                    ->format('png')
                    ->generate($qrRetezec, public_path('generated_qrcodes/qrcode'.$id_user.'.png'));
            $pathFile = asset('generated_qrcodes/qrcode'.$id_user.'.png');
        
            if($typ_vystupu = 'T'){
                return 'generated_qrcodes/qrcode'.$id_user.'.png';
            }else{
                return $pathFile;        
            }
        }else{ //ulož jako Blob
            $qrCode = QrCode::format('png')->size(500)->generate($qrRetezec);
                // Vrátit base64
                return 'data:image/png;base64,' . base64_encode($qrCode);
        }
    }
    
    public function RemoveDiakrit($text){
        $prevodni_tabulka = Array(
            'ä'=>'a',
            'Ä'=>'A',
            'á'=>'a',
            'Á'=>'A',
            'à'=>'a',
            'À'=>'A',
            'ã'=>'a',
            'Ã'=>'A',
            'â'=>'a',
            'Â'=>'A',
            'č'=>'c',
            'Č'=>'C',
            'ć'=>'c',
            'Ć'=>'C',
            'ď'=>'d',
            'Ď'=>'D',
            'ě'=>'e',
            'Ě'=>'E',
            'é'=>'e',
            'É'=>'E',
            'ë'=>'e',
            'Ë'=>'E',
            'è'=>'e',
            'È'=>'E',
            'ê'=>'e',
            'Ê'=>'E',
            'í'=>'i',
            'Í'=>'I',
            'ï'=>'i',
            'Ï'=>'I',
            'ì'=>'i',
            'Ì'=>'I',
            'î'=>'i',
            'Î'=>'I',
            'ľ'=>'l',
            'Ľ'=>'L',
            'ĺ'=>'l',
            'Ĺ'=>'L',
            'ń'=>'n',
            'Ń'=>'N',
            'ň'=>'n',
            'Ň'=>'N',
            'ñ'=>'n',
            'Ñ'=>'N',
            'ó'=>'o',
            'Ó'=>'O',
            'ö'=>'o',
            'Ö'=>'O',
            'ô'=>'o',
            'Ô'=>'O',
            'ò'=>'o',
            'Ò'=>'O',
            'õ'=>'o',
            'Õ'=>'O',
            'ő'=>'o',
            'Ő'=>'O',
            'ř'=>'r',
            'Ř'=>'R',
            'ŕ'=>'r',
            'Ŕ'=>'R',
            'š'=>'s',
            'Š'=>'S',
            'ś'=>'s',
            'Ś'=>'S',
            'ť'=>'t',
            'Ť'=>'T',
            'ú'=>'u',
            'Ú'=>'U',
            'ů'=>'u',
            'Ů'=>'U',
            'ü'=>'u',
            'Ü'=>'U',
            'ù'=>'u',
            'Ù'=>'U',
            'ũ'=>'u',
            'Ũ'=>'U',
            'û'=>'u',
            'Û'=>'U',
            'ý'=>'y',
            'Ý'=>'Y',
            'ž'=>'z',
            'Ž'=>'Z',
            'ź'=>'z',
            'Ź'=>'Z'
        );

        return strtr($text, $prevodni_tabulka);
    }
    
    
    public function geocodeQuery($query, $lang, $limit, $type, $locality, $preferBBox = null, $preferNear = null, $preferNearPrecision = null)
    {
        $baseUrl = env('MAPY_BASE_URL');
        if(empty($baseUrl)){
            $baseUrl = 'https://api.mapy.cz/v1/';
        }
        $apiKey = env('MAPY_API_KEY');
        if(empty($apiKey)){
            $apiKey = 'VslQ-uJFiWzggZkqoz5codCtEYSFiGQojAhwrB56-kk';
        }
        $client = new Client();
        $endpoint = $baseUrl.'geocode/'; 
        $parameters = [
            'query' => $query,
            'lang' => $lang,
            'limit' => $limit,
            'type' => $type,
            'locality' => $locality,
            'apikey' => $apiKey,
        ];

        // Volitelné parametry
        if ($preferBBox) {
            $parameters['preferBBox'] = $preferBBox;
        }
        if ($preferNear) {
            $parameters['preferNear'] = $preferNear;
        }
        if ($preferNearPrecision) {
            $parameters['preferNearPrecision'] = $preferNearPrecision;
        }

        try {
            $response = $client->request('GET', $endpoint, ['query' => $parameters]);
           
            if ($response->getStatusCode() == 200) {
                $body = $response->getBody();
                $data = json_decode($body, true); // Převede JSON odpověď na pole
                return $data;
            }
        } catch (\Exception $e) {
            return ['error' => $e->getMessage()];
        }

        return null;
    }

    
}
