<?php
class Address {
private $fields = [];
private $missing = [];
private const NOOP = false;
private const UPPER = true;
private const REGION_MAP = [
'NEWSOUTHWALES' => 'NSW',
'VICTORIA' => 'VIC',
'QUEENSLAND' => 'QLD',
'WESTERNAUSTRALIA' => 'WA',
'SOUTHAUSTRALIA' => 'SA',
'TASMANIA' => 'TAS',
'AUSTRALIANCAPITALTERRITORY' => 'ACT',
'NORTHERNTERRITORY' => 'NT',
'ALBERTA' => 'AB',
'BRITISHCOLUMBIA' => 'BC',
'MANITOBA' => 'MB',
'NEWBRUNSWICK' => 'NB',
'NEWFOUNDLAND' => 'NL',
'NEWFOUNDLANDANDLABRADOR' => 'NL',
'NORTHWESTTERRITORIES' => 'NT',
'NOVASCOTIA' => 'NS',
'NUNAVUT' => 'NU',
'ONTARIO' => 'ON',
'PRINCEEDWARDISLAND' => 'PE',
'PEI' => 'PE',
'QUEBEC' => 'QC',
'QB' => 'QC',
'SASKATCHEWAN' => 'SK',
'YUKON' => 'YT',
'ALABAMA' => 'AL',
'ALASKA' => 'AK',
'ARIZONA' => 'AZ',
'ARKANSAS' => 'AR',
'CALIFORNIA' => 'CA',
'COLORADO' => 'CO',
'CONNECTICUT' => 'CT',
'DELAWARE' => 'DE',
'DISTRICTOFCOLUMBIA' => 'DC',
'FLORIDA' => 'FL',
'GEORGIA' => 'GA',
'HAWAII' => 'HI',
'IDAHO' => 'ID',
'ILLINOIS' => 'IL',
'INDIANA' => 'IN',
'IOWA' => 'IA',
'KANSAS' => 'KS',
'KENTUCKY' => 'KY',
'LOUISIANA' => 'LA',
'MAINE' => 'ME',
'MARYLAND' => 'MD',
'MASSACHUSETTS' => 'MA',
'MICHIGAN' => 'MI',
'MINNESOTA' => 'MN',
'MISSISSIPPI' => 'MS',
'MISSOURI' => 'MO',
'MONTANA' => 'MT',
'NEBRASKA' => 'NE',
'NEVADA' => 'NV',
'NEWHAMPSHIRE' => 'NH',
'NEWJERSEY' => 'NJ',
'NEWMEXICO' => 'NM',
'NEWYORK' => 'NY',
'NORTHCAROLINA' => 'NC',
'NORTHDAKOTA' => 'ND',
'OHIO' => 'OH',
'OKLAHOMA' => 'OK',
'OREGON' => 'OR',
'PENNSYLVANIA' => 'PA',
'RHODEISLAND' => 'RI',
'SOUTHCAROLINA' => 'SC',
'SOUTHDAKOTA' => 'SD',
'TENNESSEE' => 'TN',
'TEXAS' => 'TX',
'UTAH' => 'UT',
'VERMONT' => 'VT',
'VIRGINIA' => 'VA',
'WASHINGTON' => 'WA',
'WESTVIRGINIA' => 'WV',
'WISCONSIN' => 'WI',
'WYOMING' => 'WY'
];
public function __construct( array $input ) {
$this->fields = $input;
$this->process();
}
public function process( array $required = [] ): bool {
foreach( $required as $field ) {
if( empty( $this->fields[ $field ] ) ) {
$this->missing[] = $field;
}
}
$rules = [
'name' => [ 100, self::NOOP ],
'street1' => [ 100, self::UPPER ],
'street2' => [ 100, self::UPPER ],
'city' => [ 50, self::UPPER ],
'state' => [ 50, self::UPPER ],
'postcode' => [ 20, self::UPPER ],
'country' => [ 2, self::UPPER ],
'phone' => [ 20, self::NOOP ],
'email' => [ 254, self::NOOP ],
'gifted' => [ 100, self::NOOP ]
];
$clean = [];
foreach( $rules as $field => $config ) {
$value = mb_substr( trim( $this->fields[ $field ] ?? '' ), 0,
$config[ 0 ], 'UTF-8' );
$transform = [
self::NOOP => $value,
self::UPPER => mb_strtoupper( $value, 'UTF-8' )
];
$finalValue = $transform[ $config[ 1 ] ];
if ( $field === 'state' ) {
$lookup = str_replace( ' ', '', $finalValue );
$finalValue = self::REGION_MAP[ $lookup ] ?? $finalValue;
}
$clean[ $field ] = $finalValue;
}
$this->fields = $clean;
return empty( $this->missing );
}
public function export( Session $session ) {
if( empty( $this->missing ) ) {
$session->write( 'user_address', $this->fields );
}
}
public function configure( array &$payload ) {
$payload[ 'shipping_address' ] = [
'phone_number' => $this->fields[ 'phone' ] ?? '',
'name' => $this->fields[ 'name' ] ?? '',
'email' => $this->fields[ 'email' ] ?? '',
'city' => $this->fields[ 'city' ] ?? '',
'country_code' => $this->fields[ 'country' ] ?? '',
'postcode' => $this->fields[ 'postcode' ] ?? '',
'state_code' => $this->fields[ 'state' ] ?? '',
'street1' => $this->fields[ 'street1' ] ?? '',
'street2' => $this->fields[ 'street2' ] ?? ''
];
return $this->fields[ 'country' ] ?? '';
}
public function render() {
if( !$this->isComplete() ) {
echo "<h2>Missing fields</h2><ul>";
foreach( $this->missing as $field ) {
echo "<li>" . $this->escape( $field ) . "</li>";
}
echo "</ul>";
}
}
public function isField( $field, $value ) {
return ($this->fields[ $field ] ?? '') === $value;
}
public function isComplete() {
return empty( $this->missing );
}
private function escape( $value ) {
return htmlspecialchars( $value ?? '', ENT_QUOTES, 'UTF-8' );
}
}