package com.genersoft.iot.vmp.gb28181.transmit.response.impl;

import java.text.ParseException;

import javax.sip.Dialog;
import javax.sip.InvalidArgumentException;
import javax.sip.ResponseEvent;
import javax.sip.SipException;
import javax.sip.address.SipURI;
import javax.sip.header.CSeqHeader;
import javax.sip.header.ViaHeader;
import javax.sip.message.Request;
import javax.sip.message.Response;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.SipLayer;
import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorFactory;
import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;


/**
 * @Description:处理INVITE响应
 * @author: swwheihei
 * @date: 2020年5月3日 下午4:43:52
 */
@Component
public class InviteResponseProcessor implements ISIPResponseProcessor {

	private final static Logger logger = LoggerFactory.getLogger(SIPProcessorFactory.class);

	/**
	 * 处理invite响应
	 * 
	 * @param evt 响应消息
	 * @throws ParseException
	 */
	@Override
	public void process(ResponseEvent evt, SipLayer layer, SipConfig config) throws ParseException {
		try {
			Response response = evt.getResponse();
			int statusCode = response.getStatusCode();
			// trying不会回复
			if (statusCode == Response.TRYING) {
			}
			// 成功响应
			// 下发ack
			if (statusCode == Response.OK) {
				// ClientTransaction clientTransaction = evt.getClientTransaction();
				// if(clientTransaction == null){
				// logger.error("回复ACK时，clientTransaction为null >>> {}",response);
				// return;
				// }
				// Dialog clientDialog = clientTransaction.getDialog();

				// CSeqHeader clientCSeqHeader = (CSeqHeader)
				// response.getHeader(CSeqHeader.NAME);
				// long cseqId = clientCSeqHeader.getSeqNumber();
				// /*
				// createAck函数，创建的ackRequest，会采用Invite响应的200OK，中的contact字段中的地址，作为目标地址。
				// 有的终端传上来的可能还是内网地址，会造成ack发送不出去。接受不到音视频流
				// 所以在此处统一替换地址。和响应消息的Via头中的地址保持一致。
				// */
				// Request ackRequest = clientDialog.createAck(cseqId);
				// SipURI requestURI = (SipURI) ackRequest.getRequestURI();
				// ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME);
				// try {
				// requestURI.setHost(viaHeader.getHost());
				// } catch (Exception e) {
				// e.printStackTrace();
				// }
				// requestURI.setPort(viaHeader.getPort());
				// clientDialog.sendAck(ackRequest);

				Dialog dialog = evt.getDialog();
				CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
				Request reqAck = dialog.createAck(cseq.getSeqNumber());

				SipURI requestURI = (SipURI) reqAck.getRequestURI();
				ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME);
				// String viaHost =viaHeader.getHost();
				//getHost()函数取回的IP地址是“[xxx.xxx.xxx.xxx:yyyy]”的格式，需用正则表达式截取为“xxx.xxx.xxx.xxx"格式
				// Pattern p = Pattern.compile("(?<=//|)((\\w)+\\.)+\\w+");
				// Matcher matcher = p.matcher(viaHeader.getHost());
				// if (matcher.find()) {
				// 	requestURI.setHost(matcher.group());
				// }
				requestURI.setHost(viaHeader.getHost());
				requestURI.setPort(viaHeader.getPort());
				reqAck.setRequestURI(requestURI);
				dialog.sendAck(reqAck);
			}
		} catch (InvalidArgumentException | SipException e) {
			e.printStackTrace();
		}
	}

}
