package Test::Library;

use strict;
use warnings;

use Type::Library
   -base,
   -declare => qw( ISODateTime AddressType2Code CountryCode );
use Type::Utils -all;
use Types::Standard -types;

our $VERSION = 0.02;

use DateTime;

declare ISODateTime =>
    as Str,
    where {
        ($_ =~ m{\A-?[0-9]{4,}-[0-9]{2}-[0-9]{2}T[0-2][0-9]:[0-5][0-9]:[0-5][0-9](?:Z|[-+]?[0-2][0-9]:[0-5][0-9])?\z}) && 
        (validate_datetime($_))
    };

declare AddressType2Code =>
    as enum ['ADDR','PBOX','HOME','BIZZ','MLTO','DLVY'];

declare CountryCode =>
    as Str,
    where {
        ($_ =~ m![A-Z]{2,2}!)
    };

sub validate_datetime {
    my ($date) = @_;

    $date =~ s/\A-//;
    my ($year,$month,$day,$hour,$min) = split /[-Z+:]/, $date;

    eval {
        DateTime->new(
            year  => $year,
            month => $month,
            day   => $day,
        );
    } or return 0;

    return 0 if ( $hour and ( $hour < 0 or $hour > 12 ) );
    return 0 if ( $min  and ( $min < 0 or $min > 59 ) );

    return 1;
}

1;