#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package RPS::CountryList;

use strict;
use warnings;

use lib '/app/tools/rps/lib';

use lib '/app/tools/common/lib';

use Common::FormObject;
use base 'Common::FormObject';

# This is a read-only XMLObject, so we don't need any
# of the accessor methods, just create the list of
# items and be on your way.
#
my %gCountries = (
    US  => 'United States',
    EU  => 'European Union',
    XU  => 'Non US',
    AF  => 'Afghanistan',
    AX  => 'Aland Islands',
    AL  => 'Albania',
    DZ  => 'Algeria',
    AS  => 'American Samoa',
    AD  => 'Andorra',
    AO  => 'Angola',
    AI  => 'Anguilla',
    AQ  => 'Antarctica',
    AG  => 'Antigua and Barbuda',
    AR  => 'Argentina',
    AM  => 'Armenia',
    AW  => 'Aruba',
    AU  => 'Australia',
    AT  => 'Austria',
    AZ  => 'Azerbaijan',
    BS  => 'Bahamas',
    BH  => 'Bahrain',
    BD  => 'Bangladesh',
    BB  => 'Barbados',
    BY  => 'Belarus',
    BE  => 'Belgium',
    BZ  => 'Belize',
    BJ  => 'Benin',
    BM  => 'Bermuda',
    BT  => 'Bhutan',
    BO  => 'Bolivia',
    BA  => 'Bosnia and Herzegovina',
    BW  => 'Botswana',
    BV  => 'Bouvet Island',
    BR  => 'Brazil',
    IO  => 'British Indian Ocean Territory',
    BN  => 'Brunei Darussalam',
    BG  => 'Bulgaria',
    BF  => 'Burkina Faso',
    #'BU' => 'Burma', Outdated, now Myanmar MM
    BI  => 'Burundi',
    KH  => 'Cambodia',
    CM  => 'Cameroon',
    CA  => 'Canada',
    #'IC' => 'Canary Islands', part of spain
    CV  => 'Cape Verde',
    KY  => 'Cayman Islands',
    CF  => 'Central African Republic',
    #'EA' => 'Ceuta, Melilla', contested as part of morocco
    TD  => 'Chad',
    CL  => 'Chile',
    CN  => 'China',
    CX  => 'Christmas Island',
    #'CP' => 'Clipperton Island', Uninhabited
    CC  => 'Cocos (Keeling) Islands',
    CO  => 'Colombia',
    KM  => 'Comoros',
    CG  => 'Congo',
    CD  => 'Congo, The Democratic Republic of the',
    CK  => 'Cook Islands',
    CR  => 'Costa Rica',
    CI  => 'Cote D\'Ivoire',
    HR  => 'Croatia',
    CU  => 'Cuba',
    CW  => 'Curacao',
    CY  => 'Cyprus',
    CZ  => 'Czech Republic',
    DK  => 'Denmark',
    #'DG' => 'Diego Garcia', non-civilian only 
    DJ  => 'Djibouti',
    DM  => 'Dominica',
    DO  => 'Dominican Republic',
    #'TP' => 'East Timor', becoming a sovereign state
    EC  => 'Ecuador',
    EG  => 'Egypt',
    SV  => 'El Salvador',
    GQ  => 'Equatorial Guinea',
    ER  => 'Eritrea',
    EE  => 'Estonia',
    ET  => 'Ethiopia',
    FK  => 'Falkland Islands (Malvinas)',
    FO  => 'Faroe Islands',
    FJ  => 'Fiji',
    FI  => 'Finland',
    #'SF' => 'Finland', now FI
    FR  => 'France',
    # FX => 'France, Metropolitan', translates to France
    GF  => 'French Guiana',
    PF  => 'French Polynesia',
    TF  => 'French Southern Territories',
    GA  => 'Gabon',
    GM  => 'Gambia',
    GE  => 'Georgia',
    DE  => 'Germany',
    GH  => 'Ghana',
    GI  => 'Gibraltar',
    GR  => 'Greece',
    GL  => 'Greenland',
    GD  => 'Grenada',
    GP  => 'Guadeloupe',
    GU  => 'Guam',
    GT  => 'Guatemala',
    GG  => 'Guernsey',
    GN  => 'Guinea',
    GW  => 'Guinea-Bissau',
    GY  => 'Guyana',
    HT  => 'Haiti',
    HM  => 'Heard Island and Mcdonald Islands',
    HN  => 'Honduras',
    HK  => 'Hong Kong',
    HU  => 'Hungary',
    IS  => 'Iceland',
    IN  => 'India',
    ID  => 'Indonesia',
    IR  => 'Iran',
    IQ  => 'Iraq',
    IE  => 'Ireland',
    IM  => 'Isle Of Man',
    IL  => 'Israel',
    IT  => 'Italy',
    JE  => 'Jersey',
    JM  => 'Jamaica',
    #'JA' => 'Jamaica', outdated now JM
    JP  => 'Japan',
    JO  => 'Jordan',
    KZ  => 'Kazakhstan',
    KE  => 'Kenya',
    KI  => 'Kiribati',
    KP  => 'Korea, Democratic People\'s Republic Of',
    KR  => 'Korea, Republic Of',
    KW  => 'Kuwait',
    KG  => 'Kyrgyzstan',
    LA  => 'Lao People\'s Democratic Republic',
    LV  => 'Latvia',
    LB  => 'Lebanon',
    LS  => 'Lesotho',
    LR  => 'Liberia',
    LY  => 'Libyan Arab Jamahiriya',
    #'LF' => 'Libya Fezzan', parts of 3 different countries
    LI  => 'Liechtenstein',
    LT  => 'Lithuania',
    LU  => 'Luxembourg',
    MO  => 'Macao',
    MK  => 'Macedonia',
    MG  => 'Madagascar',
    MW  => 'Malawi',
    MY  => 'Malaysia',
    MV  => 'Maldives',
    ML  => 'Mali',
    MT  => 'Malta',
    MH  => 'Marshall Islands',
    MQ  => 'Martinique',
    MR  => 'Mauritania',
    MU  => 'Mauritius',
    YT  => 'Mayotte',
    MX  => 'Mexico',
    FM  => 'Micronesia, Federated States of',
    MD  => 'Moldova, Republic of',
    MC  => 'Monaco',
    MN  => 'Mongolia',
    ME  => 'Montenegro',
    MS  => 'Montserrat',
    MA  => 'Morocco',
    MZ  => 'Mozambique',
    MM  => 'Myanmar',
    NA  => 'Namibia',
    NR  => 'Nauru',
    NP  => 'Nepal',
    NL  => 'Netherlands',
    AN  => 'Netherlands Antilles',
    #'NT' => 'Neutral Zone', area between saudi arabia and iraq treated in 1922
    NC  => 'New Caledonia',
    NZ  => 'New Zealand',
    NI  => 'Nicaragua',
    NE  => 'Niger',
    NG  => 'Nigeria',
    NU  => 'Niue',
    NF  => 'Norfolk Island',
    MP  => 'Northern Mariana Islands',
    NO  => 'Norway',
    OM  => 'Oman',
    PK  => 'Pakistan',
    PW  => 'Palau',
    PS  => 'Palestinian Territory, Occupied',
    PA  => 'Panama',
    PG  => 'Papua New Guinea',
    PY  => 'Paraguay',
    PE  => 'Peru',
    PH  => 'Philippines',
    PN  => 'Pitcairn',
    PL  => 'Poland',
    PT  => 'Portugal',
    PR  => 'Puerto Rico',
    QA  => 'Qatar',
    RE  => 'Reunion',
    RO  => 'Romania',
    RU  => 'Russian Federation',
    RW  => 'Rwanda',
    BL  => 'Saint Barthelemy',
    SH  => 'Saint Helena',
    KN  => 'Saint Kitts and Nevis',
    LC  => 'Saint Lucia',
    MF  => 'Saint Martin',
    PM  => 'Saint Pierre and Miquelon',
    VC  => 'Saint Vincent and The Grenadines',
    WS  => 'Samoa',
    SM  => 'San Marino',
    ST  => 'Sao Tome and Principe',
    SA  => 'Saudi Arabia',
    SN  => 'Senegal',
    CS  => 'Serbia and Montenegro',
    RS  => 'Serbia',
    SC  => 'Seychelles',
    SL  => 'Sierra Leone',
    SG  => 'Singapore',
    SK  => 'Slovakia',
    SI  => 'Slovenia',
    SB  => 'Solomon Islands',
    SO  => 'Somalia',
    ZA  => 'South Africa',
    GS  => 'South Georgia and the South Sandwich Islands',
    ES  => 'Spain',
    LK  => 'Sri Lanka',
    SD  => 'Sudan',
    SR  => 'Suriname',
    SJ  => 'Svalbard and Jan Mayen',
    SZ  => 'Swaziland',
    SE  => 'Sweden',
    CH  => 'Switzerland',
    SY  => 'Syrian Arab Republic',
    TW  => 'Taiwan',
    TJ  => 'Tajikistan',
    TZ  => 'Tanzania',
    TH  => 'Thailand',
    TL  => 'Timor-Leste',
    TG  => 'Togo',
    TK  => 'Tokelau',
    TO  => 'Tonga',
    TT  => 'Trinidad and Tobago',
    #'TA' => 'Tristan Da Cunha', undef british protectorate
    TN  => 'Tunisia',
    TR  => 'Turkey',
    TM  => 'Turkmenistan',
    TC  => 'Turks and Caicos Islands',
    TV  => 'Tuvalu',
    UG  => 'Uganda',
    UA  => 'Ukraine',
    AE  => 'United Arab Emirates',
    GB  => 'United Kingdom',
    #'UK' => 'United Kingdom', this is GB not UK
    UM  => 'United States Minor Outlying Islands',
    UY  => 'Uruguay',
    #'SU' => 'Ussr', no longer exists
    UZ  => 'Uzbekistan',
    VU  => 'Vanuatu',
    VA  => 'Vatican City State',
    VE  => 'Venezuela',
    VN  => 'Viet Nam',
    VG  => 'Virgin Islands, British',
    VI  => 'Virgin Islands, U.S.',
    WF  => 'Wallis and Futuna',
    EH  => 'Western Sahara',
    YE  => 'Yemen',
    #'YU' => 'Yugoslavia', now Macedonia
    #'ZR' => 'Zaire', now Democratic Republic of Congo
    ZM  => 'Zambia',
    ZW  => 'Zimbabwe',

);

sub CountryCodeFor
{
	my $countryName = shift;

	$countryName =~ s/^The\s//i;

	my $countryCode;
	while (my ($code, $name) = each %gCountries)
	{
		if(lc($name) eq lc($countryName))
		{
			$countryCode = $code;
		}
	}

	return $countryCode;
}

sub CountryNameFor
{
	my $countryCode = shift;

	return $gCountries{$countryCode};
}

sub _init
{
    my ($self, %args) = @_;

    $self->SUPER::_init(%args);

    $self->{Country} = [];


	# an href of country codes: {'US' => 1}
	#
	my $omit = $args{omit} || {};
	my $include = $args{include};

    foreach my $countryCode (sort {$gCountries{$a} cmp $gCountries{$b}} keys %gCountries)
    {
		next if($omit->{$countryCode} || ( $include && ! $include->{$countryCode} ) );

        if ($countryCode eq 'US')
        {
            unshift @{$self->{Country}}, { CountryCode => $countryCode, Name => $gCountries{$countryCode} };
        }
        else
        {
            push @{$self->{Country}}, { CountryCode => $countryCode, Name => $gCountries{$countryCode} };
        }
    }

    return $self;
}


# --------------------------------------

# AddressCountryList - This will contain a subset of countries that are valid to appear
# in an address... In other words, it will omit pseudo-countries like EU and XU.
#
package RPS::AddressCountryList;
use base 'RPS::CountryList';


sub _init
{
    my ($self, %args) = @_;

    if (! $args{omit})
    {
        $args{omit} = {};
    }
    $args{omit}{XU} = 1;
    $args{omit}{EU} = 1;
    return $self->SUPER::_init(%args);
}

1;
