package com.uas.report.service;

import java.io.IOException;
import java.sql.SQLException;
import java.util.Map;

import org.dom4j.DocumentException;

import com.uas.report.util.Platform;

import net.sf.jasperreports.engine.JRException;

/**
 * 报表打印
 * 
 * @author sunyj
 * @since 2016年8月18日 上午10:55:18
 */
public interface PrintService {

	/**
	 * 导出报表
	 * 
	 * @param userName
	 *            不为null；当前账套用户名
	 * @param profile
	 *            用于标识请求源（B2C、B2B）是正式、测试还是开发版本：prod、test、dev
	 * @param reportName
	 *            不为null；需要导出的报表的名称，不带任何后缀（如导出采购单，即为"Purchase"）
	 * @param whereCondition
	 *            可为null；where之后的条件（包括where）
	 * @param otherParameters
	 *            若模板已指定需要的参数，则不可为null；其他参数，区别于whereCondition，报表某些字段的值取决于这些参数；
	 *            JSON格式，数据为键值对
	 * @param exportFileType
	 *            报表导出的格式，默认为pdf
	 * @return 导出的文件的字节数组
	 * @throws SQLException
	 * @throws DocumentException
	 * @throws IOException
	 * @throws JRException
	 */
	public byte[] export(String userName, String profile, String reportName, String whereCondition,
			String otherParameters, String exportFileType)
			throws JRException, IOException, DocumentException, SQLException;

	/**
	 * 预览报表
	 * 
	 * @param userName
	 *            不为null；当前账套用户名
	 * @param profile
	 *            用于标识请求源（B2C、B2B）是正式、测试还是开发版本：prod、test、dev
	 * @param reportName
	 *            不为null；需要预览的报表的名称，不带任何后缀（如预览采购单，即为"Purchase"）
	 * @param whereCondition
	 *            可为null；where之后的条件（包括where）
	 * @param otherParameters
	 *            若模板已指定需要的参数，则不可为null；其他参数，区别于whereCondition，报表某些字段的值取决于这些参数；
	 *            JSON格式，数据为键值对
	 * @param pageIndex
	 *            分页展示，当前页码，从0开始
	 * @return 报表数据"data": byte[]；总页数"pageSize": Integer
	 * @throws SQLException
	 * @throws DocumentException
	 * @throws IOException
	 * @throws JRException
	 */
	public Map<String, Object> preview(String userName, String profile, String reportName, String whereCondition,
			String otherParameters, Integer pageIndex) throws JRException, IOException, DocumentException, SQLException;

	/**
	 * 获取模板对应的账套
	 * 
	 * 1. 处理B2B账套，如果企业没有自己的模板，则使用B2B的标准模板（返回B2B标准账套） 2.
	 * 有些主账套和子帐套共用主账套的模板，需要进行处理，返回主账套的名称
	 * 
	 * @param userName
	 *            账套名称
	 * @param reportName
	 *            模板名称
	 * @return 处理后的账套
	 */
	public String getMasterOfJrxml(String userName, String reportName);

	/**
	 * 判断该模板在当前条件下的结果数目是否超出限制
	 * 
	 * @param userName
	 *            不为null；当前账套用户名
	 * @param profile
	 *            用于标识请求源（B2C、B2B）是正式、测试还是开发版本：prod、test、dev
	 * @param reportName
	 *            不为null；需要导出的报表的名称，不带任何后缀（如导出采购单，即为"Purchase"）
	 * @param whereCondition
	 *            可为null；where之后的条件（包括where）
	 * @param otherParameters
	 *            若模板已指定需要的参数，则不可为null；其他参数，区别于whereCondition，报表某些字段的值取决于这些参数；
	 *            JSON格式，数据为键值对
	 * @param platform
	 *            请求来自的平台
	 * @return 结果数目超出限制，返回true
	 * @throws SQLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	public boolean overload(String userName, String profile, String reportName, String whereCondition,
			String otherParameters, Platform platform) throws SQLException, IOException, DocumentException;

	/**
	 * 获取该模板在当前条件下的结果数目
	 * 
	 * @param userName不为null；当前账套用户名
	 * @param profile
	 *            用于标识请求源（B2C、B2B）是正式、测试还是开发版本：prod、test、dev
	 * @param reportName
	 *            不为null；需要导出的报表的名称，不带任何后缀（如导出采购单，即为"Purchase"）
	 * @param whereCondition
	 *            可为null；where之后的条件（包括where）
	 * @param otherParameters
	 *            若模板已指定需要的参数，则不可为null；其他参数，区别于whereCondition，报表某些字段的值取决于这些参数；
	 *            JSON格式，数据为键值对
	 * @return 结果数目
	 * @throws SQLException
	 * @throws IOException
	 * @throws DocumentException
	 */
	public int getCount(String userName, String profile, String reportName, String whereCondition,
			String otherParameters) throws SQLException, IOException, DocumentException;

}
