package itn.let.mjo.cert.web;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.LoginVO;
import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.RedirectUrlMaker;
import itn.let.mjo.cert.service.CertService;
import itn.let.mjo.cert.service.CertVO;

@Controller
public class CertController {
	
	@Resource(name = "certService")
    private CertService certService;
	
	/** EgovMessageSource */
    @Resource(name="egovMessageSource")
    EgovMessageSource egovMessageSource;
    
    @Resource(name = "EgovFileMngService")
	private EgovFileMngService fileService;
    
	/**
	 * 
	 * (관리자)인증서류 목록을 조회한다. (pageing)
	 * /uss/ion/cert/CertSentList.do //발신번호 인증서류
	 * /uss/ion/cert/CertEtcList.do  //기타인증 서류
	 * @param userSearchVO 검색조건정보
	 * @param model 화면모델
	 * @return cmm/uss/umt/EgovUserManage
	 * @throws Exception
	 */
	@RequestMapping({"/uss/ion/cert/CertSentList.do", "/uss/ion/cert/CertEtcList.do"})
	public String certEtcList(@ModelAttribute("searchVO") CertVO certVO, 
		ModelMap model, 
		HttpServletRequest request,
		HttpSession session) throws Exception {
		
 		if(certVO.getPageUnit() != 10) {
			certVO.setPageUnit(certVO.getPageUnit());
		}

		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(certVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(certVO.getPageUnit());
		paginationInfo.setPageSize(certVO.getPageSize());

		certVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		certVO.setLastIndex(paginationInfo.getLastRecordIndex());
		certVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		//userSearchVO.setAdminYn("Y");
		if("".equals(certVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			certVO.setSearchSortCnd("certId");
			certVO.setSearchSortOrd("desc");
		}
		List<CertVO> resultList = new ArrayList<CertVO>();
		String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
		if(pattern.equals("/uss/ion/cert/CertSentList.do")){ //발신인증서류 
			certVO.setCertType("01");
    	}
    	if(pattern.equals("/uss/ion/cert/CertEtcList.do")){ //기타인증서류 
    		certVO.setCertType("09");
    	}
    	
		resultList = certService.selectCertEtcList(certVO);
		
		for(CertVO tempCertVO : resultList) { //첨부파일  id 와 확장자 추출
			if(null != tempCertVO.getAtchFileIds()) {
				if(tempCertVO.getAtchFileIds().contains("^")) { 
					//첨부파일 2개 이상 EX)FILE_000000000011221^FILE_000000000011221|test.jpg^test.PNG
					if(tempCertVO.getAtchFileIds().split("\\|").length > 1) { //형식 맞을때 
						if((tempCertVO.getAtchFileIds().split("\\|")[0]).split("\\^").length > 1) { //형식체크
							List<String> tempFileSn = new ArrayList<>();
							for(int i = 0 ; i < (tempCertVO.getAtchFileIds().split("\\|")[0]).split("\\^").length ; i++){
								tempFileSn.add((tempCertVO.getAtchFileIds().split("\\|")[0]).split("\\^")[i]) ;
							}
							
							List<String> tempOrignlFileNm = new ArrayList<>();
							for(int i = 0 ; i < (tempCertVO.getAtchFileIds().split("\\|")[1]).split("\\^").length ; i++){
								tempOrignlFileNm.add((tempCertVO.getAtchFileIds().split("\\|")[1]).split("\\^")[i].toUpperCase()) ;
							}
							
							tempCertVO.setFileSnList(tempFileSn);
							tempCertVO.setOrignlFileNmList(tempOrignlFileNm);
						}
					}
				}else { //첨부파일 하나일때
					if(tempCertVO.getAtchFileIds().split("\\|").length > 1) { //형식 맞을때 
						List<String> tempFileSn = new ArrayList<>();
						List<String> tempOrignlFileNm = new ArrayList<>();
						tempFileSn.add(tempCertVO.getAtchFileIds().split("\\|")[0]);
						tempOrignlFileNm.add(tempCertVO.getAtchFileIds().split("\\|")[1].toUpperCase());
						tempCertVO.setFileSnList(tempFileSn);
						tempCertVO.setOrignlFileNmList(tempOrignlFileNm);
					}
				}
				
			}
			
		}
		model.addAttribute("resultList", resultList);
		paginationInfo.setTotalRecordCount( resultList.size()> 0 ? ((CertVO)resultList.get(0)).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);


		/*
			String command = "ls -al";  
			shellCmd(command);
			execute("ipconfig");
			execute("ps ef | grep java");
		 */
		if(pattern.equals("/uss/ion/cert/CertSentList.do")){ //발신인증서류 
			return "uss/ion/cert/CertSentList";
    	}
		
		return "uss/ion/cert/CertEtcList";
	}
	
	
	public void execute(String cmd) {
        Process process = null;
        Runtime runtime = Runtime.getRuntime();
        StringBuffer successOutput = new StringBuffer(); // 성공 스트링 버퍼
        StringBuffer errorOutput = new StringBuffer(); // 오류 스트링 버퍼
        BufferedReader successBufferReader = null; // 성공 버퍼
        BufferedReader errorBufferReader = null; // 오류 버퍼
        String msg = null; // 메시지
 
        List<String> cmdList = new ArrayList<String>();
 
        // 운영체제 구분 (window, window 가 아니면 무조건 linux 로 판단)
        if (System.getProperty("os.name").indexOf("Windows") > -1) {
            cmdList.add("cmd");
            cmdList.add("/c");
        } else {
            cmdList.add("/bin/sh");
            cmdList.add("-c");
        }
        // 명령어 셋팅
        cmdList.add(cmd);
        String[] array = cmdList.toArray(new String[cmdList.size()]);
 
        try {
 
            // 명령어 실행
            process = runtime.exec(array);
 
            // shell 실행이 정상 동작했을 경우
            successBufferReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "EUC-KR"));
 
            while ((msg = successBufferReader.readLine()) != null) {
                successOutput.append(msg + System.getProperty("line.separator"));
            }
 
            // shell 실행시 에러가 발생했을 경우
            errorBufferReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), "EUC-KR"));
            while ((msg = errorBufferReader.readLine()) != null) {
                errorOutput.append(msg + System.getProperty("line.separator"));
            }
 
            // 프로세스의 수행이 끝날때까지 대기
            process.waitFor();
 
            // shell 실행이 정상 종료되었을 경우
            if (process.exitValue() == 0) {
                System.out.println("성공");
                System.out.println(successOutput.toString());
            } else {
                // shell 실행이 비정상 종료되었을 경우
                System.out.println("비정상 종료");
                System.out.println(successOutput.toString());
            }
 
            // shell 실행시 에러가 발생
            if ("".equals(errorOutput.toString())) {
                // shell 실행이 비정상 종료되었을 경우
                System.out.println("오류");
                System.out.println(successOutput.toString());
            }
 
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                process.destroy();
                if (successBufferReader != null) successBufferReader.close();
                if (errorBufferReader != null) errorBufferReader.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

	public void shellCmd(String command) throws Exception{
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec(command);
        InputStream is = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while((line = br.readLine()) != null) {
            System.out.println(line);
        }
	}
	
	/**
     * 기타서류관리  등록/수정
     * @param searchVO
     * @param model
     * @return	"/uss/ion/cert/CertSentModify.do"
     * @throws Exception
     */
    @RequestMapping(value = {"/uss/ion/cert/CertSentModify.do" , "/uss/ion/cert/CertEtcModify.do"})
    public String CashModify(
    		@ModelAttribute("searchVO") CertVO searchVO,
            HttpServletRequest request ,
            Model model) throws Exception {
    	
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	
    	List<CertVO> certFileList = new ArrayList<CertVO>();
    	
    	if(pattern.equals("/uss/ion/cert/CertSentModify.do")){ //발신인증서류 
    		searchVO.setCertEtcType("01");
    	}
    	if(pattern.equals("/uss/ion/cert/CertEtcModify.do")){ //기타인증서류 
    		searchVO.setCertEtcType("09");
    	}
    			
    	if(null != searchVO.getCertId() &&  !"".equals(searchVO.getCertId())) { //수정
    		certFileList = certService.selectCertFileList(searchVO);
    	}
    	model.addAttribute("certFileList", certFileList); //CertFile파일정보
    	List<CertVO> fileList = new ArrayList<>();
    	//첨부파일정보
    	 if(certFileList !=null){
 			if(1==certFileList.size() && ((CertVO)certFileList.get(0)).getOrignlFileNm() == null) {
 				
 			}else {
 				fileList.addAll(certFileList);
 			}
 		}
		model.addAttribute("fileList", fileList);
		model.addAttribute("searchVO", searchVO);
		if(pattern.equals("/uss/ion/cert/CertSentModify.do")){ //발신번호 인증 
    		searchVO.setCertEtcType("01");
    		return "/uss/ion/cert/CertSentModify";
    	}
		return "/uss/ion/cert/CertEtcModify";
    }
    
    /*기타서류 삭제 */
    @RequestMapping({"/uss/ion/cert/CertEtcDelete.do" , "/uss/ion/cert/CertSentDelete.do"})
    public String deleteCertEtc(@RequestParam("del") String[] del, 
    			RedirectAttributes redirectAttributes , 
    			 HttpServletRequest request ,
    			Model model) throws Exception {
    	CertVO tempCertVO = new  CertVO();
    	boolean delete = false;
    	List<CertVO> certFileList = new ArrayList<>();
    	String whFile = "";
    	for(String id:del) {
    		tempCertVO.setCertId(id);
    		List<FileVO> fileDelList = new  ArrayList<>(); //파일테이블 삭제 조회
    		fileDelList = certService.selectCertDetailFileList(tempCertVO);
    		for(FileVO delCertFileVo : fileDelList){
    			whFile = delCertFileVo.getWhFile() ;
    			if(whFile !=null){
    				File delFile = new File(whFile);
        			delete = delFile.delete();
    			}
    		}
    		fileService.deleteFileInfs(fileDelList);
    		certService.deleteCertEtc(tempCertVO);
 	   	}
    	redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
    	String pattern = (String) request.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE) ;
    	if(pattern.equals("/uss/ion/cert/CertSentDelete.do")){ //발신번호 인증 
    		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/cert/CertSentList.do");
    		return redirectUrlMaker.getRedirectUrl();
    	}
    	
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/cert/CertEtcList.do");
		return redirectUrlMaker.getRedirectUrl();
    }
    
}
