#!/usr/bin/perl
# Copyright (c) 2016-2024 The Hush developers
# Distributed under the GPLv3 software license, see the accompanying
# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
use warnings;
use strict;

# Generate checkpoint data for use in src/chainparams.cpp
my $perday  = 1152;
my $cli     = "./src/dragonx-cli";
my $stride  = shift || 1000;
if ($stride =~ m/help/) {
    print "To generate checkpoint data every 1000 blocks: $0 &> checkpoints.txt\n";
    print "To generate checkpoint data every X blocks: $0 X &> checkpoints.txt\n";
    print "To generate checkpoint data every X blocks starting at height Y: $0 X Y &> checkpoints.txt\n";
    print "To generate checkpoint data every X blocks starting at height Y for -ac_name CHAIN: $0 X Y CHAIN &> checkpoints.txt\n";
    exit 0;
}
unless ($stride == int($stride) and $stride >= 0) {
    print "Invalid stride! Must be an integer > 0\n";
    exit 1;
}
my $start_height = shift || 0;

unless ($start_height == int($start_height) and $start_height >= 0) {
    print "Invalid start_height! Must be an integer > 0\n";
    exit 1;
}

my $acname = shift;
if ($acname) {
    # TODO: is acname valid?
    $cli .= " -ac_name=$acname";
    # HSC's by default have a blocktime of 60s
    $perday = 1440;
} else {
    $acname = 'DRAGONX';
}

my $gethash = "$cli getblockhash";
my $count   = 0;
my $blocks  = qx{$cli getblockcount};
if($?) {
    print "ERROR, exiting...\n";
    exit 1;
}
my $prev    = $blocks - $perday;
my $last    = 0;
my $now     = time();
chomp($blocks);

print "// Generated at $now via dragonx util/checkpoints.pl\n";

while (1) {
	$count++;
	my $block = $start_height + $stride*$count;
	if ($block > $blocks) {
		$last = $start_height + $stride*($count-1);
        #print "last checkpointed block=$last\n";
        last;
    }
	my $blockhash = qx{$gethash $block};
	chomp $blockhash;
	print qq{($block,     uint256S("0x$blockhash"))\n};
}
my $time    = qx{$cli getblock $last |grep time|cut -d: -f2| sed 's/,//g'};
chomp($time);
# TODO: This is Linux-only and assumes new (not legacy) dir
my $line1       = qx{grep --text height=$prev   ~/.hush/$acname/debug.log};
my $line2       = qx{grep --text height=$blocks ~/.hush/$acname/debug.log};
my $txs_per_day = 2 * $perday; # default estimate is 2 txs per block, on average
my $total_txs   = 0;
#print "line1: $line1\n";
#print "line2: $line2\n";

# This will calculate the number of txs in the previous day to the last checkpointed block
if ($line1 =~ m/tx=(\d+)/) {
    my $tx1 = $1; # number of txs in the block 1 day ago
    #print "prevblock has $tx1 txs\n";
    if ($line2 =~ m/tx=(\d+)/) {
        $total_txs = $1;
        # TODO: average of last N days might be better
        $txs_per_day  = $total_txs - $tx1;
    }
}
print ",(int64_t) $time, // time of last checkpointed block\n";
print "(int64_t) $total_txs,      // total txs\n";
print "(double)  $txs_per_day        // txs in the last day before block $blocks\n";
