#!/usr/bin/env perl

use strict;
use warnings;

use File::Temp qw(tempdir);
use FindBin qw($Bin);
use JSON::PP qw(decode_json);
use lib "$Bin/../t/lib";
use Test::FitNesse::Slim::FitNesseSuiteAcceptance qw(extract_wiki_from_jar);
use Test::FitNesse::Slim::FitNesseCoverage qw(build_coverage_report render_coverage_markdown);

my $root = "$Bin/..";
my $jar = $ENV{FITNESSE_JAR} || '/opt/fitnesse/fitnesse.jar';
die "FitNesse jar not found at $jar\n" unless -f $jar;
my $audit = read_json("$root/docs/fitnesse-native-suite-audit.json");
my $individual = read_json("$root/docs/fitnesse-slim-acceptance-baseline.json");
my $native = read_json("$root/docs/fitnesse-slim-native-suite-baseline.json");
my $tmp = tempdir('test-slim-coverage-XXXXXX', TMPDIR => 1, CLEANUP => 1);
my $wiki = "$tmp/FitNesseRoot";
extract_wiki_from_jar($jar,$wiki);
my $report = build_coverage_report($audit,$individual,$native,$wiki);
die "FitNesse suite discovery drift: " . join('; ',@{$report->{discoveryDrift}}) . "\n"
  if @{$report->{discoveryDrift}};

write_file("$root/docs/fitnesse-acceptance-coverage.json",
  JSON::PP->new->canonical->pretty->encode($report));
write_file("$root/docs/fitnesse-acceptance-coverage.md",
  render_coverage_markdown($report));
printf "Wrote coverage comparison: %d individual, %d native, %d shared, %d individual-only, %d native-only.\n",
  $report->{inventories}{individual}{count},$report->{inventories}{native}{count},
  $report->{setCounts}{intersection},$report->{setCounts}{individualOnly},
  $report->{setCounts}{nativeOnly};

sub read_json {
  my($path) = @_;
  open my $fh, '<', $path or die "read $path: $!";
  local $/;
  my $data = decode_json(<$fh>);
  close $fh or die "close $path: $!";
  return $data;
}

sub write_file {
  my($path,$text) = @_;
  open my $fh, '>', $path or die "write $path: $!";
  print {$fh} $text or die "write $path: $!";
  close $fh or die "close $path: $!";
  return;
}
