<?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

 */



/***

 * Class PagSeguroTransactionParser

 */

class PagSeguroTransactionParser extends PagSeguroServiceParser

{



    /***

     * @param $str_xml

     * @return PagSeguroTransactionSearchResult

     */

    public static function readSearchResult($str_xml)

    {



        $parser = new PagSeguroXmlParser($str_xml);

        $data = $parser->getResult('transactionSearchResult');



        $searchResutlt = new PagSeguroTransactionSearchResult();



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

            $searchResutlt->setTotalPages($data['totalPages']);

        }



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

            $searchResutlt->setDate($data['date']);

        }



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

            $searchResutlt->setResultsInThisPage($data['resultsInThisPage']);

        }



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

            $searchResutlt->setCurrentPage($data['currentPage']);

        }



        if (isset($data['transactions']) && is_array($data['transactions'])) {

            $transactions = array();

            if (isset($data["transactions"]['transaction'][0])) {

                $i = 0;

                foreach ($data["transactions"]['transaction'] as $key => $value) {

                    $transactions[$i++] = self::parseTransactionSummary($value);

                }

            } else {

                $transactions[0] = self::parseTransactionSummary($data["transactions"]['transaction']);

            }

            $searchResutlt->setTransactions($transactions);

        }



        return $searchResutlt;

    }



    /***

     * @param $str_xml

     * @return PagSeguroTransaction

     */

    public static function readTransaction($str_xml)

    {



        // Parser

        $parser = new PagSeguroXmlParser($str_xml);



        // <transaction>

        $data = $parser->getResult('transaction');



        $transaction = new PagSeguroTransaction();



        // <transaction> <lastEventDate>

        if (isset($data["lastEventDate"])) {

            $transaction->setLastEventDate($data["lastEventDate"]);

        }



        // <transaction> <date>

        if (isset($data["date"])) {

            $transaction->setDate($data["date"]);

        }



        // <transaction> <code>

        if (isset($data["code"])) {

            $transaction->setCode($data["code"]);

        }



        // <transaction> <reference>

        if (isset($data["reference"])) {

            $transaction->setReference($data["reference"]);

        }



        // <transaction> <recoveryCode>

        if (isset($data["recoveryCode"])) {

            $transaction->setRecoveryCode($data["recoveryCode"]);

        }



        // <transaction> <type>

        if (isset($data["type"])) {

            $transaction->setType(new PagSeguroTransactionType($data["type"]));

        }



        // <transaction> <status>

        if (isset($data["status"])) {

            $transaction->setStatus(new PagSeguroTransactionStatus($data["status"]));

        }



        // <transaction> <cancellationSource>

        if (isset($data["cancellationSource"])) {

            $transaction->setCancellationSource(

                new PagSeguroTransactionCancellationSource($data["cancellationSource"])

            );

        }



        if (isset($data["paymentMethod"]) && is_array($data["paymentMethod"])) {

            // <transaction> <paymentMethod>

            $paymentMethod = new PagSeguroPaymentMethod();



            // <transaction> <paymentMethod> <type>

            if (isset($data["paymentMethod"]['type'])) {

                $paymentMethod->setType(new PagSeguroPaymentMethodType($data["paymentMethod"]['type']));

            }



            // <transaction> <paymentMethod> <code>

            if (isset($data["paymentMethod"]['code'])) {

                $paymentMethod->setCode(new PagSeguroPaymentMethodCode($data["paymentMethod"]['code']));

            }



            $transaction->setPaymentMethod($paymentMethod);

        }



        // <transaction> <paymentLink>

        if (isset($data["paymentLink"])) {

            $transaction->setPaymentLink($data["paymentLink"]);

        }



        // <transaction> <grossAmount>

        if (isset($data["grossAmount"])) {

            $transaction->setGrossAmount($data["grossAmount"]);

        }



        // <transaction> <discountAmount>

        if (isset($data["discountAmount"])) {

            $transaction->setDiscountAmount($data["discountAmount"]);

        }



        // <transaction> <feeAmount>

        if (isset($data["feeAmount"])) {

            $transaction->setFeeAmount($data["feeAmount"]);

        }



        // <transaction> <netAmount>

        if (isset($data["netAmount"])) {

            $transaction->setNetAmount($data["netAmount"]);

        }



        //<transaction><escrowEndDate>

        if (isset($data["escrowEndDate"])) {

            $transaction->setEscrowEndDate($data["escrowEndDate"]);

        }



        // <transaction> <extraAmount>

        if (isset($data["extraAmount"])) {

            $transaction->setExtraAmount($data["extraAmount"]);

        }



        // <transaction> <installmentCount>

        if (isset($data["installmentCount"])) {

            $transaction->setInstallmentCount($data["installmentCount"]);

        }



        // <transaction> <creditorFees>

        if (isset($data["creditorFees"])) {

            $transaction->setCreditorFees(new PagSeguroTransactionCreditorFees($data["creditorFees"]));

        }



        //<transaction><operationalFeeAmount>

        if (isset($data["operationalFeeAmount"])) {

            $transaction->setOperationalFeeAmount($data["operationalFeeAmount"]);

        }



        //<transaction><installmentFeeAmount>

        if (isset($data["installmentFeeAmount"])) {

            $transaction->setInstallmentFeeAmount($data["installmentFeeAmount"]);

        }



        //<transaction><intermediationRateAmount>

        if (isset($data["intermediationRateAmount"])) {

            $transaction->setIntermediationRateAmount($data["intermediationRateAmount"]);

        }



        //<transaction><intermediationFeeAmount>

        if (isset($data["intermediationFeeAmount"])) {

            $transaction->setIntermediationFeeAmount($data["intermediationFeeAmount"]);

        }



        //<transaction><items>

        if (isset($data["items"]['item']) && is_array($data["items"]['item'])) {

            $items = array();

            $i = 0;



            if (isset($data["items"]['item'][0])) {

                foreach ($data["items"]['item'] as $key => $value) {

                    $item = self::parseTransactionItem($value);

                    $items[$i] = $item;

                    $i++;

                }

            } else {

                $items[0] = self::parseTransactionItem($data["items"]['item']);

            }



            // <transaction> <items>

            $transaction->setItems($items);

        }



        if (isset($data["sender"])) {

            // <transaction> <sender>

            $sender = new PagSeguroSender();



            // <transaction> <sender> <name>

            if (isset($data["sender"]["name"])) {

                $sender->setName($data["sender"]["name"]);

            }



            // <transaction> <sender> <email>

            if (isset($data["sender"]["email"])) {

                $sender->setEmail($data["sender"]["email"]);

            }



            if (isset($data["sender"]["phone"])) {

                // <transaction> <sender> <phone>

                $phone = new PagSeguroPhone();



                // <transaction> <sender> <phone> <areaCode>

                if (isset($data["sender"]["phone"]["areaCode"])) {

                    $phone->setAreaCode($data["sender"]["phone"]["areaCode"]);

                }



                // <transaction> <sender> <phone> <number>

                if (isset($data["sender"]["phone"]["number"])) {

                    $phone->setNumber($data["sender"]["phone"]["number"]);

                }



                $sender->setPhone($phone);

            }



            // <transaction><sender><documents>

            if (isset($data["sender"]['documents']) && is_array($data["sender"]['documents'])) {

                $documents = $data["sender"]['documents'];

                if (count($documents) > 0) {

                    foreach ($documents as $document) {

                        $sender->addDocument($document['type'], $document['value']);

                    }

                }

            }



            $transaction->setSender($sender);

        }



        if (isset($data["shipping"]) && is_array($data["shipping"])) {

            // <transaction> <shipping>

            $shipping = new PagSeguroShipping();



            // <transaction> <shipping> <type>

            if (isset($data["shipping"]["type"])) {

                $shipping->setType(new PagSeguroShippingType($data["shipping"]["type"]));

            }



            // <transaction> <shipping> <cost>

            if (isset($data["shipping"]["cost"])) {

                $shipping->setCost($data["shipping"]["cost"]);

            }



            if (isset($data["shipping"]["address"]) && is_array($data["shipping"]["address"])) {

                // <transaction> <shipping> <address>

                $address = new PagSeguroAddress();



                // <transaction> <shipping> <address> <street>

                if (isset($data["shipping"]["address"]["street"])) {

                    $address->setStreet($data["shipping"]["address"]["street"]);

                }



                // <transaction> <shipping> <address> <number>

                if (isset($data["shipping"]["address"]["number"])) {

                    $address->setNumber($data["shipping"]["address"]["number"]);

                }



                // <transaction> <shipping> <address> <complement>

                if (isset($data["shipping"]["address"]["complement"])) {

                    $address->setComplement($data["shipping"]["address"]["complement"]);

                }



                // <transaction> <shipping> <address> <city>

                if (isset($data["shipping"]["address"]["city"])) {

                    $address->setCity($data["shipping"]["address"]["city"]);

                }



                // <transaction> <shipping> <address> <state>

                if (isset($data["shipping"]["address"]["state"])) {

                    $address->setState($data["shipping"]["address"]["state"]);

                }



                // <transaction> <shipping> <address> <district>

                if (isset($data["shipping"]["address"]["district"])) {

                    $address->setDistrict($data["shipping"]["address"]["district"]);

                }



                // <transaction> <shipping> <address> <postalCode>

                if (isset($data["shipping"]["address"]["postalCode"])) {

                    $address->setPostalCode($data["shipping"]["address"]["postalCode"]);

                }



                // <transaction> <shipping> <address> <country>

                if (isset($data["shipping"]["address"]["country"])) {

                    $address->setCountry($data["shipping"]["address"]["country"]);

                }



                $shipping->setAddress($address);

            }



            // <transaction> <shipping>

            $transaction->setShipping($shipping);

        }



        return $transaction;

    }



    /***

     * @param $data

     * @return PagSeguroItem

     */

    private static function parseTransactionItem($data)

    {



        // <transaction> <items> <item>

        $item = new PagSeguroItem();



        // <transaction> <items> <item> <id>

        if (isset($data["id"])) {

            $item->setId($data["id"]);

        }



        // <transaction> <items> <item> <description>

        if (isset($data["description"])) {

            $item->setDescription($data["description"]);

        }



        // <transaction> <items> <item> <quantity>

        if (isset($data["quantity"])) {

            $item->setQuantity($data["quantity"]);

        }



        // <transaction> <items> <item> <amount>

        if (isset($data["amount"])) {

            $item->setAmount($data["amount"]);

        }



        // <transaction> <items> <item> <weight>

        if (isset($data["weight"])) {

            $item->setWeight($data["weight"]);

        }



        return $item;

    }



    /***

     * @param $data

     * @return PagSeguroTransactionSummary

     */

    private static function parseTransactionSummary($data)

    {



        $transactionSummary = new PagSeguroTransactionSummary();



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

            $transactionSummary->setType(new PagSeguroTransactionType($data['type']));

        }

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

            $transactionSummary->setCode($data['code']);

        }

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

            $transactionSummary->setReference($data['reference']);

        }

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

            $transactionSummary->setDate($data['date']);

        }

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

            $transactionSummary->setLastEventDate($data['lastEventDate']);

        }

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

            $transactionSummary->setGrossAmount($data['grossAmount']);

        }

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

            $transactionSummary->setStatus(new PagSeguroTransactionStatus($data['status']));

        }

        if (isset($data["cancellationSource"])) {

            $transactionSummary->setCancellationSource(

                new PagSeguroTransactionCancellationSource($data["cancellationSource"])

            );

        }

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

            $transactionSummary->setNetAmount($data['netAmount']);

        }

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

            $transactionSummary->setDiscountAmount($data['discountAmount']);

        }

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

            $transactionSummary->setFeeAmount($data['feeAmount']);

        }

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

            $transactionSummary->setExtraAmount($data['extraAmount']);

        }

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

            $transactionSummary->setLastEventDate($data['lastEvent']);

        }

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

            $paymentMethod = new PagSeguroPaymentMethod();

            if (isset($data['paymentMethod']['type'])) {

                $paymentMethod->setType(new PagSeguroPaymentMethodType($data['paymentMethod']['type']));

            }

            if (isset($data['paymentMethod']['code'])) {

                $paymentMethod->setCode(new PagSeguroPaymentMethodCode($data['paymentMethod']['code']));

            }

            $transactionSummary->setPaymentMethod($paymentMethod);

        }



        if (isset($data["recoveryCode"])) {

            $transactionSummary->setRecoveryCode($data["recoveryCode"]);

        }

        

        return $transactionSummary;

    }

}

