#------------------------------------------------------------
# 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',
    A1 => 'Anonymous Proxy',
    AQ => 'Antarctica',
    AG => 'Antigua and Barbuda',
    AP => 'Asia/Pacific Region',
    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',
    BQ => 'Caribbean Netherlands',

    #'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',
    XK => 'Kosovo',
    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',
    A2 => 'Satellite Provider',
    SA => 'Saudi Arabia',
    SN => 'Senegal',
    CS => 'Serbia and Montenegro',
    RS => 'Serbia',
    SC => 'Seychelles',
    SL => 'Sierra Leone',
    SG => 'Singapore',
    SX => 'Sint Maarten',
    SK => 'Slovakia',
    SI => 'Slovenia',
    SB => 'Solomon Islands',
    SO => 'Somalia',
    ZA => 'South Africa',
    GS => 'South Georgia and the South Sandwich Islands',
    SS => 'South Sudan',
    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',
    ZZ => 'Unknown/Supported',
    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;
