package com.takensoft.cms.mber.web;


import com.takensoft.cms.mber.service.RefreshTokenService;
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.RestController;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.Charset;

/**
 * @author  : takensoft
 * @since   : 2024.04.01
 *
 * RefreshToken 정보 관련 컨트롤러
 */
@RestController
@RequiredArgsConstructor
@Slf4j
public class RefreshTokenController {

    private final RefreshTokenService refreshTokenService;

    /**
     * @author takensoft
     * @since 2024.04.04
     * @return
     * @throws Exception
     * 로그아웃
     */
    @PostMapping(value = "/mbr/logout.json")
    public ResponseEntity<?> logout(HttpServletRequest req, HttpServletResponse res) throws Exception {
        int result = refreshTokenService.deleteByRefresh(req, res);
        // 응답 처리
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        ResponseData responseData = new ResponseData();
        if(result > 0) {
            Cookie cookie = new Cookie("refresh", null);
            cookie.setMaxAge(0); // 생명주기
            //cookie.setSecure(true); // https 통신을 할 경우 true로 사용
            cookie.setPath("/"); // 쿠키 적용 범위
            cookie.setHttpOnly(true);
            res.addCookie(cookie);
            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.04
     * @return
     * @throws Exception
     * 토큰 재발급
     */
    @PostMapping("/refresh/tokenReissue.json")
    public ResponseEntity<?> tokenReissue(HttpServletRequest req, HttpServletResponse res) throws Exception {
        int result = refreshTokenService.tokenReissueProc(req, res);

        // 응답 처리
        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("로그인을 다시해주시기 바랍니다.");
            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}
