#!/usr/bin/perl -w

our $version = "1.0.4";

########################################################################
#
# portspage (http://www.karsikkopuu.net/crux/scripts/)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# 2017 milis linux talimatnamesine uyarlama - milisarge
########################################################################

use strict;

our %options =
(
	title => "Milis Linux Talimatnamesi",
	timestamp_accuracy => 1,
	date_from_file => 0,
);

sub print_usage
{
	print <<EOT;
Usage: talimatname_indeks_yap [paremetre]... [dizin]

  --title=TITLE               set the page title
  --header=FILE               name of file to insert before port listing
  --footer=FILE               name of file to insert after port listing
  --timestamp-accuracy=LEVEL  0 = no timestamp, 1 = date only, 2 = date and time
                              default is 1
  --date-from-file            take date from newest file instead of directory
  --date-from-pkgfile         take date from Pkgfile instead of directory
  --version                   output version information and exit

EOT
}

sub parse_args
{
	foreach my $arg (@ARGV)
	{
		if ($arg =~ /^--header=(.*)$/)
		{
			$options{header} = $1;
		}
		elsif ($arg =~ /^--footer=(.*)$/)
		{
			$options{footer} = $1;
		}
		elsif ($arg =~ /^--title=(.*)$/)
		{
			$options{title} = $1;
		}
		elsif ($arg =~ /^--timestamp-accuracy=(0|1|2)$/)
		{
			$options{timestamp_accuracy} = $1;
		}
		elsif ($arg =~ /^--date-from-file$/)
		{
			$options{date_from_file} = 1;
		}
		elsif ($arg =~ /^--date-from-pkgfile$/)
		{
			$options{date_from_pkgfile} = 1;
		}
		elsif ($arg =~ /^--version$/)
		{
			print "$version\n";
			exit 0;
		}
		elsif ($arg =~ /^--help$/)
		{
			print_usage();
			exit 0;
		}
		else
		{
			$options{directory} = $arg;
		}
	}
}

sub recurse_tree
{
	my $path = shift;
	my @list;

	while ($path =~ s/\/\//\//g) {}
	$path =~ s/\/$//;

	opendir(DIR, $path) or return;
	ENTRY:
	foreach my $entry(sort(readdir(DIR)))
	{
		next ENTRY if $entry eq ".";
		next ENTRY if $entry eq "..";
		push (@list, "$path/$entry") if -f "$path/$entry";
		push (@list, recurse_tree("$path/$entry")) if -d "$path/$entry";
	}

	return @list;
}

sub parse_pkgfile
{
	my %parsed;
	my $pkgfile = shift;

	if (open (FILE, $pkgfile))
	{
		while (<FILE>)
		{
			if ($_ =~ /^#\s*(.*?):\s*(.*)$/)
			{
				my $key = $1;
				my $value = $2;
				$value =~ s/</&lt;/g;
				$value =~ s/>/&gt;/g;
				$value =~ s/&/&amp;/g;
				$parsed{$key} = $value;
			}
			elsif ($_ =~ /^version=(.*)$/)
			{
				$parsed{version} = $1;
			}
			elsif ($_ =~ /^release=(.*)$/)
			{
				$parsed{release} = $1;
			}
		}
		close (FILE);
	}

	return { %parsed };
}

sub main
{
	my %db;

	parse_args();

	if (!$options{directory})
	{
		print_usage();
		return 0;
	}

	foreach my $file (recurse_tree($options{directory}))
	{
		if ($file =~ q:.*/(.*)/talimat$:)
		{
			$db{$1} = parse_pkgfile("$file");
		}
	}

	print <<EOH;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xml:lang="tr" lang="tr" xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
<meta http-equiv="content-type" contentType="text/html;">

EOH

	print "  <title>$options{title}</title>\n";

	print <<EOH;
  <style type="text/css">
   body
   {
    font-family: Verdana, sans-serif;
    font-size: 85%;
    padding: 2em;
   }
   a
   {
    color: black;
   }
   table
   {
    border: solid #CAD4E9 1px;
    font-size: 85%;
   }
   td
   {
    padding: 6px;
   }
   tr.header
   {
    background-color: #CAD4E9;
   }
   tr.odd
   {
    background-color: #ECF0F7;
   }
   tr.even
   {
    background-color: #F7F9FC;
   }
  </style>
  
 </head>
 <body>
EOH

	print "  <h2>$options{title}</h2>\n";

	if ($options{header})
	{
		open(FILE, $options{header}) or die "Couldn't open header file";
		while (<FILE>)
		{
			print "  " . $_;
		}
		close(FILE);
	}

	print "  <table width=\"100%\" cellspacing=\"0\">\n";
	print "   <tr class=\"header\"><td><b>Talimat</b></td><td><b>Sürüm</b></td><td><b>Açıklama</b></td>";
	if ($options{timestamp_accuracy} > 0)
	{
		print "<td><b>Son değişiklik</b></td>";
	}
	print "</tr>\n";
	our $odd = "odd";
	my $count = 0;
	foreach my $port (sort keys %db)
	{
		$count++;
		print "   <tr class=\"$odd\"><td>";
		$db{$port}{URL} ? print "<a href=\"$db{$port}{URL}\">$port</a>" : print "$port";
		print "</td><td><a href=\"$options{directory}/$port/\">$db{$port}{version}-$db{$port}{release}</a></td><td>";
		print $db{$port}{Description} if $db{$port}{Description};
		print "</td>";

		if ($options{timestamp_accuracy} > 0)
		{
			my $date;

			if ($options{date_from_file})
			{
				my @files = recurse_tree("$options{directory}/$port");
				my @dates;
				foreach my $file (@files)
				{
					push (@dates, (stat($file))[9]);
				}
				@dates = sort @dates;
				$date = $dates[$#dates];

			}
			elsif ($options{date_from_pkgfile})
			{
				$date = (stat("$options{directory}/$port/talimat"))[9];
			}
			else
			{
				$date = (stat("$options{directory}/$port"))[9];
			}

			print "<td>" . isotime($date, $options{timestamp_accuracy}) . "</td>";
		}

		print "</tr>\n";

		if ($odd eq "odd") { $odd = "even"; }
		else { $odd = "odd"; }
	}
	print "  </table>\n";
	print "  <p><b>$count talimat</b></p>\n";

	if ($options{footer})
	{
		open(FILE, $options{footer}) or die "Couldn't open footer file";
		while (<FILE>)
		{
			print "  " . $_;
		}
		close(FILE);
	}

	print <<EOH;
 </body>
</html>
EOH

	return 0;
}

sub isotime
{
	my $time = (shift or time);
	my $accuracy = (shift or 2);
	my @t = gmtime ($time);
	my $year = $t[5] + 1900;
	my $month = sprintf("%02d", $t[4] + 1);
	my $day = sprintf("%02d", $t[3]);

	if ($accuracy == 1)
	{
		return "$year-$month-$day";
	}

	return "$year-$month-$day " . sprintf("%02d:%02d:%02d UTC", $t[2], $t[1], $t[0]);
}

exit(main());

# End of file