package com.zhsoft88.commons;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.StringTokenizer;

import org.apache.commons.lang.math.NumberUtils;

/**
 * seastar web page structurize
 * @author zhsoft88
 * @since 2008-03-28
 * @update 2008-08-03
 */
public class Seastar {
	
	public static final int PORT = 6373;

	/**
	 * seastar result
	 * @author zhsoft88
	 * @since 2008-3-28
	 */
	public static class SeastarResult {
		private int status;
		private String contents;
		private long elapsedTime;
		
		public SeastarResult(int status,String contents,long elapsedTime) {
			this.status = status;
			this.contents = contents;
			this.elapsedTime = elapsedTime;
		}
		public int getStatus() {
			return status;
		}
		public String getContents() {
			return contents;
		}
		public long getElapsedTime() {
			return elapsedTime;
		}
		@Override
		public String toString() {
			return "[status="+status+",contents="+contents+",elapsedTime="+elapsedTime+"]";
		}
	}

	private String host;
	private int port;

	/**
	 * constructor: localhost
	 */
	public Seastar() {
		this("localhost");
	}
	
	/**
	 * constructor: host
	 * @param host
	 */
	public Seastar(String host) {
		this(host,PORT);
	}
	
	/**
	 * constructor for host,port
	 * @param host
	 * @param port
	 */
	public Seastar(String host,int port) {
		this.host = host;
		this.port = port;
	}
	
	/**
	 * struct contents for specified url
	 * @param url
	 * @return
	 * @throws Exception
	 */
	public SeastarResult structURL(String url) throws Exception {
		long t1 = System.currentTimeMillis();
		Socket socket = new Socket(host,port);
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		bw.write("FETCH "+url+"\r\n");
		bw.write("\r\n");
		bw.flush();
		BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
		String line = br.readLine();
		int status = -1;
		StringTokenizer st = new StringTokenizer(line," ");
		st.nextToken();
		status = NumberUtils.toInt(st.nextToken());
		while ((line=br.readLine())!=null) {
			if (line.length()==0) break;
		}
		StringBuilder sb = new StringBuilder(100);
		int c;
		while ((c=br.read())!=-1) {
			sb.append((char)c);
		}
		socket.close();
		long t2 = System.currentTimeMillis();
		return new SeastarResult(status,sb.toString(),t2-t1);
	}

	/**
	 * struct string content
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public SeastarResult structString(String str) throws Exception {
		long t1 = System.currentTimeMillis();
		Socket socket = new Socket(host,port);
		OutputStream out = socket.getOutputStream();
		byte[] ba = str.getBytes("utf-8");
		out.write(("PARSE "+ba.length+"\r\n\r\n").getBytes());
		out.write(ba);
		out.flush();
		BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
		String line = br.readLine();
		int status = -1;
		StringTokenizer st = new StringTokenizer(line," ");
		st.nextToken();
		status = NumberUtils.toInt(st.nextToken());
		while ((line=br.readLine())!=null) {
			if (line.length()==0) break;
		}
		StringBuilder sb = new StringBuilder(100);
		int c;
		while ((c=br.read())!=-1) {
			sb.append((char)c);
		}
		socket.close();
		long t2 = System.currentTimeMillis();
		return new SeastarResult(status,sb.toString(),t2-t1);
	}
	
	
}
