<?php
/**
 * Created by PhpStorm.
 * User: boyer
 * Date: 2020/8/21
 * Time: 17:35
 */
class Api_Inv_Xml{
    protected $InvtHeadType;
    protected $InvtListType =[];
    protected $InvtCbecBill =[];
    protected $OperCusRegCode='4403980A8W';//操作卡的海关十位,暂时写死，要从企业取
    public static $RcvgdEtpsno='4403980A8W';//申报企业海关编码,暂时写死，要从企业取
    protected $DelcareFlag = 0;
    protected $EtpsInnerInvtNo='';
    protected $singleFlag = 0; //生成单一格式的报文
    protected $bgCompany;
    protected $defaultRow;
    public function setInvtHeadType(Api_Inv_InvtHeadType $headType){
        $this->InvtHeadType = $headType;
    }
    public function setSingleFlag($singleFlag){
        $this->singleFlag = $singleFlag;
    }
    /**
     * @todo 获取公司信息
     */
    public function getBgCompany(){
        $InvtHeadType = Common_Common::objectToArray($this->InvtHeadType);
        if($InvtHeadType['EtpsInnerInvtNo']!=''){
            $invtList = Service_InvtList::getByField($InvtHeadType['EtpsInnerInvtNo'],'EtpsInnerInvtNo');
            if(!empty($invtList) && $invtList['bpedbh_id']!=''){
                $bgHead = Service_BgPriEntryDataDetailBodyHead::getByField($invtList['bpedbh_id'],'bpedbh_id');
                if(!empty($bgHead)){
                    $bged = Service_BgPriEntryData::getByField($bgHead['bped_id'],'bped_id');
                    if(!empty($bged)){
                        $bgCompany = Service_BgCompany::getByField($bged['company_code'],'company_code');
                        if(!empty($bgCompany)){
                            $this->bgCompany = $bgCompany;
                        }
                    }
                }
            }
        }
    }
    /**
     * @todo 设置基础数据
     */
    public function getdefaultRow(){
        $defaultRow = array(
            'OperCusRegCode'=>'4403980A8W',
            'RcvgdEtpsno'=>'4403980A8W',
            'sender_id'=>'CUS4403980A8W',
            'receiver_id'=>'E014403980A8W',
            'Ic_Card'=>'2100060052594',
        );
        if(!empty($this->bgCompany)){
            $defaultRow['OperCusRegCode'] = $this->bgCompany['declare_customs_code'];
            $defaultRow['RcvgdEtpsno'] = $this->bgCompany['declare_customs_code'];
            $defaultRow['sender_id'] = $this->bgCompany['s_send_id'];
            $defaultRow['receiver_id'] = $this->bgCompany['s_receiver_id'];
            $defaultRow['Ic_Card'] = $this->bgCompany['card_no'];
        }
        $this->defaultRow = $defaultRow;
    }
    public function addInvtListType(Api_Inv_InvtListType $listType){
        $this->InvtListType[]=$listType;
    }
    public function addInvtCbecBill(Api_Inv_InvtCbecBillType $listType){
        $this->InvtCbecBill[]=$listType;
    }
    public function setEtpsInnerInvtNo($invtNo){
        $this->EtpsInnerInvtNo = $invtNo;
    }
    /**
     * Note:设置直接申报
     * User: Yao
     * Date: 2021/6/3
     * Time: 17:33
     */
    public function setDelcareFlag($flag = 0){
        if($flag!=0 &&$flag!=1){
            throw new Exception('是否申报只能设置0或1');
        }
        $this->DelcareFlag = $flag;
    }
    /**
     * Note:生成报文
     * User: Yao
     * Date: 2020/8/21
     * Time: 18:14
     * @return mixed
     */
    public function toXml(){
        $data=[
                'BussinessData'=>[
                    'InvtMessage'=>[
                        'InvtHeadType'=>$this->InvtHeadType,
                        'InvtListType'=>$this->InvtListType,
                        'SysId'=>'Z7',
                        'OperCusRegCode'=>$this->OperCusRegCode,
                    ],
                    'DelcareFlag'=>$this->DelcareFlag,
                ]
        ];
        if(!empty($this->InvtCbecBill)){
            $data['BussinessData']['InvtMessage']['InvtCbecBill'] = $this->InvtCbecBill;
        }
        if($this->EtpsInnerInvtNo){
            $data['BussinessData']['InvtMessage']['EtpsInnerInvtNo'] = $this->EtpsInnerInvtNo;
        }

        $xmlArray = $this->arrayToData($data);
        return  Common_ArrayToXml::convert($xmlArray,array(
            'rootElementName'=>'DataInfo',
            '_attributes'=>array(
                'version'=>'1.0'
            ),

        ),
            true,
            'UTF-8',
            '1.0',
            [
                'formatOutput' => false,
                'encoding'=>'UTF-8'
            ]
        );
    }
    private function arrayToData($data){
        $return = array();
        foreach ($data as $key=>$value){
            if(is_array($value)){
                $return[$key] = $this->arrayToData($value);
            }elseif(is_object($value)){
                $return[$key] = $value->toArray();
            }else{
                $return[$key] = $value;
            }
        }
        return $return;
    }

    /**
     * @todo 生成单一格式的报文并且压缩
     */
    public function toSingleXml(){
        $this->getBgCompany();
        $this->getdefaultRow();
        $this->singleFlag = 1;
        if($this->singleFlag!=0){
            $data=[
                'BussinessData'=>[
                    'InvtMessage'=>[
                        'InvtHeadType'=>$this->InvtHeadType,
                        'InvtListType'=>$this->InvtListType,
                        'SysId'=>'Z7',
                        'OperCusRegCode'=>$this->OperCusRegCode,
                    ],
                    'DelcareFlag'=>$this->DelcareFlag,
                ]
            ];
            if(!empty($this->InvtCbecBill)){
                $data['BussinessData']['InvtMessage']['InvtCbecBill'] = $this->InvtCbecBill;
            }
            if($this->EtpsInnerInvtNo){
                $data['BussinessData']['InvtMessage']['EtpsInnerInvtNo'] = $this->EtpsInnerInvtNo;
            }

            $uid = uniqid("", true);
            $guid = '';
            $hash = strtoupper(hash('ripemd128', $uid . $guid . md5(time() . mt_rand(0, 1000))));
            $guid = substr($hash, 0, 8) . '-' . substr($hash, 8, 4) . '-' . substr($hash, 12, 4) . '-' . substr($hash, 16, 4) . '-' . substr($hash, 20, 12);

            $singleInfo = array(
                'SignedInfo'=>[
                    'CanonicalizationMethod'=>[
                        '_attributes'=>['Algorithm'=>'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'],
                    ],
                    'SignatureMethod'=>[
                        '_attributes'=>['Algorithm'=>'http://www.w3.org/2001/04/xmldsig-more#rsa-md5'],
                    ],
                    'Reference'=>[
                        '_attributes'=>['URI'=>'String'],
                        'DigestMethod'=>'',
                        'DigestValue'=>'',
                    ],
                    'KeyInfo'=>[
                        'KeyName'=>'aa'
                    ],
                ],
                'Object'=>[
                    'Package'=>[
                        'EnvelopInfo'=>[
                            'business_id'=>$guid,
                            'file_name'=>$guid.".xml",
                            'message_type'=>'INV101',
                            'sender_id'=>$this->defaultRow['sender_id'],
                            'receiver_id'=>$this->defaultRow['receiver_id'],
                            'Ic_Card'=>$this->defaultRow['Ic_Card'],
                            'send_time'=>date("Y-m-d H:i:s",time())
                        ],
                        'DataInfo'=>$data,
                    ]
                ]
            );

            $xmlArray = $this->arrayToData($singleInfo);

            $convert = Common_ArrayToXml::convert($xmlArray,array(
                'rootElementName'=>'Signature',
                '_attributes'=>array(
                    'xmlns:xsi'=>'http://www.w3.org/2001/XMLSchema-instance'
                ),
            ),
                true,
                'UTF-8',
                '1.0',
                [
                    'formatOutput' => false,
                    'encoding'=>'UTF-8'
                ]
            );
            return $convert;

            //$xmlArray = $this->arrayToData($data);
        }
    }


}