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.system.service.SystemCustService;
import com.icomsys.main_vm.biz.common.system.vo.*;
import com.icomsys.main_vm.common.code.MenuVo;
import com.querydsl.core.QueryResults;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/admin/common/system")
@CrossOrigin("*")
public class SystemCustController {

    private final SystemCustService custService;

    /**
     * @Name 고객사관리 JSP 페이지 랜더링
     * @Description 고객사관리 JSP 랜더링하는 컨트롤러
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/cust/manage.do")
    public String CustListView() {
        return "/adm/common/system/cust";
    }

    /**
     * @Name 고객사 리스트를 조회하는 API
     * @Description 고객사리스트를 조회하는 API
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @PostMapping("/cust/list")
    @ResponseBody
    public DslDataTableRes<SystemIcsCustInfoRes> CustList(@RequestBody SystemIcsCustInfoReq dto) {
        log.info("list dto = {}", new Gson().toJson(dto));
        QueryResults<SystemIcsCustInfoRes> result = custService.CustList(dto);
        return new DslDataTableRes<SystemIcsCustInfoRes>(result);
    }

    /**
     * @Name 고객사정보를 업데이트하는 API
     * @Description 고객사정보를 업데이트하는 API
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/cust/update")
    public String custUpdate(@RequestParam(name = "custCode", required = true) String custCode) {
        return "/adm/common/system/custUpdate";
    }

    /**
     * @Name 고객사 조회
     * @Description 고객사정보를 상세보기 페이지의 데이터를 조히하는 API
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/cust/select")
    @ResponseBody
    public SystemCustSelectRes custSelect(@RequestParam(name = "custCode", required = true) String custCode) throws CustomNotFoundException {
        log.info("view Controller - {}", custCode);
       return custService.custSelect(custCode);
    }

    /**
     * @Name 고객사 생성
     * @Description 고객사를 생성하는 페이지 랜더링
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/cust/insert")
    public String CustInsert() {
        log.info("CustInsert Controller");
        return "/adm/common/system/custInsert";
    }

    /**
     * @Name 고객사 생성시 줄수있는 권한그룹의 리스트
     * @Description 고객사에게 줄수있는 권한그룹의 리스트
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/cust/policybase")
    @ResponseBody
    public List<MenuVo> CustPolicyBase(){
        return custService.CustPolicyBase();
    }

    /**
     * @Name 고객사 코드 조회
     * @Description 고객사 코드가 중복되는지 확인하는 API
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/cust/doubleCheck")
    @ResponseBody
    public String CustDoubleCheck(@RequestParam(name = "custCode")String custCode){
    return custService.CustDoubleCheck(custCode);
    }

    /**
     * @Name 고객사의 메인 서비스그룹 생성
     * @Description 고객사를 생성할때 메인서비스그룹을 생성해줄때 중복체크
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @GetMapping("/cust/service/doubleCheck")
    @ResponseBody
    public String CustServiceDoubleCheck(@RequestParam(name = "serviceGroup")String serviceGroup){
        return custService.CustServiceDoubleCheck(serviceGroup);
    }

    /**
     * @Name 고객사 생성 정보 저장
     * @Description 고객사를 생성하는 정보를 저장
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @PostMapping("/cust/save")
    @ResponseBody
    public void CustSave(@RequestBody SystemCustSaveReq dto) throws CustomNotFoundException {
        custService.CustSave(dto);
    }

    /**
     * @Name 고객사 생성 정보 업데이트
     * @Description 고객사를 정보를 업데이트하는 API
     * @Author JangWonSeok
     * @CreateDate 2023. 03. 09.
     */
    @PostMapping("/cust/modify")
    @ResponseBody
    public void CustModify(@RequestBody SystemCustSaveReq dto) throws CustomNotFoundException {
        log.info(" useYn------------------ {}", new Gson().toJson(dto));
        custService.CustModify(dto);
    }

}
