package kcg.faics.arrest.web;


import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;

import javax.annotation.Resource;

import kcg.faics.arrest.service.ArrestService;
import kcg.faics.arrest.vo.ArrestCountVO;
import kcg.faics.arrest.vo.ArrestSearchVO;
import kcg.faics.arrest.vo.ArrestVO;
import kcg.faics.cmmn.excel.ExcelExporter;
import kcg.faics.cmmn.service.CodeService;
import kcg.faics.cmmn.vo.CodeVO;
import kcg.faics.sec.AuthType;
import kcg.faics.sec.LoginUserVO;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.support.SessionStatus;

/** 
 * ArrestController.java
 * @author 이영호 
 * @since 2017. 3. 12.
 *
 *  	 수정일                     수정자                                       수정내용
 *  -------------	--------	---------------------------
 *  2017. 3. 12.   이영호				       최초생성
 * 
 */
@Controller
@RequestMapping("/arrest")
public class ArrestController {

	/**
	 * 코드관련 정보 인터페이스.
	 */
	@Resource(name = "codeService")
	private CodeService codeService;
	/**
	 * 나포정보 인터페이스.
	 */
	@Resource(name = "arrestService")
	private ArrestService arrestService;

	
	/**
	 * 중국어선 나포정보 목록화면을 반환한다.
	 * @param arrestSearchVo 나포정보검색객체
	 * @param model 모델객체
	 * @return 중국어선 검거현황 목록화면
	 * @throws Exception 기본예외처리
	 */
	@RequestMapping(value = "/arrestListView.do")
	public String arrestListView(final ArrestSearchVO arrestSearchVo, Model model) throws Exception {
	
		try {
			// 공통코드 조회
			model = getCommonCode(model);
						
			// 중국어선 나포정보 목록 조회
			//arrestList = arrestService.getArrestListAll(arrestSearchVo);
			
			// 중국어선 나포정보 목록 집계정보 조회(단건)
			//arrestCntList = arrestService.getArrestListAllCount(arrestSearchVo);
			
		
			//model.addAttribute("arrestList", arrestList);			
			//model.addAttribute("arrestCntList", arrestCntList);
			model.addAttribute("listFlag", "init");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "/arrest/arrestList.tiles";
	}
	
	
	
	/**
	 * 중국어선 나포정보 목록 검색결과를 반환한다.
	 * 
	 * @param arrestSearchVO 견문 검색 객체
	 * @param model 모델객체
	 * @return 견문검색결과화면
	 * @throws Exception 기본예외처리
	 */
	@RequestMapping(value = "/arrestList.do")
	public String arrestList(@ModelAttribute final ArrestSearchVO arrestSearchVO, Model model) throws Exception {
				
		List<ArrestVO> arrestList = null; // 중국어선나포정보목록	
		ArrestVO arrestCntList = null; // 중국어선나포정보 집계건수
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		
		
		try {
			// 공통코드 조회
			//	model = getCommonCode(model);
			
			model.addAttribute("arrestList", null);
			model.addAttribute("arrestCntList", null);
									
			
			
			// 중국어선 나포정보 목록 조회
			arrestList = arrestService.getArrestList(arrestSearchVO);		
			
			if (arrestList.size() > 0) { 
				// 중국어선 나포정보 집계정보 조회
				arrestCntList = arrestService.getArrestListCount(arrestSearchVO);
			} else {
				arrestCntList = null;
			}
			model.addAttribute("arrestList", arrestList);		
			model.addAttribute("arrestCntList", arrestCntList);
			model.addAttribute("arrestSearchVO", arrestSearchVO);
			
			resultMap.put("msg", "정상으로 조회되었습니다.");
			resultMap.put("code", 0);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "/arrest/arrestResult";
	}
	
	
	
	/**
	 * 중국어선 나포정보 화면에서 필요한 공통코드를 조회한다.
	 * 
	 * @param model 화면에 넘길 Model 객체	 
	 
	 * @return model 객체
	 * @throws Exception 기본예외처리
	 */
	public Model getCommonCode(final Model model) throws Exception {
		List<CodeVO> agencyTypeList = null; // 기관종류
		List<CodeVO> placeList = null;		// 소속
		List<CodeVO> addressList = null;	// 주소
		List<CodeVO> violateTypeList = null; // 위반내용구분
		List<CodeVO> shipTypeList = null; 	// 선종
		List<CodeVO> shipMentList = null; 	// 선적
		List<CodeVO> shipQualityList = null; // 선질	
		List<CodeVO> shipProcTypeList = null; // 선박처리	
		List<CodeVO> invasionTypeList = null; // 침범유형
		List<CodeVO> woDetentionTypeList = null; // 무혐의불구속
		List<CodeVO> marginPaymentYnList = null; // 담보금납부여부
		
		LoginUserVO loginUserVo = new LoginUserVO();
		
		try {
			if (AuthType.LOCAL_HEADQUARTERS == loginUserVo.getAuthType()) {
				placeList = codeService.getPlace1SubList(loginUserVo.getPlace1());
			} else {
				placeList = codeService.getPlace1List(false);
			}
			
			agencyTypeList = codeService.getCodeValues("T002", "");		/* 검거기관대분류 */
			addressList = arrestService.getAddressAreaList("0000");		/* 주소(특별광역시도) */
			violateTypeList = codeService.getCodeValues("T003", "");	/* 위반내용구분  */
			shipTypeList = codeService.getCodeValues("FA81", "");		/* 선종 조회 */
			shipMentList = codeService.getCodeValues("SSRR", "");		/* 선적 */
			shipQualityList = codeService.getCodeValues("T004", "");	/* 선질 */
			shipProcTypeList = codeService.getCodeValues("T007", "");	/* 선박처리 */
			invasionTypeList = codeService.getCodeValues("T006", "");	/* 선박처리 */
			woDetentionTypeList = codeService.getCodeValues("T005", "");	/* 선박처리 */
			marginPaymentYnList = codeService.getCodeValues("T008", "");	/* 담보금납부여부 */
			
			Collections.reverse(marginPaymentYnList);
			//Collections.sort(marginPaymentYnList, comparator);
			//CodeVO codeVO = marginPaymentYnList.get(1);			
			//marginPaymentYnList.set(1, marginPaymentYnList.get(0));
			//marginPaymentYnList.set(0, codeVO);
			
			model.addAttribute("placeList", placeList);
			model.addAttribute("addressList", addressList);
			model.addAttribute("shipQualityList", shipQualityList);
			model.addAttribute("shipMentList", shipMentList);
			model.addAttribute("shipTypeList", shipTypeList);
			model.addAttribute("violateTypeList", violateTypeList);
			model.addAttribute("agencyTypeList", agencyTypeList);
			model.addAttribute("shipProcTypeList", shipProcTypeList);
			model.addAttribute("invasionTypeList", invasionTypeList);
			model.addAttribute("woDetentionTypeList", woDetentionTypeList);
			model.addAttribute("marginPaymentYnList", marginPaymentYnList);
		} catch (Exception e) {
			e.printStackTrace();
		}	
		
		return model;
	}
	
	/**
	 * 중국어선 나포정보 등록/수정화면을 반환한다.
	 * 
	 * @param arrestVo 견문 검색 객체
	 * @param model 모델객체	
	 * @return 견문검색결과화면
	 * @throws Exception 기본예외처리
	 */
	@RequestMapping(value = "/arrestAdd.do")
	public String arrestAdd(final ArrestVO arrestVo, Model model) throws Exception {
		
		try {
			// 공통코드 조회
			model = getCommonCode(model);			
			model.addAttribute("regFlag", "create");
			
		} catch (Exception e) {
			e.printStackTrace();
		}

		return "/arrest/arrestAdd.tiles";
	}

	/**
	 * 중국어선 나포정보 목록화면을 반환한다.
	 * 
	 * @param area 특별광역시도 코드
	 * @param arrestVo 나포정보검색객체
	 * @param model 모델객체
	 * @return 중국어선 검거현황 목록화면
	 * @throws Exception 기본예외처리
	 */
	@RequestMapping(value = "/getAddressAreaList.do")
	public String getAddressAreaList(@RequestParam("area") final String area,
			final ArrestVO arrestVo, final Model model) throws Exception {
		HashMap<String, Object> result = new HashMap<String, Object>();
		List<CodeVO> addressCityList = null;
		try {
			
			/* 특별광역시&도청 목록조회 */
			addressCityList = arrestService.getAddressAreaList(area);
			model.addAttribute("addressCityList", addressCityList);

			result.put("result", "OK");
			result.put("msg", "시목록 조회성공");
		} catch (Exception e) {
			e.printStackTrace();
		}

		return "/arrest/arrestAdd.tiles";
	}

	/**
	 * 하위소속 코드 리스트를 반환한다.
	 * 
	 * @param codeVO
	 *            코드VO
	 * @return 소속 코드 리스트
	 * @throws Exception
	 *             기본 예외 처리
	 */
	@ResponseBody
	@RequestMapping("/getAddressList.json")
	public HashMap<String, Object> getAddressList(final CodeVO codeVO)
			throws Exception {
		HashMap<String, Object> result = new HashMap<String, Object>();
		List<CodeVO> addressCityList = null;
		String area = codeVO.getCode1();

		
		/* 특별광역시&도청 목록조회 */
		addressCityList = arrestService.getAddressAreaList(area);
		result.put("data", addressCityList);
		// model.addAttribute("addressCityList", addressCityList);
		return result;
	}

	/**
	 * 중국어선 나포정보를 등록한다.
	 *	 
	 * @param arrestVO
	 *            중국어선나포정보 객체
	 * @param bindingResult
	 *            바인딩 객체
	 * @param model
	 *            모델 객체
	 * @param status
	 *            세선 상태 객체
	 * @return 게시물 화면
	 * @throws Exception
	 *             기본 예외 처리
	 */
	@RequestMapping(value = "/arrestInsert.do", method = RequestMethod.POST)
	public String arrestTempInsert(
			@ModelAttribute("arrestVO") final ArrestVO arrestVO,
			final BindingResult bindingResult, final Model model,
			final SessionStatus status) throws Exception {
		
		HashMap<String, Object> result = new HashMap<String, Object>();
		try {
						
			arrestVO.setDelYn("N"); // 삭제여부

			
			/* 중국어선 나포정보 등록 */
			result = arrestService.insert(arrestVO);
			
		} catch (Exception e) {
			e.printStackTrace();
		}

		if ((Integer) result.get("result") != 1) {
			return "redirect:/arrest/arrestAdd.do";
		}
		
		return "redirect:/arrest/arrestListView.do";
	}
	
	
	/**
	 * 중국어선 나포정보를 수정한다.	 
	 * @param arrestVO
	 *            나포정보 객체
	 * @param bindingResult
	 *            바인딩 객체
	 * @param model
	 *            모델 객체
	 * @param status
	 *            세선 상태 객체
	 * @return 게시물 화면
	 * @throws Exception
	 *             기본 예외 처리
	 */
	@RequestMapping(value = "/arrestUpdate.do", method = RequestMethod.POST)
	public String arrestUpdate(@ModelAttribute("arrestVO") final ArrestVO arrestVO,
			final BindingResult bindingResult, final Model model, final SessionStatus status) throws Exception {
		
		HashMap<String, Object> result = new HashMap<String, Object>();
		try {

			arrestVO.setDelYn("N"); // 삭제여부
			
			result = arrestService.update(arrestVO);
			
		} catch (Exception e) {
			e.printStackTrace();
		}

		if ((Integer) result.get("result") != 1) {
			return "redirect:/arrest/arrestAdd.do";
		}
		
		return "redirect:/arrest/arrestListView.do";
	}
	
	/**
	 * 중국어선 나포정보를 삭제한다.	 
	 * @param arrestVO
	 *            외사경찰 정보 객체
	 * @param bindingResult
	 *            바인딩 객체
	 * @param model
	 *            모델 객체
	 * @param status
	 *            세선 상태 객체
	 * @return 게시물 화면
	 * @throws Exception
	 *             기본 예외 처리
	 */
	@RequestMapping(value = "/arrestDelete.do", method = RequestMethod.POST)
	public String arrestDelete(@ModelAttribute("arrestVO") final ArrestVO arrestVO,
			final BindingResult bindingResult, final Model model, final SessionStatus status) throws Exception {
		
		HashMap<String, Object> result = new HashMap<String, Object>();
		try {
						
			arrestVO.setDelYn("Y"); // 삭제여부		
			
			result = arrestService.delete(arrestVO);
			
		} catch (Exception e) {
			e.printStackTrace();
		}

		if ((Integer) result.get("result") != 1) {
			return "redirect:/arrest/arrestAdd.do";
		}
		
		return "redirect:/arrest/arrestListView.do";
	}
	
	/**
	 * 중국어선 나포정보를 반환한다.
	 * 
	 * @param arrestVO 
	 * @param model 모델 객체
	 * @return 중국어선나포정보 수정화면
	 * @throws Exception 기본 예외 처리
	 */
	@RequestMapping("/arrestView.do")
	public String arrestView(final ArrestVO arrestVO, Model model) throws Exception {
				
		try {
			// 중국어선 나포정보 단건조회 
			ArrestVO result = arrestService.select(arrestVO);
						
			// 공통코드 조회
			model = getCommonCode(model);			
					
			model.addAttribute("arrestVO", result);
			model.addAttribute("regFlag", "modify");
						
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return "/arrest/arrestAdd.tiles";
	}
	
	/**
	 * 중국어선 나포처리현황 엑셀 다운로드
	 * @param searchVO 
	 * @param model Model객체
	 * @return 외사장비 사용실적 현황
	 */
	@RequestMapping("/arrestExcelDownload.do")
	public String arrestExcelDownload(final ArrestSearchVO searchVO, final Model model) throws Exception {
		Calendar cal = Calendar.getInstance();
		ArrestVO arrestCntList = null;
		
		String title = cal.get(cal.YEAR) + "년 중국어선 나포처리현황";
		
		List<ArrestVO> arrestList = arrestService.getArrestListExcel(searchVO);		
		
		if (arrestList.size() > 0) {
			 arrestCntList = arrestService.getArrestListCount(searchVO);
			LinkedHashMap<String, String> header = new LinkedHashMap<String, String>();
			header.put("arrestDate", "나포일시");
			header.put("addrStr", "위반장소");
			header.put("violateDetail", "위반내용");
			header.put("invasion3", "침범유형(영해)");				
			header.put("invasion4", "침범유형(EEZ)");
			header.put("invasion1", "침범유형(특정금지)");
			header.put("invasion2", "침범유형(무허가)");
			header.put("specBatlYn", "침범유형(특공방)");
			header.put("nllYn", "NLL");		
			header.put("agencyGuardStr", "검거기관");
			header.put("agencyVessel", "서별(함정)");
			header.put("shipName", "선박제원(선명)");
			header.put("shipTonnage", "선박제원(톤수)");
			header.put("shipCrewCnt", "선박제원(선원)");
			header.put("shipQualityStr", "선박제원(선질)");
			header.put("shipMentStr", "선박제원(선적)");
			header.put("capName", "선장(나이)");
			header.put("shipTypeStr", "선종");		
			header.put("vioFish", "범칙어종");
			header.put("vioCnt", "범칙수량");
			header.put("vioPriatedAmt", "위판금액");		
			header.put("procCondN", "조사중");
			header.put("procCondY", "완료");		
			header.put("marginPaymentAmt", "납부액(만원)");
			header.put("marginPaymentDate", "납부일시");
			header.put("notPayment", "미납");
			header.put("noMarginPaymentAmt", "미납금액(만원)");
			header.put("shipProcTypeA", "위탁관리");
			header.put("shipProcTypeB", "퇴거");
			header.put("shipProcTypeC", "직접인계");
			header.put("shipProcTypeD", "폐기");
			header.put("shipProcTypeE", "몰수");
			header.put("detentionTotalCnt", "구속(계)");
			
			header.put("captainCount", "구속선장");
			header.put("mateCount", "구속항해사");
			header.put("engineerCount", "구속기관장");
			header.put("crewCount", "구속선원");
			header.put("woDetentionStr", "무혐의불구속");
			header.put("fieldCnt", "현장조사건수");
			header.put("fieldArrestDate", "나포일시");
			header.put("fieldReleaseDate", "석방일시");
			header.put("leadDistance", "거리(해리)");
	        header.put("commissionCost", "위탁금(원)");
			header.put("gearCast", "틀");
			header.put("gearWidth", "폭");
			header.put("gearEtc", "기타");
			
			arrestCntList.setDetentionTotalCnt(String.valueOf(arrestCntList.getCaptainCount()
																+ arrestCntList.getMateCount()
																+ arrestCntList.getEngineerCount()
																+ arrestCntList.getCrewCount()));
			arrestCntList.setSpecBatlYn(String.valueOf(arrestCntList.getSpecBatlCnt()));
			arrestCntList.setNllYn(String.valueOf(arrestCntList.getNllCnt()));
			arrestCntList.setNoPaymentCnt(String.valueOf(arrestCntList.getNotPayment()));
			
			
			arrestList.add(0, arrestCntList);
			
			model.addAttribute("excel", new ExcelExporter<ArrestVO>(header, arrestList, title));
			model.addAttribute("filename", title);
			
			return "excelView";
		} else {
			return "";
		}
	}
}
