package com.takensoft.cms.loginPolicy.web;

import com.takensoft.cms.loginPolicy.service.LoginModeService;
import com.takensoft.cms.loginPolicy.service.LoginPolicyService;
import com.takensoft.cms.loginPolicy.vo.LoginModeVO;
import com.takensoft.cms.loginPolicy.vo.LoginPolicyVO;
import com.takensoft.cms.token.service.RefreshTokenService;
import com.takensoft.common.message.MessageCode;
import com.takensoft.common.util.JWTUtil;
import com.takensoft.common.util.ResponseUtil;
import com.takensoft.common.util.SessionUtil;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;


/**
 * @author 김혜민
 * @since 2025.03.22
 * @modification
 *     since    |    author    | description
 *  2025.03.22  |    김혜민     | 최초 등록
 *
 * 로그인정책 관련 컨트롤러
 */
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping(value = "/admin/loginPolicy")
public class LoginPolicyController {

    private final LoginPolicyService loginPolicyService;
    private final LoginModeService loginModeService;
    private final ResponseUtil resUtil;
    private final JWTUtil jwtUtil;
    private final SessionUtil sessionUtil;
    private final RedisTemplate<String, String> redisTemplate;
    private final RefreshTokenService refreshTokenService;

    /**
     *
     * @return ResponseEntity - 중복로그인 조회 결과를 포함하는 응답
     *
     * 중복로그인 조회
     */
    @PostMapping(value ="/getLoginPolicy.json")
    public ResponseEntity<?> getLoginPolicy() {
        Boolean result = loginPolicyService.getPolicy();
        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
    }

    /**
     * @param loginPolicyVO - 중복로그인 정보
     * @return ResponseEntity - 중복로그인 결과를 포함하는 응답
     *
     * 중복로그인 수정
     */
    @PostMapping(value ="/saveLoginPolicy.json")
    public ResponseEntity<?> saveLoginPolicy(@RequestBody LoginPolicyVO loginPolicyVO, HttpServletRequest request) {
        try {
            String token = request.getHeader("Authorization");
            String mbrId = (String) jwtUtil.getClaim(token, "mbrId");

            if (mbrId == null || mbrId.isBlank()) {
                return resUtil.errorRes(MessageCode.COMMON_BAD_REQUEST);
            }

            loginPolicyVO.setRgtr(mbrId);

            int result = loginPolicyService.insertPolicy(loginPolicyVO);

            if (result > 0) {
                return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
            } else {
                return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL); // 저장 실패
            }

        } catch (DuplicateKeyException e) {
            return resUtil.errorRes(MessageCode.COMMON_DUPLICATION_DATA); // 중복 저장
        } catch (Exception e) {
            return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_ERROR); // 기타 예외
        }
    }

    /**
     *
     * @return ResponseEntity - 로그인 방식 조회 결과를 포함하는 응답
     *
     * 로그인 방식 조회
     */
    @PostMapping(value ="/getLoginMode.json")
    public Object getLoginMode() {
        String loginMode = loginModeService.getLoginMode();
        return resUtil.successRes(loginMode, MessageCode.COMMON_SUCCESS);
    }

    /**
     *
     * @return ResponseEntity - 로그인 방식 저장 결과를 포함하는 응답
     *
     * 로그인 방식 저장
     */
    @PostMapping(value ="/saveLoginMode.json")
    public ResponseEntity<?> saveLoginMode(@RequestBody LoginModeVO loginModeVO, HttpServletRequest request) {
        try {
            String token = request.getHeader("Authorization");
            String mbrId = (String) jwtUtil.getClaim(token, "mbrId");

            if (mbrId == null || mbrId.isBlank()) {
                return resUtil.errorRes(MessageCode.COMMON_BAD_REQUEST);
            }
            loginModeVO.setRgtr(mbrId);

            int result = loginModeService.insertLoginMode(loginModeVO);

           /* if (loginModeVO.getLgnMode().equals("J")) {
                // JWT 전체 로그아웃
                Set<String> keys = redisTemplate.keys("jwt:*");
                if (keys != null && !keys.isEmpty()) redisTemplate.delete(keys);
                refreshTokenService.deleteAll();
            } else {
                // 세션 전체 로그아웃
                sessionUtil.invalidateAllSessions();
            }*/

            if (result > 0) {
                return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
            } else {
                return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL); // 저장 실패
            }

        } catch (DuplicateKeyException e) {
            return resUtil.errorRes(MessageCode.COMMON_DUPLICATION_DATA); // 중복 저장
        } catch (Exception e) {
            return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_ERROR); // 기타 예외
        }
    }

}
