package com.takensoft.cms.mber.web;

import com.takensoft.cms.mber.dto.AdmMbrDTO;
import com.takensoft.cms.mber.dto.JoinDTO;
import com.takensoft.cms.mber.dto.PasswordDTO;
import com.takensoft.cms.mber.service.AdmMbrService;
import com.takensoft.cms.mber.service.MberService;
import com.takensoft.cms.mber.vo.MberVO;
import com.takensoft.common.exception.IdDuplicationException;
import com.takensoft.common.message.MessageCode;
import com.takensoft.common.util.ResponseData;
import com.takensoft.common.util.ResponseUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.dao.DataAccessException;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Value;

import jakarta.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.nio.charset.Charset;
import java.util.*;
/**
 * @author 박정하
 * @since 2024.06.21
 * @modification
 *     since    |    author    | description
 *  2024.06.21  |    박정하     | 최초 등록
 *  2025.06.26  |    하석형     | existMbrProc, setNewPswdProc 추가
 *
 * 회원정보 관련 Controller
 */
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/mbr")
public class AdmMbrController {
    private final AdmMbrService admMbrService;
    private final MberService mbrService;
    private final ResponseUtil resUtil;

    /**
     * @param params - 회원정보
     * @return ResponseEntity - 회원정보 목록 조회 응답 결과
     *
     * 회원정보 목록 조회
     */
    @PostMapping(value = "/listProc.json")
    public ResponseEntity<?> listProc(@RequestBody HashMap<String, String> params){
        HashMap<String, Object> result = admMbrService.mbrList(params);

        // 응답 처리
        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
    }

    /**
     * @param resetPswd - 초기화비밀번호
     * @param admMbrDTO - 회원정보
     * @return ResponseEntity - 회원정보 비밀번호 초기화 응답 결과
     *
     * 회원정보 비밀번호 초기화
     */
    @PostMapping(value = "/pswdResetProc.json")
    public ResponseEntity<?> pswdResetProc(@Value("${password.reset}") String resetPswd, @RequestBody AdmMbrDTO admMbrDTO){
        PasswordDTO passwordDTO = new PasswordDTO();
        passwordDTO.setMbrId(admMbrDTO.getMbrId());
        passwordDTO.setPswd(admMbrDTO.getPswd());
        passwordDTO.setNewPswd(resetPswd);

        // 비밀번호 변경
        int result = mbrService.updatePassword(passwordDTO);

        // 응답 처리
        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
    }

    /**
     * @param admMbrDTO - 회원정보
     * @return ResponseEntity - 회원정보 상세 조회 응답 결과
     *
     * 회원정보 상세 조회
     */
    @PostMapping(value = "/detailProc.json")
    public ResponseEntity<?> detailProc(@RequestBody AdmMbrDTO admMbrDTO){
        // 상세 조회
        AdmMbrDTO result = admMbrService.mbrDetail(admMbrDTO.getMbrId());

        // 응답 처리
        return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
    }

    /**
     * @param admMbrDTO - 회원정보
     * @return ResponseEntity - 회원정보 수정 응답 결과
     *
     * 회원정보 수정
     */
    @PostMapping(value = "/updateProc.json")
    public ResponseEntity<?> updateProc(@RequestBody AdmMbrDTO admMbrDTO) {
        int result = admMbrService.updateMbr(admMbrDTO);

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

    /**
     * @param admMbrDTO - 회원정보
     * @return ResponseEntity - 회원정보 삭제 응답 결과
     *
     * 회원정보 삭제
     */
    @PostMapping(value = "/deleteProc.json")
    public ResponseEntity<?> deleteProc(@RequestBody AdmMbrDTO admMbrDTO){
        admMbrDTO.setUseYn("N"); // 회원정보 삭제
        int result = admMbrService.updateMbr(admMbrDTO);

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

    /**
     * @param req - HTTP 요청 객체
     * @param joinDTO - 회원정보
     * @return ResponseEntity - 회원정보 등록 응답 결과
     *
     * 회원정보 등록
     */
    @PostMapping(value = "/joinProc.json")
    public ResponseEntity<?> joinProc(HttpServletRequest req, @RequestBody @Valid JoinDTO joinDTO){
        // 아이디 중복 검사
        boolean isExistence = mbrService.findByCheckLoginId(joinDTO.getLgnId());

        // 회원 가입 진행
        //HashMap<String, Object> result = admMbrService.mbrInsert(req, joinDTO);
        HashMap<String, Object> result = mbrService.userJoin(req, joinDTO);
        return resUtil.successRes(result, MessageCode.SIGNUP_SUCCESS);
    }
    /**
     * @param admMbrDTO - 회원정보
     * @return ResponseEntity - 아이디 찾기 응답 결과
     *
     * 아이디 찾기
     */
    @PostMapping(value = "/searchIdProc.json")
    public ResponseEntity<?> searchIdProc(@RequestBody AdmMbrDTO admMbrDTO) {
        String result = admMbrService.lgnIdSearch(admMbrDTO);

        if(result != null) {
            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
        } else {
            return resUtil.errorRes(MessageCode.LOGIN_USER_NOT_FOUND);
        }
    }

    /**
     * @param admMbrDTO -회원정보
     * @return ResponseEntity - 회원정보 존재 확인 응답 결과
     *
     * 회원정보 존재 확인
     */
    @PostMapping(value = "/existMbrProc.json")
    public ResponseEntity<?> existMbrProc(@RequestBody AdmMbrDTO admMbrDTO){
        boolean result = false;
        if(admMbrService.mbrIdSearch(admMbrDTO) != null) {
            result = true; // 회원 아이디가 존재하는 경우
        }

        if(result) {
            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
        } else {
            return resUtil.errorRes(MessageCode.LOGIN_USER_NOT_FOUND);
        }
    }

    /**
     * @param admMbrDTO -회원정보
     * @return ResponseEntity - 비밀번호 수정 응답 결과
     *
     * 새 비밀번호 설정
     */
    @PostMapping(value = "/setNewPswdProc.json")
    public ResponseEntity<?> setNewPswdProc(@RequestBody AdmMbrDTO admMbrDTO){
        int result = admMbrService.setNewPswdProc(admMbrDTO);

        if(result > 0) {
            return resUtil.successRes(result, MessageCode.COMMON_SUCCESS);
        } else {
            return resUtil.errorRes(MessageCode.LOGIN_USER_NOT_FOUND);
        }
    }
}