<?php
if (!ini_get('display_errors')) {
    ini_set('display_errors', '1');
}
/*
====================== REQUEST PARAMS =========================
    {
        "iznos" : "12,000.11",
        "ime_i_prezime_platitelja" : "Ricardo Čerljenko",
        "adresa_platitelja_ulica_i_broj" : "Prilaz Griža 4",
        "adresa_platitelja_postanski_broj_i_mjesto" : "52220 Labin",
        "naziv_primatelja" : "Masimo Orbanić",
        "adresa_primatelja_ulica_i_broj" : "Dolenji Pucići 16",
        "adresa_primatelja_postanski_broj_i_mjesto" : "52314 Žminj",
        "iban_ili_racun_primatelja" : "HR7024020061100720333",
        "model_racuna_primatelja" : "HR01",
        "poziv_na_broj_primatelja" : "1-0013-2017",
        "sifra_namjene" : "COST",
        "opis_placanja" : "Za dobar dan :)",
        "tip_izlaza" : "png"
    }
*/

// PHP class autoload
require_once("./vendor/autoload.php");

use BigFish\PDF417\PDF417 ;
use BigFish\PDF417\Renderers\ImageRenderer;
use BigFish\PDF417\Renderers\SvgRenderer;

/*
----- Podaci za kodirat u 2D bar kod -----
Redni broj polja	Naziv polja									Duljina polja
-------------------------------------------------------------------------------
1					Zaglavlje									8
2					Valuta										3
3					Iznos										15
4					Ime i prezime platitelja					30
5					Adresa platitelja (ulica i broj)			27
6					Adresa platitelja (postanski broj i mjesto)	27
7					Naziv primatelja							25
8					Adresa primatelja (ulica i broj)			25
9					Adresa primatelja (postanski broj i mjesto)	27
10					IBAN ili raĉun primatelja					21
11					Model raĉuna primatelja						4
12					Poziv na broj primatelja					22
13					sifra namjene								4
14					Opis plaćanja								35
					Ukupno znakova								273
 */

/* VALIDATION Functions */

function generate_vaild_amount($amount){
    $amount_number = 0;
    if(is_string($amount)){
        $secondlast_char = substr($amount, -2,1);
        if($secondlast_char == "," || $secondlast_char == "."){
            $amount .="0";
        }
        $amount_string = str_replace([',','.'], '', $amount);
        if(!preg_match( "(^((?!-)[0-9])*$)" , $amount_string )) return false;
        $amount_number = (int)$amount_string;
    }
    else if(is_float($amount)){
        if($amount<=0) return false;
        $amount_number = round($amount,2);
        $amount_number *= 100; 
    }
    else if(is_numeric($amount)){
        if($amount<=0) return false;
        $amount_number = round($amount,2);
        $amount_number *= 100; 
    } 
    else {
        return false;
    }
    $amount_value_string = (string)$amount_number;
    $amount_length = strlen($amount_value_string);
    $missing = 15-$amount_length;
    $missing_string = "";
    for($i=0; $i<$missing; $i++){ $missing_string .= "0"; }
    $result = $missing_string.$amount_number;
    if(strlen($result) == 15){
        return $result;
    } else {
        return false;
    }
}


function validate_string_input($string,$max_length){
    if(!is_string($string)) return "";
    if(trim($string) === "" )  return "";
    if(strlen($string) > $max_length ) return "";
    if(preg_match("(^((?!\t)[0-9]|[A-Z]|[a-z]|[ŽČĆŠĐžčćšđ.:\-+?'/(), ])*$)" , $string )){
        return $string;
    } else {
        return "";
    }
}

function validate_postal_number_and_place($string){
    if(!is_string($string)) return "";
    if($string === "" )  return "";
    if(strlen($string) > 27 ) return false;
    if(preg_match("(^((?!\t)[0-9]|[A-Z]|[a-z]|[ŽČĆŠĐžčćšđ.:\-+?'/(), ])*$)" , $string )){
        return $string;
    } else {
        return false;
    }
}

function validate_model($string){
    if(!is_string($string)) return ""; 
    if($string === "" ) return "";
    if(strlen($string) != 4 ) return false;
    if(preg_match("/((HR)|(hr)|(Hr)|(hR))((([0-9]){2})$)/" , $string )){
        return $string;
    } else {
        return false;
    }
}

function validate_IBAN($string){
    if(!is_string($string)) return "";
    if($string === "" ) return "";
    if(strlen($string) != 21) return false;
    if(preg_match("/([A-Z]{2})(([0-9]{19})$)/" , $string )){
        return $string;
    } else {
        return false;
    }
}

function validate_purpose($string){
    if(!is_string($string)) return "";
    if($string === "" )  return "";
    if(strlen($string) != 4) return false;
    if(preg_match("/^(([A-Z]){4})$/" , $string )){
        return $string;
    } else {
        return false;
    }
}
/* end of validators */

$errors = [];
if(!isset($_GET['d'])){
    header("Content-type: application/json");
    array_push($errors, "Invalid request params");
    echo json_encode($errors, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
    exit(0);
}

$b64 = $_GET['d'];
$json = base64_decode($b64);
$data = json_decode($json,true);

$tip_izlaza = (isset($data['tip_izlaza']))? $data['tip_izlaza'] : "png";

$input_iznos = $data['iznos'];
$input_ime_i_prezime_platitelja = $data['ime_i_prezime_platitelja'];
$input_adresa_platitelja_ulica_i_broj = $data['adresa_platitelja_ulica_i_broj'];
$input_adresa_platitelja_postanski_broj_i_mjesto = $data['adresa_platitelja_postanski_broj_i_mjesto'];
$input_naziv_primatelja = $data['naziv_primatelja'];
$input_adresa_primatelja_ulica_i_broj = $data['adresa_primatelja_ulica_i_broj'];
$input_adresa_primatelja_postanski_broj_i_mjesto = $data['adresa_primatelja_postanski_broj_i_mjesto'];
$input_iban_ili_racun_primatelja = $data['iban_ili_racun_primatelja'];
$input_model_racuna_primatelja = $data['model_racuna_primatelja'];
$input_poziv_na_broj_primatelja = $data['poziv_na_broj_primatelja'];
$input_sifra_namjene = $data['sifra_namjene'];
$input_opis_placanja = $data['opis_placanja'];

$iznos = generate_vaild_amount($input_iznos);
$ime_i_prezime_platitelja = validate_string_input($input_ime_i_prezime_platitelja,30);
$adresa_platitelja_ulica_i_broj = validate_string_input($input_adresa_platitelja_ulica_i_broj,27);
$adresa_platitelja_postanski_broj_i_mjesto = validate_postal_number_and_place($input_adresa_platitelja_postanski_broj_i_mjesto);
$naziv_primatelja = validate_string_input($input_naziv_primatelja,25);
$adresa_primatelja_ulica_i_broj =validate_string_input($input_adresa_primatelja_ulica_i_broj,25);
$adresa_primatelja_postanski_broj_i_mjesto = validate_postal_number_and_place($input_adresa_primatelja_postanski_broj_i_mjesto);
$iban_ili_racun_primatelja = validate_IBAN($input_iban_ili_racun_primatelja,21);
$model_racuna_primatelja = validate_model($input_model_racuna_primatelja);
$poziv_na_broj_primatelja = validate_string_input($input_poziv_na_broj_primatelja,22);
$sifra_namjene = validate_purpose($input_sifra_namjene);
$opis_placanja = validate_string_input($input_opis_placanja,35);

if($iznos === false) { $errors[] = "Nevažeća cijena"; }
if($ime_i_prezime_platitelja === false) { $errors[] = "Nepravilno ili predugo ime i prezime platitelja"; }
if($adresa_platitelja_ulica_i_broj === false ) { $errors[] = "Nepravilna ili preduga ulica i broj platitelja"; }
if($adresa_platitelja_postanski_broj_i_mjesto  === false ) { $errors[] = "Nevažeći poštanski broj i mjesto (format 'poštanski_broj mjesto')"; }
if($naziv_primatelja === false) { $errors[] = "Nepravilno ili predugo ime i prezime primatelja "; }
if($adresa_primatelja_ulica_i_broj === false) { $errors[] = "Nepravilna ili preduga ulica i broj primatelja"; }
if($adresa_primatelja_postanski_broj_i_mjesto === false) { $errors[] = "Nevažeći poštanski broj i mjesto (format 'poštanski_broj mjesto')"; }
if($iban_ili_racun_primatelja === false) { $errors[] = "Nevažeći IBAN primatelja"; }
if($model_racuna_primatelja === false) { $errors[] = "Nevažeći model plaćanja"; }
if($poziv_na_broj_primatelja === false) { $errors[] = "Nepravilni poziv na broj primatelja"; }
if($sifra_namjene === false ) { $errors[] = "Nevažeći kod namjene"; }
if($opis_placanja === false) { $errors[] = "Nepravilni ili predugi opis plaćanja"; }

if(empty($errors)){
    if(!in_array($tip_izlaza, ["jpg","png","data-url"])){
        $tip_izlaza = "png";
    }
    if(in_array($tip_izlaza, ["jpg","png"])){
        header('Content-type: image/'.$tip_izlaza);
    }
    $zaglavlje = "HRVHUB30";
    $valuta = "HRK";
   
    // Text to be encoded into the barcode
    $hub3_podaci = "$zaglavlje
$valuta
$iznos
$ime_i_prezime_platitelja
$adresa_platitelja_ulica_i_broj
$adresa_platitelja_postanski_broj_i_mjesto
$naziv_primatelja
$adresa_primatelja_ulica_i_broj
$adresa_primatelja_postanski_broj_i_mjesto
$iban_ili_racun_primatelja
$model_racuna_primatelja
$poziv_na_broj_primatelja
$sifra_namjene
$opis_placanja";

    // Encode the data, returns a BarcodeData object
    $pdf417 = new PDF417();
    $data = $pdf417->encode($hub3_podaci);

    /*
    Option 		Default Description
    -------------------------------------------------------------
    format 		png		Output format, one of: jpg, png, gif, tif, bmp, data-url
    quality		90		Jpeg encode quality (1-10)
    scale		3		Scale of barcode elements (1-20)
    ratio		3		Height to width ration of barcode elements (1-10)
    padding		20		Padding in pixels (0-50)
    color		#000000	Foreground color as a hex code
    bgColor		#ffffff	Background color as a hex code
     */

    // Create a PNG image
    $renderer = new ImageRenderer([
        'format' => $tip_izlaza, 
        'quality' => 100,
        'scale' => 10,
        'ratio' => 2,
        'padding' => 20,
    	'color' => "#000000",
    	'bgColor' => "#ffffff"
    ]);

    $image = $renderer->render($data);
    $png_r = $renderer->render($data);
    echo $png_r;

} else {
    header("Content-type: application/json");
    echo json_encode($errors, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
}
?>

