<?php

/**

 * 2007-2014 [PagSeguro Internet Ltda.]

 *

 * NOTICE OF LICENSE

 *

 *Licensed under the Apache License, Version 2.0 (the "License");

 *you may not use this file except in compliance with the License.

 *You may obtain a copy of the License at

 *

 *http://www.apache.org/licenses/LICENSE-2.0

 *

 *Unless required by applicable law or agreed to in writing, software

 *distributed under the License is distributed on an "AS IS" BASIS,

 *WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 *See the License for the specific language governing permissions and

 *limitations under the License.

 *

 *  @author    PagSeguro Internet Ltda.

 *  @copyright 2007-2014 PagSeguro Internet Ltda.

 *  @license   http://www.apache.org/licenses/LICENSE-2.0

 */



/***

 * Represents an address location, typically for shipping or charging purposes.

 * @see PagSeguroShipping

 */

class PagSeguroAddress

{



    private $postalCode;



    /***

     * Street name

     */

    private $street;



    /***

     * Number

     */

    private $number;



    /***

     * Apartment, suite number or any other qualifier after the street/number pair.

     * Example: Apt 274, building A.

     */

    private $complement;



    /***

     * District, county or neighborhood, if applicable

     */

    private $district;



    /***

     * City

     */

    private $city;



    /***

     * State or province

     */

    private $state;



    /***

     * Country

     */

    private $country;



    /***

     * acronyms and states brazilian

     * @var type

     */

    private static $acronyms = array('acre' => 'AC',

        'alagoas' => 'AL',

        'amapa' => 'AP',

        'amazonas' => 'AM',

        'bahia' => 'BA',

        'ceara' => 'CE',

        'espiritosanto' => 'ES',

        'goias' => 'GO',

        'maranhao' => 'MA',

        'matogrosso' => 'MT',

        'matogrossodosul' => 'MS',

        'matogrossosul' => 'MS',

        'minasgerais' => 'MG',

        'para' => 'PA',

        'paraiba' => 'PB',

        'parana' => 'PR',

        'pernambuco' => 'PE',

        'piaui' => 'PI',

        'riodejaneiro' => 'RJ',

        'riojaneiro' => 'RJ',

        'riograndedonorte' => 'RN',

        'riograndenorte' => 'RN',

        'riograndedosul' => 'RS',

        'riograndesul' => 'RS',

        'rondonia' => 'RO',

        'roraima' => 'RR',

        'santacatarina' => 'SC',

        'saopaulo' => 'SP',

        'sergipe' => 'SE',

        'tocantins' => 'TO',

        'distritofederal' => 'DF');



    /***

     * Initializes a new instance of the Address class

     * @param array $data

     */

    public function __construct(array $data = null)

    {

        if (isset($data['postalCode'])) {

            $this->postalCode = $data['postalCode'];

        }

        if (isset($data['street'])) {

            $this->street = $data['street'];

        }

        if (isset($data['number'])) {

            $this->number = $data['number'];

        }

        if (isset($data['complement'])) {

            $this->complement = $data['complement'];

        }

        if (isset($data['district'])) {

            $this->district = $data['district'];

        }

        if (isset($data['city'])) {

            $this->city = $data['city'];

        }

        if (isset($data['state'])) {

            $this->state = $data['state'];

        }

        if (isset($data['country'])) {

            $this->country = $data['country'];

        }

    }



    /***

     * @return string the street

     */

    public function getStreet()

    {

        return $this->street;

    }



    /***

     * @return string the number

     */

    public function getNumber()

    {

        return $this->number;

    }



    /***

     * @return string the complement

     */

    public function getComplement()

    {

        return $this->complement;

    }



    /***

     * @return string the distrcit

     */

    public function getDistrict()

    {

        return $this->district;

    }



    /***

     * @return string the city

     */

    public function getCity()

    {

        return $this->city;

    }



    /***

     * @return string the state

     */

    public function getState()

    {

        return $this->state;

    }



    /***

     * @return string the postal code

     */

    public function getPostalCode()

    {

        return $this->postalCode;

    }



    /***

     * @return string the country

     */

    public function getCountry()

    {

        return $this->country;

    }



    /***

     * Sets the country

     * @param String $country

     */

    public function setCountry($country)

    {

        $this->country = $country;

    }



    /***

     * Sets the street

     * @param String $street

     */

    public function setStreet($street)

    {

        $this->street = $street;

    }



    /***

     * sets the numbetr

     * @param String $number

     */

    public function setNumber($number)

    {

        $this->number = $number;

    }



    /***

     * Sets the complement

     * @param String $complement

     */

    public function setComplement($complement)

    {

        $this->complement = $complement;

    }



    /***

     * sets the district

     * @param String $district

     */

    public function setDistrict($district)

    {

        $this->district = $district;

    }



    /***

     * Sets the city

     * @param String $city

     */

    public function setCity($city)

    {

        $this->city = $city;

    }



    /***

     * Sets the state

     * @param String $state

     */

    public function setState($state)

    {

        $this->state = $this->treatState($state);

    }



    /***

     * Sets the postal code

     * @param String $postalCode

     */

    public function setPostalCode($postalCode)

    {

        $this->postalCode = $postalCode;

    }



    /***

     * Handle the state to pass in format expected in PagSeguro

     * @param type $defaultState

     * @return string

     */

    private function treatState($defaultState)

    {



        if (strlen($defaultState) == 2) {

            foreach (self::$acronyms as $key => $val) {

                if ($val == strtoupper($defaultState)) {

                    return strtoupper($defaultState);

                }

            }

            return '';

        }



        $state = utf8_decode($defaultState);

        $state = strtolower($state);



        // Code ASCII of the vowel

        $ascii['a'] = range(224, 230);

        $ascii['e'] = range(232, 235);

        $ascii['i'] = range(236, 239);

        $ascii['o'] = array_merge(range(242, 246), array(240, 248));

        $ascii['u'] = range(249, 252);



        // Code ASCII of the others character

        $ascii['b'] = array(223);

        $ascii['c'] = array(231);

        $ascii['d'] = array(208);

        $ascii['n'] = array(241);

        $ascii['y'] = array(253, 255);



        foreach ($ascii as $key => $item) {

            $accents = '';

            foreach ($item as $code) {

                $accents .= chr($code);

            }

            $change[$key] = '/[' . $accents . ']/i';

        }



        $state = preg_replace(array_values($change), array_keys($change), $state);



        $state = preg_replace("/\s/", "", $state);



        foreach (self::$acronyms as $key => $val) {

            if ($key == $state) {

                $acronym = $val;

                return $acronym;

            }

        }



        return '';

    }

}

