#!/usr/bin/env perl

use strict;
use warnings;

use DateTime;
use YAML::XS;

$| ++;

use Cronos;
use Vulcan::OptConf;

=head1 SYNOPSIS

 $0 [--time] [--link]

=cut
my %o = Vulcan::OptConf->load()->get( qw( link time ) )->dump();
my $dt = DateTime->from_epoch( epoch => @ARGV ? Cronos->epoch( @ARGV ) : time );
my ( %zone, %time ) = DateTime::TimeZone->links();

goto DONE if $o{link};

my %code = map { $_ => scalar DateTime::TimeZone->names_in_country( $_ ) }
    DateTime::TimeZone->countries();
my @name = map { @$_ } values %code;

map { $time{$_} = join ' ', $dt->ymd(), $dt->hms() if ! $time{$_}
    && eval { $dt->set_time_zone( $_ ) } } DateTime::TimeZone->all_names(),
    @name, %zone, map { DateTime::TimeZone->names_in_category( $_ ) }
    DateTime::TimeZone->categories();

%zone = (); map { zone( $_ => $code{$_} ) } sort keys %code;
delete @time{@name}; zone( '' => [ sort keys %time ] );

DONE: YAML::XS::DumpFile \*STDOUT, \%zone;
exit 0;

sub zone ## closure on %o, %zone, %time
{
    my ( $code, $list ) = splice @_;
    if ( $o{time} ) { map { push @{ $zone{ $time{$_} }{$code} }, $_ } @$list }
    else { map { push @{ $zone{$code}{ $time{$_} } }, $_ } @$list }
}
