<?php

class Signin extends AbstractRequest
{
	// const AMOUNT = 100;

  protected function request()
  {
    $message = $this->getHeaderMessage();
    
    $message->setMTI('0800');	// 消息类型: n4 BCD 0800 0810 MSG-TYPE-ID
	$message->setField(11, '000155');	// 11	受卡方系统跟踪号	n6		BCD	M	M	POS终端交易流水
	$message->setField(41, '10009464');	// 41	受卡机终端标识码	ans8		ASCII	M	M	终端代码
	$message->setField(32, '105431080620049');	// 42	受卡方标识码	ans15		ASCII	M	M	商户代码

	/**
	 * 60	自定义域	=>
	 * 三部分组成
	 * 1.	交易类型码	n2		BCD	M	M	填“00”
	 * 2.	批次号	n6		BCD	M	M	
	 * 3.	网络管理信息码	n3 BCD	M	M	单倍长密钥算法终端用001/双倍长密钥算法终端用003/SM4密钥算法终端用005
	 */
	$field60 = '00' . '000155' . '001'
	$message->setField(60, $field60);	// 60	自定义域	n…011	LLLVAR	BCD	M	M	

	/**
	 * 63 	自定义域 =>
	 * 两部分组成
	 * 1. 	操作员代码 AN3
	 * 2. 	签到请求信息
	 *     	1) 下载版本号	An36	ASCII	M	请求为终端的版本号。  01 01 0000 01 01 20180814 
	 *		   格式为厂商(2)+型号(2)+版本号(32) 。不足用空格补足。 32位版本号一般为：应用号0000+终端版本号（厂商+型号+日期）
	 *	   	2) 软件交易类型	An1	ASCII	M	1、消费   2、分期付款  3、积分   4、权益积分 5、.转帐
	 *     	3) 终端序列号	An30	ASCII	C	不足用空格补足
	 */
	$feild63 = '001' . '01010000010120180814                ' . '1' . '105431080620049002610009464	  '
	$message->setField(63, $feild63);	// 63	自定义域	an...080	LLLVAR	ASCII	M

    return $message;
  }

	protected function expectation($response)
	{
		$holdString = $response->getField(37);

		if (!strlen($holdString)) {
			throw new Exception('Empty 37 field in hold');
		}

		if (!is_numeric($holdString)) {
			throw new Exception('Non-numeric 37 field in hold');
		}

		if (!$this->persistent) {
			$this->setConnection();
		}

		// Reversing this hold, to not spam a lot of shit
		$message = $this->getPreparedMessage();
		$message->setMTI('0400');
	  	$message->setField(2, explode("=", Settings::VALID_TRACK2)[0]);
	    $message->setField(3, Settings::PROCESSING_CODE_WITHDRAW);
	    $message->setField(4, sprintf("%012d", self::AMOUNT));
	    $message->setField(19, Settings::CURRENCY_CODE);
	    $message->setField(35, Settings::VALID_TRACK2);
	    $message->setField(37, $holdString);
	    $message->setField(49, Settings::CURRENCY_CODE);

		$answer  = $this->sendMessage($message->pack());
		$reverse = $this->getEmptyMessage();
		$reverse->unpack($answer);

		$reverseString = $reverse->getField(37);
		if (!strlen($reverseString)) {
			throw new \Exception('Empty 37 field in reverse');
		}

		if (!is_numeric($reverseString)) {
			throw new \Exception('Non-numeric 37 field in reverse');
		}

		return true;
	}
}
