package com.icomsys.main_vm.biz.common.system.controller;

import com.google.gson.Gson;
import com.icomsys.main_vm.biz.advice.excep.CustomNotFoundException;
import com.icomsys.main_vm.biz.common.login.res.OprmngCodeRes;
import com.icomsys.main_vm.biz.common.system.service.SystemUserService;
import com.icomsys.main_vm.biz.common.system.vo.*;
import com.querydsl.core.QueryResults;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/admin/common/system")
public class SystemUserController {

    private final SystemUserService systemUserService;

    /**
     * @Name 유저리스트페이지
     * @Description 어드민 시스템관리 유저관리 JSP랜딩페이지
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/user/manage.do")
    public String UserView() {
        return "/adm/common/system/user";
    }

    /**
     * @Name 유저리스트페이지 리스트 Data SEARCH API
     * @Description 어드민 시스템관리 유저관리 DATA LIST
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @PostMapping("/user/list")
    @ResponseBody
    public DslDataTableRes<SystemBotUserRes> userList(@RequestBody SystemBotUserReq dto) {
        log.info("list dto = {}", new Gson().toJson(dto));
        QueryResults<SystemBotUserRes> result = systemUserService.SystemUserList(dto);
        return new DslDataTableRes<SystemBotUserRes>(result);
    }

    /**
     * @Name 유저리스트에서 더블클릭해서 보는 유저 상세페이지
     * @Description 어드민 시스템관리 유저 DATA
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/user/view")
    public String userDetailView(@RequestParam(name = "userSeq", required = true) String userSeq) {
        log.info("view Controller - {}", userSeq);
        return "/adm/common/system/userView";
    }

    /**
     * @Name 유저리스트에서 유저를 생성페이지 랜더링
     * @Description 어드민 시스템관리 유저생성하는 페이지랜더링
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/user/insert")
    public String ServiceGroupInsert() {
        log.info("user insert Controller");
        return "/adm/common/system/userInsert";
    }

    /**
     * @Name 유저리스트에서 유저를 생성API
     * @Description 어드민 시스템관리 유저생성하는 API
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @PostMapping("/user/save")
    @ResponseBody
    public void userSave(@RequestBody SystemBotUserSaveReq dto) throws CustomNotFoundException {
        log.info("save Dto = {}", new Gson().toJson(dto));
        systemUserService.userSave(dto);
    }

    /**
     * @Name 유저리스트에서 유저정보를 업데이트
     * @Description 어드민 시스템관리 유저정보를 업데이트하는 API
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @PostMapping("/user/update")
    @ResponseBody
    public void userUpdate(@RequestBody SystemBotUserUpdateReq dto) throws CustomNotFoundException {
        log.info("userUpdatee Dto = {}", new Gson().toJson(dto));
        systemUserService.userUpdate(dto);
    }

    /**
     * @Name 유저 권한그룹 리스트
     * @Description 시나리오그룹이 가지고있는 권한리스트를 조회함
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/user/authlist")
    @ResponseBody
    public List<SystemBotUserAuthGroupListRes> UserAuthGroupList(@RequestParam(name = "serviceGroup", required = true) String serviceGroup) {
        log.info("UserAuthGroupList=========" + serviceGroup);
        return systemUserService.UserAuthGroupList(serviceGroup);
    }

    /**
     * @Name 유저 중복체크
     * @Description 유저 아이디 중복체크 API
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/user/doubleCheck")
    @ResponseBody
    public String UserDoubleCheck(@RequestParam(name = "userId") String userId) {
        return systemUserService.UserDoubleCheck(userId);
    }

    /**
     * @Name 유저 상세보기 데이터
     * @Description 유저를 더블클링 했을시 필요한 데이터 API
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/user/viewData")
    @ResponseBody
    public SystemBotUserViewRes UserViewData(@RequestParam(name = "userSeq", required = true) Long userSeq) throws CustomNotFoundException {
        log.info("UserViewData=========" + userSeq);
        return systemUserService.UserViewData(userSeq);
    }

    /**
     * @Name 유저 생성시 소속시킬 고객사 검색
     * @Description 유저를 더블클링 했을시 필요한 데이터 API
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/user/cust/select")
    @ResponseBody
    public List<SystemBotUserCustRes> UserCustList() throws CustomNotFoundException {
        return systemUserService.UserCustList();
    }

    /**
     * @Name 해당 서비스그룹 검색
     * @Description 해당유저를 생성할때 사용할 수 있는 서비스 그룹 검색
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/user/service/select")
    @ResponseBody
    public List<OprmngCodeRes> UserServiceList(@RequestParam(name = "custCode", required = true) String cust) throws CustomNotFoundException {
        return systemUserService.UserServiceList(cust);
    }

    /**
     * @Name 비밀번호 오류회수 초기화
     * @Description 비밀번호 오류회수를 초기화시킴
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/user/chk/reset")
    public ResponseEntity UserCheckReset(@RequestParam(name = "userSeq") Long userSeq) throws CustomNotFoundException {
        log.info("failreset - {}", userSeq);
        systemUserService.UserCheckReset(userSeq);
        return ResponseEntity.ok().build();
    }

}
