# Internetový obchod nejen s hrami / generování XML a komunikace s API Zásilkovny
# Copyright © 2025 Martin Zeman <martin@hrejsi.cz>
# Licence: GNU GPL

package zasilkovna;
use utf8;
use Encode;
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
require HTTP::Request;
use Try::Tiny;

my $api_url = 'https://www.zasilkovna.cz/api/rest';
my $api_password = '5e8bd57fe5f50a3135e8e8ea344dc845'; # Heslo Obchodu HrejSi pro komunikování s API


#------------------------------------------------------------------------------
# Vytvoří zásilku na webu Zásilkovny v klientském portálu
#------------------------------------------------------------------------------
sub create_packet
{
    my $objednavka = shift;
    my $na_adresu = shift; # 1 pokud chceme poslat na adresu, 0 pokud posíláme na pobočku Zásilkovny
    my $dodani = '';
    if($na_adresu) {
        $dodani .= "        <addressId>106</addressId>\n"; # Pokud posíláme na adresu, je v této kolonce ID dopravce - pro nás CZ Zásilkovna domů HD - (106)
        # Máme ulici a č.p. dohromady v databázi, nicméně Zásilkovna to chce samostatně
        my $ulice = '';
        my $cislo_domu = '';
        if ($objednavka->{ulice_a_dum} =~ /^(.*)\s+(\d+[a-zA-Z0-9\/\-]*)$/) {
            $ulice = $1;
            $cislo_domu = $2;
        }
        $dodani .= "        <street>$ulice</street>\n";
        $dodani .= "        <houseNumber>$cislo_domu</houseNumber>\n";
        $dodani .= "        <city>$objednavka->{obec}</city>\n";
        $dodani .= "        <zip>$objednavka->{psc}</zip>";
    }
    else {
        $dodani .= "        <addressId>$objednavka->{zasilkovna_id}</addressId>"; # ID pobočky na kterou zboží posíláme
    }
    my $cash_on_delivery = $objednavka->{platba} eq 'hotově' ? $objednavka->{celkem} : 0;
    my $vaha = 1; # Nemáme jak zjistit váhu pomocí zboží (nemáme to implementováno), zatím 1.0, doplníme pak ručně
    my $telefon = $objednavka->{telefon};
    # Pokud máme telefon bez předvolby, musíme ji doplnit, může se stát, že to není české číslo, pak nám pravděpodobně Zásilkovna vyhodí chybu
    # Toto ale odladí většinu čísel:
    if(length($telefon) == 9) {
        $telefon = "420$telefon";
    }
    
    # Samotné XML
    my $xml = <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<createPacket>
    <apiPassword>$api_password</apiPassword>
    <packetAttributes>
        <number>$objednavka->{cas}</number>
        <name>$objednavka->{jmeno}</name>
        <surname>$objednavka->{prijmeni}</surname>
        <email>$objednavka->{email}</email>
        <phone>$telefon</phone>
$dodani
        <cod>$cash_on_delivery</cod>
        <currency>CZK</currency>
        <value>$objednavka->{celkem}</value>
        <weight>$vaha</weight>
        <eshop>Obchod.HrejSi.cz</eshop>
    </packetAttributes>
</createPacket>
EOF
    ;
    # POST do API
    my $header = ['Content-Type' => 'application/xml; charset=UTF-8'];
    my $data = $xml;
    $data =~ s/&/&amp;/g;
    $data =~ s/</&lt;/g;
    $data =~ s/>/&gt;/g;
    my $request = HTTP::Request->new("POST", $api_url, $header, encode('utf8', $xml));
    my $ua = LWP::UserAgent->new;
    my $response = $ua->request($request);
    
    if($response->is_success) {
        my $content = $response->decoded_content;
        
        # Ruční parsování z odpovědi
        my %result;
        $result{status}       = $1 if $content =~ m|<status>(.*?)</status>|s;
        $result{id}           = $1 if $content =~ m|<id>(.*?)</id>|s;
        $result{barcode}      = $1 if $content =~ m|<barcode>(.*?)</barcode>|s;
        $result{barcodeText}  = $1 if $content =~ m|<barcodeText>(.*?)</barcodeText>|s;
        return \%result;
    }
    else {
        my %result;
        $result{status} = '';
        $result{chyba} = "Chyba požadavku: " . $response->status_line;
        return \%result;
    }
}



