package com.pineone.icbms.sda.kb.dto;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.jena.query.DatasetAccessor;
import org.apache.jena.query.DatasetAccessorFactory;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.RDFFormat;

import com.google.gson.Gson;
import com.pineone.icbms.sda.kb.mapper.onem2m.OneM2MContainerMapper;
import com.pineone.icbms.sda.kb.model.TripleMap;

public class OneM2MContainerDTO implements OneM2MDTO {
	private Object _id; // not standard
	private String ty=""; // resourceType;
	private String ri=""; // resourceID **;
	private String rn=""; // resourceName **;
	private String pi=""; // parentID **;
	private String[] lbl={""}; // labels **;
	private String ct=""; // creationTime **;
	private String lt=""; // lastModifiedTime;
	private String cr=""; // creator;
	private String cni=""; // currentNrOfInstances;
	private String cbs=""; // currentByteSize;
	private String _uri=""; // _uri : not standard

	private String mni=""; // maxNrOfInstances;
	private String mbs=""; // maxByteSize;
	private String mia=""; // maxInstanceAge;
	private String et=""; // expirationTime;
	private String acpi=""; // accessControlPolicyIDs;
	private String st=""; // stateTag;
	private String at=""; // announceTo;
	private String aa=""; // announcedAttribute;
	private String or="";// Ontology Reference
	
	public OneM2MContainerDTO(String ty, String ri, String rn, String pi, String[] lbl, String ct, String lt,
			String cr, String cni, String cbs) {
		this.ty = ty;
		this.ri = ri;
		this.rn = rn;
		this.pi = pi;
		this.lbl = lbl;
		this.ct = ct;
		this.lt = lt;
		this.cr = cr;
		this.cni = cni;
		this.cbs = cbs;
	}

	public String get_uri() {
		return _uri;
	}

	public void set_uri(String _uri) {
		this._uri = _uri;
	}

	public Object get_id() {
		return _id;
	}

	public void set_id(String _id) {
		this._id = _id;
	}

	public String getTy() {
		return ty;
	}

	public void setTy(String ty) {
		this.ty = ty;
	}

	public String getRi() {
		return ri;
	}

	public void setRi(String ri) {
		this.ri = ri;
	}

	public String getRn() {
		return rn;
	}

	public void setRn(String rn) {
		this.rn = rn;
	}

	public String getPi() {
		return pi;
	}

	public void setPi(String pi) {
		this.pi = pi;
	}

	public String[] getLbl() {
		return lbl;
	}

	public void setLbl(String[] lbl) {
		this.lbl = lbl;
	}

	public String getCt() {
		return ct;
	}

	public void setCt(String ct) {
		this.ct = ct;
	}

	public String getLt() {
		return lt;
	}

	public void setLt(String lt) {
		this.lt = lt;
	}

	public String getCr() {
		return cr;
	}

	public void setCr(String cr) {
		this.cr = cr;
	}

	public String getCni() {
		return cni;
	}

	public void setCni(String cni) {
		this.cni = cni;
	}

	public String getCbs() {
		return cbs;
	}

	public void setCbs(String cbs) {
		this.cbs = cbs;
	}

	public String getMni() {
		return mni;
	}

	public void setMni(String mni) {
		this.mni = mni;
	}

	public String getMbs() {
		return mbs;
	}

	public void setMbs(String mbs) {
		this.mbs = mbs;
	}

	public String getMia() {
		return mia;
	}

	public void setMia(String mia) {
		this.mia = mia;
	}

	public String getEt() {
		return et;
	}

	public void setEt(String et) {
		this.et = et;
	}

	public String getAcpi() {
		return acpi;
	}

	public void setAcpi(String acpi) {
		this.acpi = acpi;
	}

	public String getSt() {
		return st;
	}

	public void setSt(String st) {
		this.st = st;
	}

	public String getAt() {
		return at;
	}

	public void setAt(String at) {
		this.at = at;
	}

	public String getAa() {
		return aa;
	}

	public void setAa(String aa) {
		this.aa = aa;
	}


	public String getOr() {
		return or;
	}

	public void setOr(String or) {
		this.or = or;
	}

	public String toString() {
		String result = "********************* Container **********************" + "\n _id 	: " + this.get_id()
				+ "\n ty 	: " + this.getTy() + "\n ri 	: " + this.getRi() + "\n rn 	: " + this.getRn()
				+ "\n pi 	: " + this.getPi() + "\n lbl 	: " + this.getLbl() + "\n ct 	: " + this.getCt()
				+ "\n lt 	: " + this.getLt() + "\n cr 	: " + this.getCr() + "\n cni 	: " + this.getCni()
				+ "\n cbs 	: " + this.getCbs() + "\n uri 	: " + this.get_uri() + "\n mni 	: " + this.getMni()
				+ "\n mbs 	: " + this.getMbs() + "\n mia 	: " + this.getMia() + "\n et 	: " + this.getEt()
				+ "\n acpi 	: " + this.getAcpi() + "\n st 	: " + this.getSt() + "\n at 	: " + this.getAt()
				+ "\n aa 	" + ": " + this.getAa() +
				 "\n or 	" + ": " + this.getOr() +"\n ********************* Container **********************";
		return result;
	}

	public static void main(String[] args) {
		String sample = "{     \"_id\" : ObjectId(\"561f27831ee8202c5e307d37\"),     \"rn\" : \"CONTAINER_268\",     \"ty\" : 3,     \"ri\" : \"CONTAINER_268\",     \"pi\" : \"SAE_0\",     \"lbl\" : [          \"switch\",          \"key1\",          \"key2\"     ],     \"et\" : \"20151203T122321\",     \"cr\" : \"//onem2m.herit.net/herit-cse/SAE_5\",     \"mni\" : 100,     \"mbs\" : 1.024e+006,     \"mia\" : 36000,     \"cni\" : 1,     \"cbs\" : 2,     \"_uri\" : \"/herit-in/herit-cse/SAE_0/CONTAINER_268\",     \"ct\" : \"20151015T131147\",     \"lt\" : \"20151015T131147\", \"or\":\"http://www.pineone.com/m2m/SwitchStatusSensor\" }";
		Gson gson = new Gson();
		OneM2MContainerDTO cont = gson.fromJson(sample, OneM2MContainerDTO.class);


		System.out.println(cont);
		
		OneM2MContainerMapper mapper = new OneM2MContainerMapper(cont);
		Model model = ModelFactory.createDefaultModel();
		model.add(mapper.from());
		
		//스트링 변환부분
		RDFDataMgr.write(System.out, model, RDFFormat.NTRIPLES);

		//스트링 변환부분
//		String serviceURI = "http://219.248.137.7:13030/icbms";
//
//		DatasetAccessor	accessor = DatasetAccessorFactory.createHTTP(serviceURI);
//		accessor.deleteDefault();
//		accessor.add(model);
//		
//		
//		QueryExecution q = QueryExecutionFactory.sparqlService(serviceURI	,"select * {?s ?p ?o}"	);
//		ResultSet rs = q.execSelect();
//		ResultSetFormatter.out(rs);;
		
//		model = DatasetAccessorFactory.createHTTP(serviceURI).getModel();
//		System.out.println(model.size());

	}

	@Override
	public void print() {
		System.out.println(this.toString());
	}

	@Override
	public TripleMap<Statement> getTriples() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getStringId() {
		Matcher matcher = Pattern.compile("\"([^\"]*)\"").matcher(_id.toString());
		while (matcher.find()) {
			return matcher.group(1);
		}
		return "";
	}

}