package com.takensoft.cms.accesCtrl.web;

import com.takensoft.cms.accesCtrl.service.AccesCtrlService;
import com.takensoft.cms.accesCtrl.vo.AccesCtrlVO;
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.*;

import javax.servlet.http.HttpServletRequest;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author  : takensoft
 * @since   : 2024.04.01
 *
 * 접근 제어 관련 컨트롤러
 */
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping(value = "/admin/accesCtrl")
public class AccesCtrlController {

    private final AccesCtrlService accesCtrlService;

    /**
     * @author takensoft
     * @since 2024.04.09
     * @param accesCtrlVO
     * @return
     * @throws Exception
     *
     * 접근제어 등록
     */
    @PostMapping("/saveProc.json")
    public ResponseEntity<?> saveProc(@RequestBody AccesCtrlVO accesCtrlVO) throws Exception {

        Map<String, Object> result = accesCtrlService.accesCtrlSave(accesCtrlVO);
        int saveResult = (int) result.get("result");

        // 응답 처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();
        if(saveResult > 0) {
            responseData.setStatus(HttpStatus.OK);
            responseData.setMessage("정상적으로 등록 처리되었습니다.");
            responseData.setData(result);
            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
        } else {
            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
            responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요.");
            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    /**
     * @author takensoft
     * @since 2024.04.15
     * @param params
     * @return
     * @throws Exception
     *
     * 접근제어 목록 조회
     */
    @PostMapping("/findAll.json")
    public ResponseEntity<?> findAll(@RequestBody Map<String, String> params) throws Exception {

        // 접근제어 목록 관련 정보 조회
        Map<String, Object> result = accesCtrlService.findAll(params);
        // 응답 처리
        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 takensoft
     * @since 2024.04.15
     * @param accesCtrlVO
     * @return
     * @throws Exception
     *
     * 접근제어 상세 조회
     */
    @PostMapping("/findByAcces.json")
    public ResponseEntity<?> findByAcces(@RequestBody AccesCtrlVO accesCtrlVO) throws Exception {
        // 상세 조회
        Map<String, Object> result = accesCtrlService.findByAccesCtrl(accesCtrlVO.getAcsCntrlId());

        // 응답 처리
        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 takensoft
     * @since 2024.04.15
     * @param accesCtrlVO
     * @return
     * @throws Exception
     *
     * 접근제어 수정
     */
    @PostMapping("/updateProc.json")
    public ResponseEntity<?> updateProc(@RequestBody AccesCtrlVO accesCtrlVO) throws Exception {
        // 접근제어 수정 처리
        int result = accesCtrlService.accesCtrlUpdate(accesCtrlVO);

        // 응답 처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();
        if(result > 0) {
            responseData.setStatus(HttpStatus.OK);
            responseData.setMessage("정상적으로 수정 처리되었습니다.");
            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
        } else {
            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
            responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요.");
            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    /**
     * @author takensoft
     * @since 2024.04.15
     * @param accesCtrlVO
     * @return
     * @throws Exception
     *
     * 접근제어 삭제
     */
    @PostMapping("/deleteProc.json")
    public ResponseEntity<?> deleteProc(@RequestBody AccesCtrlVO accesCtrlVO) throws Exception {
        // 접근제어 삭제 처리
        int result = accesCtrlService.accesCtrlUpdate(accesCtrlVO);

        // 응답 처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();
        if(result > 0) {
            responseData.setStatus(HttpStatus.OK);
            responseData.setMessage("정상적으로 삭제 처리되었습니다.");
            return new ResponseEntity<>(responseData, headers, HttpStatus.OK);
        } else {
            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
            responseData.setMessage("삭제에 실패하였습니다.\n담당자에게 문의하세요.");
            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}