package com.takensoft.cms.bbs.web;

import com.takensoft.cms.bbs.service.CmntService;
import com.takensoft.cms.bbs.vo.CmntVO;
import com.takensoft.common.util.ResponseData;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

/**
 * @author  : 방선주
 * @since   : 2024.05.27
 *
 * 게시판 댓글 관련 Controller
 */
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping(value="/sys/cmnt")
public class CmntController {

    private final CmntService cmntService;

    /**
     * @author  방선주
     * @since   2024.05.27
     * @param   cmntVO
     * @return
     * @throws  Exception
     *
     * 댓글 등록
     */
    @PostMapping("/saveProc.json")
    public ResponseEntity<?> saveProc(@RequestBody CmntVO cmntVO) throws Exception {
        // 응답 처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();

        // 댓글 등록

        HashMap<String,Object> result = cmntService.saveCmnt(cmntVO);

        int insertResult = (int) result.get("result");

        if(insertResult > 0) {
            responseData.setStatus(HttpStatus.OK);
            responseData.setMessage("정상적으로 등록 처리되었습니다.");
            responseData.setData(result);
            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
        } else if (insertResult == -1) {
            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
            responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word"));
            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
        } else if (insertResult == -2){
            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
            responseData.setMessage("로그인 후 이용 가능합니다.");
            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
        } else {
            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
        }

    }

    /**
     * @author  방선주
     * @since   2024.05.27
     * @param   cmntVO
     * @return
     * @throws  Exception
     *
     * 댓글 목록 조회
     */
    @PostMapping("/findCmntList.json")
    public ResponseEntity<?> findCmntList(@RequestBody CmntVO cmntVO) throws Exception {
        // 댓글 목록 조회
        List<CmntVO> cmntList = cmntService.findCmntList(cmntVO.getBbsId());

        Map<String, Object> result = new HashMap<String, Object>();
        result.put("cmntList", cmntList);

        // 응답처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();
        responseData.setStatus(HttpStatus.OK);
        responseData.setMessage("정상적으로 조회가 처리되었습니다.");
        responseData.setData(result);
        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);

    }

    /**
     * @author  방선주
     * @since   2024.05.27
     * @param   cmntVO
     * @return
     * @throws  Exception
     *
     * 댓글 수정
     */
    @PostMapping("/updateProc.json")
    public ResponseEntity<?> updateProc(@RequestBody CmntVO cmntVO) throws Exception {
// 응답 처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();

        // 댓글 수정
        HashMap<String, Object> result = cmntService.updateCmnt(cmntVO);
        int updateResult = (int) result.get("result");

        // 응답처리
        if(updateResult > 0) {
            responseData.setStatus(HttpStatus.OK);
            responseData.setMessage("정상적으로 수정 처리되었습니다.");
            responseData.setData(result);
            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
        } else if (updateResult == -1){
            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
            responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word"));
            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);

        } else {
            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
        }

    }
    /**
     * @author  방선주
     * @since   2024.05.27
     * @param   cmntVO
     * @return
     * @throws  Exception
     *
     * 댓글 삭제
     */
    @PostMapping("/deleteProc.json")
    public ResponseEntity<?> deleteProc(@RequestBody CmntVO cmntVO) throws Exception {

        // 댓글 삭제 처리 (댓글 삭제는 업데이트로 처리 useYn = 'N')
        int result = cmntService.deleteCmnt(cmntVO);

        // 응답처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();
        responseData.setStatus(HttpStatus.OK);
        responseData.setMessage("정상적으로 삭제가 처리되었습니다.");
        responseData.setData(result);
        return new ResponseEntity<>(responseData, headers, HttpStatus.OK);

    }




}
