package com.takensoft.common.certify.web;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.takensoft.cms.loginPolicy.service.LoginModeService;
import com.takensoft.cms.loginPolicy.service.LoginPolicyService;
import com.takensoft.cms.mber.service.LgnHstryService;
import com.takensoft.cms.mber.service.MberService;
import com.takensoft.cms.mber.vo.MberVO;
import com.takensoft.cms.token.service.RefreshTokenService;
import com.takensoft.common.message.MessageCode;
import com.takensoft.common.util.*;
import com.takensoft.common.certify.service.SMSService;
import com.takensoft.common.certify.vo.SMSVO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
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.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 하석형
 * @since 2025.05.20
 * @modification
 *     since    |    author    | description
 *  2025.05.20  |    하석형     | 최초 등록
 *
 * SMS 관련 Controller
 */
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping(value="/sys/sms")
public class SMSController {

    private final SMSService smsService;
    private final ResponseUtil resUtil;
    private final MberService mberService;
    private final HttpRequestUtil httpRequestUtil;
    private final LgnHstryService lgnHstryService;
    private final LoginModeService loginModeService;
    private final RefreshTokenService refreshTokenService;
    private final LoginPolicyService loginPolicyService;
    private final JWTUtil jwtUtil;
    private final SessionUtil sessionUtil;
    private final RedisTemplate<String, String> redisTemplate;
    private final LoginUtil loginUtil;

    @Value("${jwt.accessTime}")
    private long JWT_ACCESSTIME;
    @Value("${jwt.refreshTime}")
    private long JWT_REFRESHTIME;
    @Value("${cookie.time}")
    private int COOKIE_TIME; // 쿠키 유지 시간

    /**
     * @param smsVO - SMS 정보
     * @return ResponseEntity - SMS 인증코드 발송 응답 결과
     *
     * SMS 인증코드 발송
     */
    @PostMapping("/sendSMSCertifyCode.json")
    public ResponseEntity<?> sendSMSCertifyCode(@RequestBody SMSVO smsVO) {

        boolean result = smsService.sendSMSCertifyCode(smsVO);

        return resUtil.successRes(result, MessageCode.CERTIFY_CODE_SEND_SUCCESS);
    }

    /**
     * @param smsVO - SMS 정보
     * @return ResponseEntity - SMS 인증코드 확인 응답 결과
     *
     * SMS 인증코드 확인
     */
    @PostMapping("/checkSMSCertifyCode.json")
    public ResponseEntity<?> checkSMSCertifyCode(@RequestBody SMSVO smsVO) {

        boolean result = smsService.checkSMSCertifyCode(smsVO);

        return resUtil.successRes(result, MessageCode.CERTIFY_SUCCESS);
    }

    /**
     * @param smsVO - SMS 정보
     * @return ResponseEntity - SMS 인증코드 확인 응답 결과
     *
     * 2차 인증 SMS 인증코드 확인
     */
    @PostMapping("/check2ndAuthSMSCertifyCode.json")
    public void check2ndAuthSMSCertifyCode(@RequestBody SMSVO smsVO, HttpServletRequest req, HttpServletResponse res) throws IOException {

        boolean authResult = smsService.checkSMSCertifyCode(smsVO); // SMS 인증코드 확인
        if(authResult) {
            HashMap<String, Object> findMber = new HashMap<>();
            findMber.put("mbrId", smsVO.getMbrId());
            MberVO mber = mberService.findByMbr(findMber);

            loginUtil.successLogin(mber, req, res);
        } else {
            // 인증 실패 시 예외 처리
            Map<String, Object> result = new HashMap<>();
            res.setContentType("application/json;charset=UTF-8");
            res.setStatus(HttpStatus.UNAUTHORIZED.value());
            result.put("message", "인증에 실패했습니다. 올바른 인증코드를 입력해주세요.");
            new ObjectMapper().writeValue(res.getOutputStream(), result);
            return;
        }

//        return resUtil.successRes(authResult, MessageCode.COMMON_SUCCESS);
    }
}
