package com.cku.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.*;

import com.cku.core.ZAErrorCode;
import com.cku.core.RESTResponse;
import com.cku.core.ZAException;

public class ServletUtils
{
	public static boolean isHttps(HttpServletRequest r)
	{
		//String authority = r.getScheme();
		//return authority == "https";
		return true;
	}

	public static void writeResponse(HttpServletResponse response, RESTResponse r) throws IOException
	{
		response.setHeader("Content-type", "application/json;charset=UTF-8");
		response.setHeader("Access-Control-Allow-Origin", "*");
		response.setHeader("Access-Control-Allow-Credentials", "true");
		response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
		response.setHeader("Access-Control-Allow-Headers", "Content-Type, Content-Length, Connection, Cache-Control");
		StreamUtils.writeStream(response.getOutputStream(), r);
		
		if (r.getRc() != 0)
		{
			response.setStatus(200);
		}
		response.flushBuffer();
	}
	
	public static String getParameter(HttpServletRequest r, String paramName, String defaultVal)
	{
		String p = r.getParameter(paramName);
		if (p == null) return defaultVal;
		
		return p;
	}

	public static String getParameter(HttpServletRequest r, String paramName) throws ZAException
	{
		String p = r.getParameter(paramName);
		Debugger.doAssert(p != null, ZAErrorCode.ZA_ERC_INVALID_PARAMETER, String.format("paremeter '%s' was not found", paramName));
		
		return p;
	}
	
	public static String getHeader(HttpServletRequest r, String paramName) throws ZAException
	{
		String p = r.getHeader(paramName);
//		Debugger.doAssert(p != null, ZAErrorCode.ZA_ERC_INVALID_PARAMETER, String.format("paremeter '%s' was not found", paramName));
		return p;
	}
	
	public static Long getParameterLong(HttpServletRequest r, String paramName, Long defaultVal)
	{
		String p = r.getParameter(paramName);
		if (p == null) return defaultVal;
		
		try
		{
			return Long.parseLong(p);
		}
		catch (Exception e)
		{
			return defaultVal;
		}
	}
	
	public static long getParameterLong(HttpServletRequest r, String paramName) throws ZAException
	{
		String p = r.getParameter(paramName);
		Debugger.doAssert(p != null, ZAErrorCode.ZA_ERC_INVALID_PARAMETER, String.format("paremeter '%s' was not found", paramName));
		
		return Long.parseLong(p);
	}

	public static Integer getParameterInt(HttpServletRequest r, String paramName, Integer defaultVal)
	{
		String p = r.getParameter(paramName);
		if (p == null) return defaultVal;
		
		try
		{
			return Integer.parseInt(p);
		}
		catch (Exception e)
		{
			return defaultVal;
		}
	}

	public static Integer getParameterInt(HttpServletRequest r, String paramName) throws ZAException
	{
		String p = r.getParameter(paramName);
		Debugger.doAssert(p != null, ZAErrorCode.ZA_ERC_INVALID_PARAMETER, String.format("paremeter '%s' was not found", paramName));
		
		return Integer.parseInt(p);
	}

	public static PageBean getParameterBean(HttpServletRequest request)
	{
		Long limit = getParameterLong(request, "limit", Long.MAX_VALUE);
		Long page = getParameterLong(request, "page", (long)1);
		int needCount = getParameterInt(request,"needCount",1);
		return new PageBean(page, limit,needCount==1);
	}

	/**
	 * 得到分页 默认10条
	 * @param request
	 * @return
     */
	public static PageBean getParameterBeanWith10(HttpServletRequest request)
	{
		Long limit = getParameterLong(request, "limit", (long)10);
		Long page = getParameterLong(request, "page", (long)1);
		int needCount = getParameterInt(request,"needCount",1);
		return new PageBean(page, limit,needCount==1);
	}
	public static void writeResponse(HttpServletResponse response, String localPath, String name) throws IOException
	{
		File f = new File(localPath);
		long size = f.length();
		InputStream fis2 = new FileInputStream(localPath);
		
		try
		{
			OutputStream os = response.getOutputStream();
			byte[] bytes = new byte[1 << 16];

			String fName2 = name + PathUtils.getFileExtension(localPath);
			String attachName = new String(fName2.getBytes("GB2312"), "ISO_8859_1"); 
			
			response.addHeader("Content-Disposition", "attachment;filename=" + new String(attachName));
	        response.addHeader("Content-Length", "" + size);
	        response.setContentType("application/octet-stream");
	        
	        while (true)
	        {
	        	int reads = fis2.read(bytes);
	        	if (reads >= 0)
	        	{
	        		os.write(bytes, 0, reads);
	        	}
	        	else
	        	{
	        		break;
	        	}
	        }
	        
	        os.flush();
		}
		catch (Exception e)
		{
			response.reset();
			throw new IOException(e);
		}
		finally
		{
			try { fis2.close(); } catch (Exception e2) {}
		}
	}
}
