#!/usr/bin/env perl

use strict;
use warnings;
use YAML;
use Data::Dumper;
use JSON::MaybeXS;
use Net::Docker::Registry::Client;
use Template;
my $cfg_file = "/etc/cooverview/config.yml";

if ($ENV{NET_SERVER_TYPE} && $ENV{NET_SERVER_TYPE} eq 'Net::Server::PreFork') {
  $cfg_file = "./config.yml";
}

my $config = YAML::LoadFile($cfg_file);
my $drc = Net::Docker::Registry::Client->new(%$config);
my $tconfig = {
  INCLUDE_PATH => $config->{templates_dir} || '/etc/cooverview/templates'
};

my $template = Template->new($tconfig);

print "Content-type:text/html\r\n\r\n";

if ($ENV{REQUEST_METHOD} eq 'POST') {
  my $content;
  read(*STDIN, $content, $ENV{CONTENT_LENGTH}) || die "Cannot read from stdin $ENV{CONTENT_LENGTH}";
  my $data = decode_json($content);

  create_details_html($drc, $data->{container}, $data->{pull_command});
} else {
  create_start_page($config, $drc);
}

exit 0;

################################################################################
# SUBS
################################################################################
sub create_start_page {
  my ($config, $drc) = @_;
  my $content;
  my $repos;
  my $error;

  eval {
    $repos = $drc->repositories();
  };

  $error = "An error occured while generating repository list: $@" if $@;

  $template->process(
    'index.html.tt2',
    {
      error        => $error,
      repositories => $repos,
      css_class    => $config->{css_class} || 'alert-suse',
    }
  ) || die $template->error();
}

sub create_details_html {
  my ($drc, $rep, $pcommand) = @_;
  my $content;
  my $error;
  my $tags = [];
  my $info;

  my $pull_prefix="<span class='pcmd'>$pcommand</span> pull $config->{pull_host}".(($config->{pull_port}) ? ":$config->{pull_port}/" : "/");

  my $data = {
    name => $rep,
    tags => [],
    use_obs_extended_info => $config->{use_obs_extended_info},
  };

  eval {
    my $all_tags = $drc->list_tags($rep);
    die "No tags defined for this image\n" unless $all_tags;
    for my $tag (@{$all_tags}) {
      my $manifest = $drc->manifests($rep, $tag);
      my $tag_data = {
        pull_command => "$pull_prefix$rep:$tag",
        manifest     => $manifest,
        name         => $rep,
	tag          => $tag,
      };
      push @{$data->{tags}}, $tag_data;
    }
    if ($config->{use_obs_extended_info}) {
      $data->{info} = $drc->obs_info_json($rep);
      $data->{project} = $data->{info}->{project};
      if ($config->{build_host}) {
        $data->{project_href} = ($config->{build_host}->{proto} || 'https')."://$config->{build_host}->{host}/project/show/$data->{info}->{project}";
      }
      $data->{repository} = $data->{info}->{repository};
      foreach my $tag_val (values %{$data->{info}->{tags}}) {
         foreach my $img (@{$tag_val->{images}}) {
           $img->{id} = $img->{imageid};
	   $img->{id} =~ s/.*://;
	   $img->{id} = substr $img->{id}, 0, 12;
	 }
      }
    }
  };
  $data->{error} = $@ if $@;
  # logit($data);
  $template->process('details.tt2', $data) || die $template->error();
}

sub logit {
  my ($msg) = @_;
  open(my $fh, '>>', '/tmp/cooverview.log') || die "Could not open /tmp/cooverview.log: $!";
  print $fh (ref $msg) ? Dumper($msg) : $msg;
  close $fh;
}
