package com.ibeetl.admin.core.web;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.ibeetl.admin.core.entity.CoreOrg;
import com.ibeetl.admin.core.entity.CoreUser;
import com.ibeetl.admin.core.file.FileItem;
import com.ibeetl.admin.core.file.FileService;
import com.ibeetl.admin.core.service.CorePlatformService;
import com.ibeetl.admin.core.util.FileUtil;

@Controller
public class FileSystemContorller {
  private final Log log = LogFactory.getLog(this.getClass());

  @Autowired CorePlatformService platformService;

  private static final String MODEL = "/core/file";

  /*附件类操作*/
  @PostMapping(MODEL + "/uploadAttachment.json")
  @ResponseBody
  public JsonResult uploadFile(
      @RequestParam("file") MultipartFile file, String batchFileUUID, String bizType, String bizId)
      throws IOException {
    if (file.isEmpty()) {
      return JsonResult.fail();
    }
    CoreUser user = platformService.getCurrentUser();
    CoreOrg org = platformService.getCurrentOrg();
    FileItem fileItem =
        fileService.createFileItem(
            file.getOriginalFilename(),
            bizType,
            bizId,
            user.getId(),
            org.getId(),
            batchFileUUID,
            null);
    OutputStream os = fileItem.openOutpuStream();
    FileUtil.copy(file.getInputStream(), os);
    return JsonResult.success(fileItem);
  }

  @PostMapping(MODEL + "/deleteAttachment.json")
  @ResponseBody
  public JsonResult deleteFile(Long fileId, String batchFileUUID) throws IOException {
    fileService.removeFile(fileId, batchFileUUID);
    return JsonResult.success();
  }

  @GetMapping(MODEL + "/download/{fileId}/{batchFileUUID}/{name}")
  public ModelAndView download(
      HttpServletResponse response, @PathVariable Long fileId, @PathVariable String batchFileUUID)
      throws IOException {
    FileItem item = fileService.getFileItemById(fileId, batchFileUUID);
    response.setHeader(
        "Content-Disposition",
        "attachment; filename=" + URLEncoder.encode(item.getName(), "UTF-8"));
    item.copy(response.getOutputStream());
    return null;
  }

  /*execl 导入导出*/

  @Autowired FileService fileService;

  @GetMapping(MODEL + "/get.do")
  public ModelAndView index(HttpServletResponse response, String id) throws IOException {
    String path = id;
    response.setContentType("text/html; charset = UTF-8");
    FileItem fileItem = fileService.loadFileItemByPath(path);
    response.setHeader(
        "Content-Disposition",
        "attachment; filename=" + java.net.URLEncoder.encode(fileItem.getName(), "UTF-8"));
    fileItem.copy(response.getOutputStream());
    if (fileItem.isTemp()) {
      fileItem.delete();
    }
    return null;
  }

  @GetMapping(MODEL + "/downloadTemplate.do")
  public ModelAndView dowloadTemplate(HttpServletResponse response, String path)
      throws IOException {
    response.setContentType("text/html; charset = UTF-8");
    int start1 = path.lastIndexOf("\\");
    int start2 = path.lastIndexOf("/");
    if (start2 > start1) {
      start1 = start2;
    }
    String file = path.substring(start1 + 1);
    response.setHeader(
        "Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(file, "UTF-8"));
    InputStream input =
        Thread.currentThread()
            .getContextClassLoader()
            .getResourceAsStream("excelTemplates/" + path);
    FileUtil.copy(input, response.getOutputStream());
    return null;
  }

  @GetMapping(MODEL + "/simpleUpload.do")
  public ModelAndView simpleUploadPage(String uploadUrl, String templatePath, String fileType)
      throws IOException {
    ModelAndView view = new ModelAndView("/common/simpleUpload.html");
    view.addObject("uploadUrl", uploadUrl);
    view.addObject("templatePath", templatePath);
    view.addObject("fileType", fileType);

    return view;
  }
}
