package com.takensoft.cms.menu.web;

import com.takensoft.cms.author.vo.AuthorVO;
import com.takensoft.cms.codeManage.service.CodeManageService;
import com.takensoft.cms.codeManage.vo.CodeManageVO;
import com.takensoft.cms.dept.vo.DeptVO;
import com.takensoft.cms.menu.service.MenuService;
import com.takensoft.cms.menu.vo.MenuVO;
import com.takensoft.common.HierachyVO;
import com.takensoft.common.message.MessageCode;
import com.takensoft.common.util.ResponseData;
import com.takensoft.common.util.ResponseUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;

/**
 * @author takensoft
 * @since 2024.04.01
 * @modification
 *     since    |    author    | description
 *  2024.04.01  |  takensoft   | 최초 등록
 *
 * 메뉴 정보 관련 컨트롤러
 */
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping(value = "/admin/menu")
public class MenuController {

    private final ResponseUtil resUtil;
    private final MenuService menuService;
    private final CodeManageService codeManageService;

    /**
     * @author takensoft
     * @since 2024.04.08
     * @param menuVO
     * @return
     * @throws Exception
     *
     * 메뉴 등록
     */
    @PostMapping(value = "/saveProc.json")
    public ResponseEntity<?> SaveProc(@RequestBody MenuVO menuVO) throws Exception {
        // 메뉴 등록
        int result = menuService.menuSave(menuVO);

        // 응답 처리
        if(result > 0) {
            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
        } else {
            return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL);
        }
    }

    /**
     * @author takensoft
     * @since 2024.04.08
     * @param
     * @return
     * @throws Exception
     *
     * 메뉴 목록 조회 (관리자 페이지용)
     */
    @GetMapping(value = "/findAll.json")
    public ResponseEntity<?> findAll() throws Exception {
        // Tree용
        List<HierachyVO> hierachyList = menuService.findByTopNode();

        // 메뉴타입
        List<CodeManageVO> codeList = codeManageService.findByChildCdCache("menuGroup");

        HashMap<String, Object> result = new HashMap<>();
        result.put("hierachyList", hierachyList);
        result.put("newMenu", new MenuVO());
        result.put("codeList", codeList);

        // 응답 처리
        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
    }

    /**
     * @author takensoft
     * @since 2024.04.08
     * @param menuVO
     * @return
     * @throws Exception
     *
     * 메뉴 상세 조회 (관리자 페이지용)
     */
    @PostMapping("/findByMenu.json")
    public ResponseEntity<?> findByMenu(@RequestBody MenuVO menuVO) throws Exception {
        // 메뉴 조회
        MenuVO result = menuService.findByMenu(menuVO.getMenuId());
        // 응답 처리
        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
    }

    /**
     * @author takensoft
     * @since 2024.04.08
     * @param menuVO
     * @return
     * @throws Exception
     *
     * 메뉴 정보 수정
     */
    @PostMapping(value = "/updateProc.json")
    public ResponseEntity<?> updateProc(@RequestBody MenuVO menuVO) throws Exception {
        // 메뉴 등록
        int result = menuService.MenuUpdate(menuVO);

        // 응답 처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();
        if(result > 0) {
            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
        } else {
            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
        }
    }

    /**
     * @author 박정하
     * @since 2024.04.29
     * @param menuVO
     * @return
     * @throws Exception
     *
     * 메뉴 정보 삭제
     */
    @PostMapping(value = "/deleteProc.json")
    public ResponseEntity<?> deleteProc(@RequestBody MenuVO menuVO) throws Exception {
        // 메뉴 삭제
        int result = menuService.menuDelete(menuVO);

        // 응답 처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();

        if(result > 0) {
            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
        } else {
            return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL);
        }
    }

    /**
     * @author 박정하
     * @since 2024.05.10
     * @param menuList
     * @return
     * @throws Exception
     *
     * 메뉴 목록 수정
     */
    @PostMapping(value = "/updateListProc.json")
    public ResponseEntity<?> updateListProc(@RequestBody List<HierachyVO> menuList) throws Exception {
        // 메뉴 목록 수정
        int result = menuService.updateList(menuList);

        // 응답 처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();
        if(result > 0) {
            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
        } else {
            return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL);
        }
    }
}
