package sgc.portal.com.com.web;

import sgc.portal.base.util.EasyHashMap;
import sgc.portal.com.com.model.Dtlauth;
import sgc.portal.com.com.model.Stddauth;
import sgc.portal.com.com.model.User;
import sgc.portal.com.com.service.ComUserMngService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**********************************************************
 * 시스템명  : 시스템관리(COM)
 * 프로그램ID : ComUserMngController
 * 프로그램명   : 사용자관리 Controller
 * @author      : Kim Gyu Yong(aaaa@aaa.co.kr)
 * @version   :  2020-08-25
 * @since JDK1.8
 * @see
 * 1. 최초 작성
**********************************************************/
@RestController
public class ComUserMngController {

    /*
     * 디버깅을 위해 로깅을 할 경우에는 Logger 객체를 생성할 필요없이
     * Lombok의 @Slf4j Annotation을 클래스 위에 붙여주기만하면 log 라는 이름으로
     * 로거가 생성됩니다.
     *
     * @Slf4j
     * @RestController
     * public class ComUserMngController {
     *     public void test() {
     *         log.debug("My name is {}", "yongsang");
     *     }
     * }
     *
     * 현재 해당 class에서는 LOGGER 객체를 사용하지 않으므로 주석 처리.
     * 변경된 내용을 보여주기 위해 주석처리 했지만 실제로는 삭제하면 되겠습니다.
     */
//	@SuppressWarnings("unused")
//	private static final Logger LOGGER = LoggerFactory.getLogger(ComUserMngController.class);

	/*
	 * Java 변수 네임은 기본적으로 CamelCase를 사용하는 게 좋겠습니다.
	 * 기존 ComUserMngService 변수명을 comUserMngService 으로 변경.
	 * 또한 Component의 이름도 CamelCase로 작성해야 Class와 구분하기 쉽습니다.
	 * 기본 @Autowired
	 * ComUserMngServiceImpl의 @Service 명도 comUserMngService 변경.
	 *  2020.08.31 yongsang
	 */
	@Autowired
	private ComUserMngService comUserMngService;

	/**

     * @param
     * @return
	 * @throws Exception
     */
	/*
	 * 현재 URL 규칙이 통일성이 없습니다. /com/com/SelectComUserMng, /com/com/saveComUserMng
	 * 원칙적으로는 URL에는 대문자를 사용하지 않지만 편의상 메서드 이름과 같게하기 위해서
	 * CamelCase를 사용하면 될 것 같습니다.
	 * /com/com/SelectComUserMng --> /com/com/selectComUserMng
	 * 또한 메서드 이름도 CamelCase를 이용합니다.
	 * SelectComUserMng(@RequestBody User user) throws Exception -- > selectComUserMng(@RequestBody User user) throws Exception
	 * 그리고 Controller, Service 등에서 Exception을 throws 하지 않는게 좋겠습니다.
	 * 만약 예외 처리가 필요한 경우 try {} catch {} 절로 묶고 사용자 예외를 throw 하십시오.
	 *  2020.08.31 yongsang
	 */
    @PostMapping(value = "/com/com/selectComUserMng")
    public List<EasyHashMap<String, Object>> selectComUserMng(@RequestBody User user) {
        /*
         * 로깅이 필요할 경우에는 System.out.println()을 이용하지 말고
         * 로거 객체를 사용하면 되겠습니다. 아래 로깅 내용을 로거로 변경하면
         * log.debug("SessionUtil.getAttribute(KriisAttributes.AUTHENTICATION).toString(): {}", SessionUtil.getAttribute(KriisAttributes.AUTHENTICATION).toString());
         * 이렇게 하시면 됩니다.
         *  2020.08.31 yongsang
         */
//        System.out.println("SessionUtil.getAttribute(KriisAttributes.AUTHENTICATION).toString(): "+SessionUtil.getAttribute(KriisAttributes.AUTHENTICATION).toString());

        /*
         * Service 객체에서 List<EasyHashMap<String, Object>>를 리턴하므로 List 객체를 생성하는 것은
         * 불필요한 코드로 판단됩니다.
         * List<EasyHashMap<String, Object>> resultList = new ArrayList<EasyHashMap<String, Object>>();
         * resultList = comUserMngService.selectComUserMng(user);
         * 이 코드를 return comUserMngService.selectComUserMng(user); 한 줄로 변경하는 게 좋을 것 같습니다.
         *  2020.08.31 yongsang
         */
        return comUserMngService.selectComUserMng(user);
    }

    /*
     * 사용자를 저장하는 행위는 반드시 로그인이 필요한 경우로 보입니다.
     * @Secured(policy = SecurityPolicy.NONE) 옵션을 주게되면 로그인하지 않은 사용자도
     * 해당 URL(메서드)을 호출할 수 있으니 @Secured(policy = SecurityPolicy.NONE) 옵션을 빼야합니다.
     *
     * Service 객체에서 리턴하는 값이 빈 Map으로 리턴 값이 없는 경우에는 void로 처리하는 게 좋겠습니다.
     *
     *  2020.08.31 yongsang
     */
    @PostMapping(value = "/com/com/saveComUserMng")
    public void saveComUserMng(@RequestBody List<User> user) {
        comUserMngService.saveComUserMng(user);
    }

//    @PostMapping(value = "/com/com/saveComUserMng")
//    @Secured(policy = SecurityPolicy.NONE)
//    public EasyHashMap<String, Object> saveComUserMng(@RequestBody List<User> user) throws Exception {
//        EasyHashMap<String, Object> resultList = new EasyHashMap<String, Object>();
//        resultList = comUserMngService.saveComUserMng(user);
//
//        return resultList;
//    }

    //사용자기준권한조회
    @PostMapping(value = "/com/com/selectComUserStddauthMng")
    public List<EasyHashMap<String, Object>> selectComUserStddauthMng(@RequestBody Stddauth stddauth) {
        return comUserMngService.selectComUserStddauthMng(stddauth);
    }

    //사용자기준권한저장
    @PostMapping(value = "/com/com/saveComUserStddauthMng")
    public void saveComUserStddauthMng(@RequestBody List<Stddauth> stddauth) {
        comUserMngService.saveComUserStddauthMng(stddauth);
    }

    //사용자상세권한조회
    @PostMapping(value = "/com/com/selectComUserDtlauthMng")
    public List<EasyHashMap<String, Object>> selectComUserDtlauthMng(@RequestBody Dtlauth dtlauth) {
        return comUserMngService.selectComUserDtlauthMng(dtlauth);
    }

    //사용자상세권한저장
    @PostMapping(value = "/com/com/saveComUserDtlauthMng")
    public void saveComUserDtlauthMng(@RequestBody List<Dtlauth> dtlauth) {
        comUserMngService.saveComUserDtlauthMng(dtlauth);
    }

    //사원정보가져오기
    @PostMapping(value = "/createUsers")
    public List<EasyHashMap<String, Object>> createUsers() {
        return comUserMngService.createUsers();
    }
}
