package com.uas.report.service;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.multipart.MultipartFile;

import com.uas.report.schedule.model.TaskInformation;

/**
 * 文件操作
 * 
 * @author sunyj
 * @since 2016年11月2日 下午2:36:46
 */
public interface FileService {

	/**
	 * 自动对新部署的账套进行下载模板、解压、配置路径等操作
	 * 
	 * @param sourceUserName
	 *            模板来源（标准账套名称）
	 * @param destinationUserNames
	 *            新部署的账套
	 * @return 部署结果
	 * @throws IOException
	 */
	public String autoDeploy(String sourceUserName, String destinationUserNames) throws IOException;

	/**
	 * 上传文件至指定的账套下
	 * 
	 * @param userName
	 *            账套名，文件上传至相应账套路径下
	 * @param fileType
	 *            上传的文件的类型：jrxml、image、zip、other
	 * @param file
	 *            上传的文件
	 * @return 上传结果
	 */
	public String upload(String userName, String fileType, MultipartFile file);

	/**
	 * 上传文件至指定的路径下
	 * 
	 * @param filePath
	 *            指定的文件路径
	 * @param isAbsolutePath
	 *            文件路径是否为绝对路径，不传的话默认为假
	 * @param files
	 *            上传的文件
	 * @return 上传结果
	 * @throws IOException
	 */
	public String upload(String filePath, Boolean isAbsolutePath, MultipartFile[] files) throws IOException;

	/**
	 * 获取账套下的模板路径
	 * 
	 * @param userName
	 *            账套名称
	 * @param reportName
	 *            模板名称
	 * @return 模板路径
	 */
	public String getJrxmlFilePath(String userName, String reportName);

	/**
	 * 获取账套路径
	 * 
	 * @param userName
	 *            账套名称
	 * @return 账套路径
	 */
	public String getMasterPath(String userName);

	/**
	 * 下载指定账套的标准模板
	 * 
	 * @param userName
	 *            账套名称
	 * @param response
	 * @throws IOException
	 */
	public void downloadStandardJrxmls(String userName, HttpServletResponse response) throws IOException;

	/**
	 * 获取指定账套的标准模板数据
	 * 
	 * @param userName
	 *            账套名称
	 * @return 标准模板数据
	 * @throws IOException
	 */
	public byte[] getStandardJrxmls(String userName) throws IOException;

	/**
	 * 获取账套下的所有资源
	 * 
	 * @param userName
	 *            账套名称
	 * @param response
	 * @throws IOException
	 */
	public void downloadZip(String userName, HttpServletResponse response) throws IOException;

	/**
	 * 下载文件
	 * 
	 * @param filePath
	 *            文件路径
	 * @param isAbsolutePath
	 *            文件路径是否为绝对路径，不传的话默认为假
	 * @param response
	 * @throws IOException
	 */
	public void download(String filePath, Boolean isAbsolutePath, HttpServletResponse response) throws IOException;

	/**
	 * 下载文件
	 * 
	 * @param data
	 *            文件数据
	 * @param fileName
	 *            文件名称
	 * @param response
	 */
	public void download(byte[] data, String fileName, HttpServletResponse response);

	/**
	 * 递归删除文件（夹）
	 * 
	 * @param filePath
	 *            文件（夹）路径
	 * @param isAbsolutePath
	 *            文件（夹）路径是否为绝对路径，不传的话默认为假
	 * @return 文件（夹）绝对路径
	 * @throws IOException
	 */
	public String delete(String filePath, Boolean isAbsolutePath) throws IOException;

	/**
	 * 列出指定路径的文件信息
	 * 
	 * @param filePath
	 *            指定的路径
	 * @param isAbsolutePath
	 *            文件路径是否为绝对路径，不传的话默认为假
	 * @return 文件信息，包括name(String)、lastModified(String)、size(Long)、filePath(
	 *         String，可能是相对路径，也可能是绝对路径，具体取决于isAbsolutePath)、isDirectory(Boolean)
	 * @throws IOException
	 */
	public List<Map<String, Object>> listFiles(String filePath, Boolean isAbsolutePath) throws IOException;

	/**
	 * 判断文件是否有效（文件存在并且未过有效期，并且比模板新）
	 * 
	 * @param fileAbsolutePath
	 *            所指定的文件绝对路径
	 * @param jrxmlFileAbsolutePath
	 *            文件对应的模板路径
	 * @return 是否有效
	 */
	public boolean isFileValid(String fileAbsolutePath, String jrxmlFileAbsolutePath);

	/**
	 * 根据报表名、账套名等生成文件名（文件名：reportName + hashCode）
	 * 
	 * @param userName
	 *            不为null；当前账套用户名
	 * @param profile
	 *            可为null；用于标识请求源（B2C、B2B）是正式、测试还是开发版本：prod、test、dev
	 * @param whereCondition
	 *            可为null；where之后的条件（包括where）
	 * @param otherParameters
	 *            可为null；若模板已指定需要的参数，则不可为null；其他参数，区别于whereCondition，
	 *            报表某些字段的值取决于这些参数； JSON格式，数据为键值对
	 * @param exportFileType
	 *            导出为文件时，文件的格式（pdf、xls、xls_with_only_data等）
	 * @return 生成的文件名（不含后缀名）
	 */
	public String generateFileName(String userName, String profile, String whereCondition, String otherParameters,
			String exportFileType);

	/**
	 * 获取给定的pdf文件的页数
	 * 
	 * @param pdfFileAbsolutePath
	 *            给定的pdf文件绝对路径
	 * @return pdf文件的页数
	 * @throws IOException
	 */
	public int getPageSize(String pdfFileAbsolutePath) throws IOException;

	/**
	 * 开启删除产生的pdf等文件的定时任务
	 * 
	 * @param taskPeriod
	 *            定时任务间隔时间（毫秒）
	 * @return
	 */
	public TaskInformation newDeleteGeneratedFilesTask(Integer taskPeriod);
}
