package com.madeu.crm.kiosk.ctrl;

import java.util.HashMap;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import com.madeu.constants.Constants;
import com.madeu.crm.kiosk.service.KioskService;
import com.madeu.init.ManagerDraftAction;
import com.madeu.service.web.webloghistory.WebLogHistoryService;
import com.madeu.util.HttpUtil;
import com.madeu.util.RequestLogUtil;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class KioskController extends ManagerDraftAction {

    @Autowired
    private KioskService kioskService;

    @Autowired
    private WebLogHistoryService webLogHistoryService;

    // ==================== 뷰 반환 메서드 (ModelAndView) ====================

    /**
     * 키오스크 메인화면 화면으로 이동.
     */
    @RequestMapping("/kiosk")
    public ModelAndView selectMainIntro(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController selectMainIntro START");
        log.debug("KioskController selectMainIntro END");
        return new ModelAndView("/kiosk/consultation");
    }

    /**
     * 키오스크 신규 환자 화면으로 이동.
     */
    @GetMapping("/kiosk/NewPatientIntro.do")
    public ModelAndView NewPatientIntro(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController NewPatientIntro START");
        log.debug("KioskController NewPatientIntro END");
        return new ModelAndView("/kiosk/new-patient");
    }

    /**
     * 키오스크 기존 환자 화면으로 이동.
     */
    @GetMapping("/kiosk/ExistPatientIntro.do")
    public ModelAndView ExistPatientIntro(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController ExistPatientIntro START");
        log.debug("KioskController ExistPatientIntro END");
        return new ModelAndView("/kiosk/existing-patient");
    }

    /**
     * 키오스크 동의서 화면으로 이동.
     */
    @GetMapping("/kiosk/agreement.do")
    public ModelAndView agreementPage(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController agreementPage START");
        log.debug("KioskController agreementPage END");
        return new ModelAndView("/kiosk/agreement");
    }

    // ==================== API 메서드 (JSON 반환) ====================

    /**
     * 진료 정보 리스트 조회 (option)
     */
    @PostMapping("/kiosk/getTreatmentOptionList.do")
    public HashMap<String, Object> getTreatmentOptionList(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController getTreatmentOptionList START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            map = kioskService.getTreatmentOptionList(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }
        }
        log.debug("KioskController getTreatmentOptionList END");
        return map;
    }

    /**
     * 병원 기타정보 카테고리 타입 조회
     */
    @PostMapping("/kiosk/getCategoryList.do")
    public HashMap<String, Object> getCategoryList(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController getCategoryList START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            map = kioskService.getCategoryList(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }
        }
        log.debug("KioskController getCategoryList END");
        return map;
    }

    /**
     * 병원 기타정보 카테고리 아이템 조회
     */
    @PostMapping("/kiosk/getCategoryItem.do")
    public HashMap<String, Object> getCategoryItem(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController getCategoryItem START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            map = kioskService.getCategoryItem(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }
        }
        log.debug("KioskController getCategoryItem END");
        return map;
    }

    /**
     * 고객 정보 리스트 조회 (option)
     */
    @PostMapping("/kiosk/getUserOptionList.do")
    public HashMap<String, Object> getUserOptionList(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController getUserOptionList START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            map = kioskService.getUserOptionList(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }
        }
        log.debug("KioskController getUserOptionList END");
        return map;
    }

    /**
     * 고객 등록
     */
    @PostMapping("/kiosk/putUser.do")
    public HashMap<String, Object> putUser(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController putUser START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        StringBuffer errorMsg = new StringBuffer();
        try {
            paramMap.put("loginMemberId", "customer");
            paramMap.put("regId", "customer");
            paramMap.put("modId", "customer");
            map = kioskService.putUser(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
            errorMsg.append(e.getMessage());
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }

            // 로그 기록
            try {
                HashMap<String, Object> visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request);
                HashMap<String, Object> insertMap = new HashMap<String, Object>();

                insertMap.put("url", "/kiosk/putUser.do");
                insertMap.put("func", "putUser");
                insertMap.put("funcName", "고객 등록");
                insertMap.put("service", "kioskService");
                insertMap.put("serviceName", "고객 등록");
                insertMap.put("requestValue", String.valueOf(paramMap));
                insertMap.put("responseValue", String.valueOf(map));
                insertMap.put("tId", map.get("tId"));
                if (("").equals(String.valueOf(errorMsg)) || null == (String.valueOf(errorMsg))
                        || 0 == String.valueOf(errorMsg).length()) {
                    insertMap.put("resultCode", "SUCCESS");
                } else {
                    insertMap.put("resultCode", "ERROR");
                }
                insertMap.put("resultMsg", String.valueOf(errorMsg));
                insertMap.put("muMemberId", "customer");

                webLogHistoryService.insertLogHistory(insertMap, visitLogParamMap);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        log.debug("KioskController putUser END");
        return map;
    }

    /**
     * 고객 정보 조회
     */
    @PostMapping("/kiosk/getUser.do")
    public HashMap<String, Object> getUser(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController getUser START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            map = kioskService.getUser(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }
        }
        log.debug("KioskController getUser END");
        return map;
    }

    /**
     * 근무 시간 조회
     */
    @PostMapping("/kiosk/getWorkTime.do")
    public HashMap<String, Object> getWorkTime(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController getWorkTime START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            map = kioskService.getWorkTime(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }
        }
        log.debug("KioskController getWorkTime END");
        return map;
    }

    /**
     * 진료 시술 조회
     */
    @PostMapping("/kiosk/getTreatmentProcedureOptionList.do")
    public HashMap<String, Object> getTreatmentProcedureOptionList(HttpServletRequest request,
            HttpServletResponse response) {
        log.debug("KioskController getTreatmentProcedureOptionList START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            map = kioskService.getTreatmentProcedureOptionList(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }
        }
        log.debug("KioskController getTreatmentProcedureOptionList END");
        return map;
    }

    /**
     * 해당 시술 닥터 및 해당과 상담자 조회
     */
    @PostMapping("/kiosk/getMemberDoctorConsultingOptionList.do")
    public HashMap<String, Object> getMemberDoctorConsultingOptionList(HttpServletRequest request,
            HttpServletResponse response) {
        log.debug("KioskController getMemberDoctorConsultingOptionList START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            map = kioskService.getMemberDoctorConsultingOptionList(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }
        }
        log.debug("KioskController getMemberDoctorConsultingOptionList END");
        return map;
    }

    /**
     * 직원 정보 리스트 조회
     */
    @PostMapping("/kiosk/getMemberList.do")
    public HashMap<String, Object> getMemberList(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController getMemberList START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            map = kioskService.getMemberList(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }
        }
        log.debug("KioskController getMemberList END");
        return map;
    }

    /**
     * 고객 - 1년간 진료내역 조회 (수납완료건)
     */
    @PostMapping("/kiosk/getReserveUserOptionList.do")
    public HashMap<String, Object> getReserveUserOptionList(HttpServletRequest request, HttpServletResponse response) {
        log.debug("KioskController getReserveUserOptionList START");

        HashMap<String, Object> paramMap = HttpUtil.getParameterMap(request);
        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            map = kioskService.getReserveUserOptionList(paramMap);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("msgCode", Constants.FAIL);
            map.put("msgDesc", "서버 오류가 발생했습니다.");
        } finally {
            if (Constants.OK != map.get("msgCode")) {
                map.put("msgCode", Constants.FAIL);
                map.put("success", false);
                if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
                    map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
                }
            }
        }
        log.debug("KioskController getReserveUserOptionList END");
        return map;
    }
}