package com.madeu.service.web.webappuser.impl;

import com.madeu.constants.Constants;
import com.madeu.dao.web.webappuser.WebAppUserSqlMapDAO;
import com.madeu.dao.web.webauthmenurelation.WebAuthMenuRelationSqlMapDAO;
import com.madeu.dao.web.webmember.WebMemberSqlMapDAO;
import com.madeu.service.web.webappuser.WebAppUserService;
import com.madeu.util.ValidationCheckUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Service("WebAppUserService")
public class WebAppUserServiceImpl implements WebAppUserService {

    @Autowired
    private WebAppUserSqlMapDAO webAppUserSqlMapDAO;

    @Autowired
    private WebMemberSqlMapDAO webMemberSqlMapDAO;

    @Autowired
    private WebAuthMenuRelationSqlMapDAO webAuthMenuRelationSqlMapDAO;
    /**
     * 이벤트 콘텐츠 리스트 화면으로 이동.
     *
     *
     * @param paramMap
     * @return
     * @throws Exception
     */
    @Override
    public HashMap<String, Object> selectListAppUserIntro(
            HashMap<String, Object> paramMap) throws Exception {
        log.debug("WebAppUserServiceImpl selectListAppUserIntro START");

        HashMap<String, Object> map = new HashMap<String, Object>();

        log.debug("loginMemberId       :"+paramMap.get("loginMemberId"));

        log.debug("menuClass           :"+paramMap.get("menuClass"));

        try{
            boolean check  = true;

            String menuClass    = String.valueOf(paramMap.get("menuClass"));

            // 정렬
            if(true != ValidationCheckUtil.emptyCheck(menuClass)){
                check = false;
                map.put("msgCode", Constants.FAIL);
                map.put("msgDesc","메뉴 정보가 없습니다.");
            }

            if(true == check){
                // 사용자 확인
                List<Map<String, Object>> userListMap = webMemberSqlMapDAO.checkMember(paramMap);
                int userListMapSize = userListMap.size();

                if(1==userListMapSize){
                    paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId"));
                }
                else {
                    check = false;
                    map.put("msgCode", Constants.FAIL);
                    map.put("msgDesc", "사용자 정보가 올바르지 않습니다.");
                }
            }

            if(true == check){
                // 권한 조회
                HashMap<String, Object> authCheckParamMap = new HashMap<String, Object>();
                authCheckParamMap.put("menuClass",paramMap.get("menuClass"));
                authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId"));
                List<Map<String, Object>> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap);
                int authMenuRelationlistMapSize = authMenuRelationlistMap.size();

                if(1==authMenuRelationlistMapSize){
                    map.put("msgCode", Constants.OK);
                    map.put("success","true");

                    map.put("selectUseYn", authMenuRelationlistMap.get(0).get("selectUseYn"));
                    map.put("insertUseYn", authMenuRelationlistMap.get(0).get("insertUseYn"));
                    map.put("updateUseYn", authMenuRelationlistMap.get(0).get("updateUseYn"));
                    map.put("deleteUseYn", authMenuRelationlistMap.get(0).get("deleteUseYn"));
                    map.put("downloadUseYn", authMenuRelationlistMap.get(0).get("downloadUseYn"));
                }
                else {
                    map.put("msgCode", Constants.FAIL);
                    map.put("msgDesc", "권한 정보가 없습니다.");
                }
            }
        }
        catch(Exception e){
            e.printStackTrace();
            throw e;
        }
        log.debug("WebAppUserServiceImpl selectListAppUserIntro END");
        return map;
    }

    /**
     * 앱 회원 리스트 조회
     *
     *
     * @param paramMap
     * @return
     * @throws Exception
     */
    @Override
    public HashMap<String, Object> selectListAppUser(
            HashMap<String, Object> paramMap) throws Exception {
        log.debug("WebAppUserServiceImpl selectListAppUser START");

        HashMap<String, Object> map = new HashMap<String, Object>();

        log.debug("loginMemberId       :"+paramMap.get("loginMemberId"));

        log.debug("menuClass           :"+paramMap.get("menuClass"));

        log.debug("menuClass           :"+paramMap.get("menuClass"));

        log.debug("appUserSearchKeywordParam  :"+paramMap.get("appUserSearchKeywordParam"));
        log.debug("appUserSort                :"+paramMap.get("appUserSort"));
        log.debug("appUserStart               :"+paramMap.get("appUserStart"));
        log.debug("appUserLimit               :"+paramMap.get("appUserLimit"));
        log.debug("appUserSort                :"+paramMap.get("appUserSort"));
        log.debug("appUserDir                 :"+paramMap.get("appUserDir"));
        log.debug("appIntroType               :"+paramMap.get("appIntroType"));

        List<Map<String, Object>> listMap = new ArrayList<Map<String,Object>>();

        try{
            boolean check  = true;

            if(true == check){
                // 사용자 확인
                List<Map<String, Object>> userListMap = webMemberSqlMapDAO.checkMember(paramMap);
                int userListMapSize = userListMap.size();

                if(1==userListMapSize){
                    paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId"));
                }
                else {
                    check = false;
                    map.put("msgCode", Constants.FAIL);
                    map.put("msgDesc", "사용자 정보가 올바르지 않습니다.");
                }
            }
            if(true == check){
                // 권한 조회
                HashMap<String, Object> authCheckParamMap = new HashMap<String, Object>();
                authCheckParamMap.put("menuClass",paramMap.get("menuClass"));
                authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId"));
                List<Map<String, Object>> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap);

                if(1==authMenuRelationlistMap.size()){

                    if(("Y").equals(authMenuRelationlistMap.get(0).get("selectUseYn"))) {

                    }
                    else {
                        check = false;
                        map.put("msgCode", Constants.FAIL);
                        map.put("msgDesc", "조회 권한 정보가 없습니다.");
                    }
                }
                else {
                    check = false;
                    map.put("msgCode", Constants.FAIL);
                    map.put("msgDesc", "권한 정보가 없습니다.");
                }
            }

            if(true == check){
                // 정렬
                if(null==paramMap.get("memberDir")||("").equals(paramMap.get("memberDir"))){

                }
                else{
                    String dir = String.valueOf(paramMap.get("memberDir"));
                    if(("A").equals(dir)){
                        paramMap.put("memberDir", "DESC");
                    }
                    else if(("B").equals(dir)){
                        paramMap.put("memberDir", "ASC");
                    }
                    else {
                        paramMap.put("memberDir", "DESC");
                    }
                }

                paramMap.put("useYn", "Y");

                // 총 갯수 조회
                List<Map<String, Object>> totalCountListMap = webAppUserSqlMapDAO.selectTotalAppUserCount(paramMap);
                int totalCount = Integer.parseInt(String.valueOf(totalCountListMap.getFirst()));

                if(0 < totalCount) {
                    // 리스트 조회
                    listMap = webAppUserSqlMapDAO.selectListAppUser(paramMap);
                }

                map.put("msgCode", Constants.OK);
                map.put("success","true");
                map.put("totalCount", totalCount);
                map.put("rows",listMap);
            }
        }
        catch(Exception e){
            e.printStackTrace();
            throw e;
        }
        log.debug("WebAppUserServiceImpl selectListAppUser END");
        return map;
    }

    /**
     * 앱 회원 리스트 조회 (Excel)
     *
     *
     * @param paramMap
     * @return
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> selectListAppUserExcel(
            HashMap<String, Object> paramMap) throws Exception {
        log.debug("WebAppUserServiceImpl selectListAppUserExcel START");

        HashMap<String, Object> map = new HashMap<String, Object>();
        List<Map<String, Object>> listMap = new ArrayList<>();

        log.debug("loginMemberId       :"+paramMap.get("loginMemberId"));

        log.debug("menuClass           :"+paramMap.get("menuClass"));

        log.debug("appUserSearchKeywordParam  :"+paramMap.get("appUserSearchKeywordParam"));
        log.debug("appUserSort                :"+paramMap.get("appUserSort"));
        log.debug("appUserStart               :"+paramMap.get("appUserStart"));
        log.debug("appUserLimit               :"+paramMap.get("appUserLimit"));
        log.debug("appUserSort                :"+paramMap.get("appUserSort"));
        log.debug("appUserDir                 :"+paramMap.get("appUserDir"));
        log.debug("appIntroType               :"+paramMap.get("appIntroType"));

        try{
            boolean check  = true;

            if(true == check){
                // 사용자 확인
                List<Map<String, Object>> userListMap = webMemberSqlMapDAO.checkMember(paramMap);
                int userListMapSize = userListMap.size();

                if(1==userListMapSize){
                    paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId"));
                }
                else {
                    check = false;
                    map.put("msgCode", Constants.FAIL);
                    map.put("msgDesc", "사용자 정보가 올바르지 않습니다.");
                }
            }

            if(true == check){
                // 권한 조회
                HashMap<String, Object> authCheckParamMap = new HashMap<String, Object>();
                authCheckParamMap.put("menuClass",paramMap.get("menuClass"));
                authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId"));
                List<Map<String, Object>> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap);

                if(1==authMenuRelationlistMap.size()){

                    if(("Y").equals(authMenuRelationlistMap.get(0).get("downloadUseYn"))) {

                    }
                    else {
                        check = false;
                        map.put("msgCode", Constants.FAIL);
                        map.put("msgDesc", "내려받기 권한 정보가 없습니다.");
                    }
                }
                else {
                    check = false;
                    map.put("msgCode", Constants.FAIL);
                    map.put("msgDesc", "권한 정보가 없습니다.");
                }
            }

            if(true == check){
                // 정렬
                if(null==paramMap.get("appUserDir")||("").equals(paramMap.get("appUserDir"))){

                }
                else{
                    String dir = String.valueOf(paramMap.get("dir"));
                    if(("A").equals(dir)){
                        paramMap.put("appUserDir", "DESC");
                    }
                    else if(("B").equals(dir)){
                        paramMap.put("appUserDir", "ASC");
                    }
                    else {
                        paramMap.put("appUserDir", "DESC");
                    }
                }

                paramMap.put("useYn", "Y");

                listMap = webAppUserSqlMapDAO.selectListAppUserExcel(paramMap);
            }

        }
        catch(Exception e){
            e.printStackTrace();
            throw e;
        }

        log.debug("WebAppUserServiceImpl selectListAppUserExcel END");
        return listMap;
    }
}
