#!/usr/bin/perl -w

use strict;
use Getopt::Std;
use MIME::Base64;
use Digest::CRC;
use JSON;

sub usage() {
    die "Usage: $0 [-s] [-m <MQTT Broker address>] [-u <user>] [-P <password>] [-p <MQTT prefix>] [-b <block size>] -i <IMEI> <file>\n";
}

getopts("sm:u:P:p:b:i:", \my %options);

usage() unless defined($options{'i'});

my $file = shift || usage();

my $broker = $options{'m'} // 'localhost';
my $prefix = defined($options{'p'})?$options{'p'}.'/':'';

my $blockSize = $options{'b'} // 512;
my $imei = $options{'i'};

my $qos = 1;

my $mqttCommand = "mosquitto_pub -h ${broker} -t ${prefix}${imei}/firmware";
$mqttCommand .= ' --capath /etc/ssl/certs' if (defined($options{'s'}));
$mqttCommand .= ' -u '.$options{'u'} if (defined($options{'u'}));
$mqttCommand .= ' -P '.$options{'P'} if (defined($options{'P'}));
$mqttCommand .= ' -q '.$qos;

open(my $in, '<', $file) or die "File not found: $file\n";
binmode $in;
open(my $mqtt, "| ${mqttCommand} -l") || die;
my $crc = Digest::CRC->new(type => 'crcccitt');
for (my $i = 0; read($in, my $block, $blockSize);) {
    my %msg = (
        'block' => ++$i,
        'data' => encode_base64($block, '')
    );
    $crc->add($block);
    $msg{'crc'} = $crc->digest() if (eof($in));

    print($mqtt JSON::XS->new->canonical(1)->encode(\%msg), "\n") || die;	# Vytvoření JSON objektu s pořadím prvků
    # print($mqtt encode_json(\%msg), "\n") || die;	# Vytvořeni JSON objektu bez fixniho poradi prvku

    # print(JSON::XS->new->canonical(1)->encode(\%msg), "\n");  # Debug vypis do konzole
}
close($mqtt);
close($in);
