package com.takensoft.cms.mber.web;


import com.takensoft.cms.mber.service.RefreshTokenService;
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.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.nio.charset.Charset;
/**
 * @author takensoft
 * @since 2024.04.01
 * @modification
 *     since    |    author    | description
 *  2024.04.01  |  takensoft   | 최초 등록
 *
 * RefreshToken 정보 관련 컨트롤러
 */
@RestController
@RequiredArgsConstructor
@Slf4j
public class RefreshTokenController {

    private final ResponseUtil resUtil;
    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);
            return resUtil.successRes(result, MessageCode.LOGOUT_SUCCESS);
        } else {
            return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_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) {
            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
        } else {
            responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
            responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR);
            responseData.setMessage("로그인을 다시해주시기 바랍니다.");
            return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}
