package incheon.ags.mrb.share.service.impl;

import incheon.ags.mrb.share.mapper.RecipeShrnGroupMapper;
import incheon.ags.mrb.share.mapper.RecipeShrnGroupMbrMapper;
import incheon.ags.mrb.share.service.RecipeShrnGroupService;
import incheon.ags.mrb.share.vo.RecipeShrnGroupMbrVO;
import incheon.ags.mrb.share.vo.RecipeShrnGroupVO;
import incheon.ags.mrb.share.web.dto.RecipeShrnGroupDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

/**
 * 레시피 공유 그룹 서비스 구현체
 * - 레시피 공유 그룹 정보 관리
 */
@Slf4j
@Service("recipeShrnGroupService")
@RequiredArgsConstructor
public class RecipeShrnGroupServiceImpl extends EgovAbstractServiceImpl implements RecipeShrnGroupService {

    private final RecipeShrnGroupMapper recipeShrnGroupMapper;
    private final RecipeShrnGroupMbrMapper recipeShrnGroupMbrMapper;

    /**
     * 현재 사용자의 그룹 목록 조회 (멤버로 속한 그룹)
     */
    @Override
    public Map<String, Object> getMyGroupList(RecipeShrnGroupVO recipeShrnGroupVO) throws Exception {
        log.debug("현재 사용자의 그룹 목록 조회 - userId: {}", recipeShrnGroupVO.getUserId());

        // 필수 파라미터 검증
        if (recipeShrnGroupVO.getUserId() == null || recipeShrnGroupVO.getUserId().isEmpty()) {
            throw new IllegalArgumentException("사용자 ID는 필수입니다");
        }

        // 목록 조회 (조건 검색 및 페이징 제거)
        List<RecipeShrnGroupVO> voList = recipeShrnGroupMapper.selectMyGroupList(recipeShrnGroupVO);

        // VO -> DTO 변환
        List<RecipeShrnGroupDTO> dtoList = new java.util.ArrayList<>();
        for (RecipeShrnGroupVO vo : voList) {
            // 그룹별 멤버 목록 조회
            List<RecipeShrnGroupMbrVO> memberVOList = recipeShrnGroupMbrMapper.selectGroupMemberList(vo.getGroupId());

            // 멤버 ID 리스트와 이름 리스트 생성
            List<String> memberIds = new java.util.ArrayList<>();
            List<String> memberNames = new java.util.ArrayList<>();
            if (memberVOList != null && !memberVOList.isEmpty()) {
                for (RecipeShrnGroupMbrVO memberVO : memberVOList) {
                    if (memberVO != null && memberVO.getUserId() != null) {
                        // ID 추가
                        memberIds.add(memberVO.getUserId());
                        // 이름 추가 (부서-이름 형식)
                        String displayName = memberVO.getUserNm();
                        if (displayName != null) {
                            displayName = (memberVO.getDeptNm() != null && !memberVO.getDeptNm().isEmpty())
                                    ? memberVO.getDeptNm() + "-" + displayName
                                    : displayName;
                        } else {
                            displayName = memberVO.getUserId();
                        }
                        memberNames.add(displayName);
                    }
                }
            }

            RecipeShrnGroupDTO dto = RecipeShrnGroupDTO.builder()
                    .groupId(vo.getGroupId())
                    .groupName(vo.getGroupNm())
                    .description(vo.getGroupExpln())
                    .memberCnt(vo.getMemberCnt() != null ? vo.getMemberCnt() : 0)
                    .memberIds(memberIds)
                    .members(memberNames)
                    .build();
            dtoList.add(dto);
        }

        // 결과 맵 구성
        Map<String, Object> result = new HashMap<>();
        result.put("list", dtoList);
        result.put("totalCount", dtoList.size());

        log.debug("현재 사용자의 그룹 목록 조회 완료 - 총 {}건", dtoList.size());
        return result;
    }

    /**
     * 그룹 생성 (멤버 포함)
     */
    @Override
    @Transactional
    public Integer createGroup(RecipeShrnGroupDTO recipeShrnGroupDTO, String userId) throws Exception {
        // 멤버 수 계산
        int memberCount = 0;
        if (recipeShrnGroupDTO.getMembers() != null && !recipeShrnGroupDTO.getMembers().isEmpty()) {
            memberCount = recipeShrnGroupDTO.getMembers().size();
        }

        log.debug("그룹 생성 - groupName: {}, 멤버 수: {}",
                recipeShrnGroupDTO.getGroupName(),
                memberCount);

        // 유효성 검증
        if (recipeShrnGroupDTO.getGroupName() == null || recipeShrnGroupDTO.getGroupName().trim().isEmpty()) {
            throw new IllegalArgumentException("그룹명은 필수입니다");
        }

        if (userId == null || userId.trim().isEmpty()) {
            throw new IllegalArgumentException("생성자 ID는 필수입니다");
        }

        // VO로 변환
        RecipeShrnGroupVO recipeShrnGroupVO = new RecipeShrnGroupVO();
        recipeShrnGroupVO.setGroupNm(recipeShrnGroupDTO.getGroupName());
        recipeShrnGroupVO.setGroupExpln(recipeShrnGroupDTO.getDescription());
        recipeShrnGroupVO.setFrstRegId(userId);
        recipeShrnGroupVO.setLastMdfcnId(userId);

        // 그룹 등록
        recipeShrnGroupMapper.insertGroup(recipeShrnGroupVO);
        Integer groupId = recipeShrnGroupVO.getGroupId();

        // members 처리 (사용자 ID 리스트)
        if (recipeShrnGroupDTO.getMembers() != null && !recipeShrnGroupDTO.getMembers().isEmpty()) {
            for (String memberId : recipeShrnGroupDTO.getMembers()) {
                RecipeShrnGroupMbrVO member = new RecipeShrnGroupMbrVO();
                member.setGroupId(groupId);
                member.setUserId(memberId); // 사용자 ID 저장
                member.setActvtnEn(true);
                member.setFrstRegId(userId);
                member.setLastMdfcnId(userId);
                recipeShrnGroupMbrMapper.insertGroupMember(member);
            }
            log.debug("그룹 생성 완료 - groupId: {}, 총 멤버 수: {}", groupId, recipeShrnGroupDTO.getMembers().size());
        }
        // 멤버 정보가 없으면 생성자만 멤버로 추가
        else {
            RecipeShrnGroupMbrVO creatorMember = new RecipeShrnGroupMbrVO();
            creatorMember.setGroupId(groupId);
            creatorMember.setUserId(userId);
            creatorMember.setActvtnEn(true);
            creatorMember.setFrstRegId(userId);
            creatorMember.setLastMdfcnId(userId);
            recipeShrnGroupMbrMapper.insertGroupMember(creatorMember);
            log.debug("그룹 생성 완료 - groupId: {}, 총 멤버 수: 1 (생성자)", groupId);
        }

        return groupId;
    }


    /**
     * 그룹 수정
     */
    @Override
    @Transactional
    public void updateGroup(Integer groupId, RecipeShrnGroupDTO recipeShrnGroupDTO, String userId) throws Exception {
        log.debug("그룹 수정 - groupId: {}, groupName: {}", groupId, recipeShrnGroupDTO.getGroupName());

        // 유효성 검증
        if (groupId == null) {
            throw new IllegalArgumentException("그룹 ID는 필수입니다");
        }

        if (recipeShrnGroupDTO.getGroupName() == null || recipeShrnGroupDTO.getGroupName().trim().isEmpty()) {
            throw new IllegalArgumentException("그룹명은 필수입니다");
        }

        if (userId == null || userId.trim().isEmpty()) {
            throw new IllegalArgumentException("수정자 ID는 필수입니다");
        }

        // 기존 그룹 존재 확인
        RecipeShrnGroupVO existingGroup = recipeShrnGroupMapper.selectGroupDetail(groupId);
        if (existingGroup == null) {
            throw new IllegalArgumentException("해당 그룹을 찾을 수 없습니다");
        }

        // 그룹 기본 정보 수정
        RecipeShrnGroupVO recipeShrnGroupVO = new RecipeShrnGroupVO();
        recipeShrnGroupVO.setGroupId(groupId);
        recipeShrnGroupVO.setGroupNm(recipeShrnGroupDTO.getGroupName());
        recipeShrnGroupVO.setGroupExpln(recipeShrnGroupDTO.getDescription());
        recipeShrnGroupVO.setLastMdfcnId(userId);

        recipeShrnGroupMapper.updateGroup(recipeShrnGroupVO);

        // 기존 멤버 전체 삭제
        recipeShrnGroupMbrMapper.deleteGroupMembersByGroupId(groupId);

        // 새로운 멤버 추가 (사용자 ID 리스트)
        if (recipeShrnGroupDTO.getMembers() != null && !recipeShrnGroupDTO.getMembers().isEmpty()) {
            for (String memberId : recipeShrnGroupDTO.getMembers()) {
                RecipeShrnGroupMbrVO member = new RecipeShrnGroupMbrVO();
                member.setGroupId(groupId);
                member.setUserId(memberId); // 사용자 ID 저장
                member.setActvtnEn(true);
                member.setFrstRegId(userId);
                member.setLastMdfcnId(userId);
                recipeShrnGroupMbrMapper.insertGroupMember(member);
            }
            log.debug("그룹 수정 완료 - groupId: {}, 총 멤버 수: {}", groupId, recipeShrnGroupDTO.getMembers().size());
        } else {
            log.debug("그룹 수정 완료 - groupId: {}, 총 멤버 수: 0", groupId);
        }
    }

    /**
     * 그룹 삭제
     */
    @Override
    @Transactional
    public void deleteGroup(Integer groupId) throws Exception {
        log.debug("그룹 삭제 - groupId: {}", groupId);

        if (groupId == null) {
            throw new IllegalArgumentException("그룹 ID는 필수입니다");
        }

        // 기존 그룹 존재 확인
        RecipeShrnGroupVO existingGroup = recipeShrnGroupMapper.selectGroupDetail(groupId);
        if (existingGroup == null) {
            throw new IllegalArgumentException("해당 그룹을 찾을 수 없습니다");
        }

        // 그룹 멤버 먼저 삭제
        recipeShrnGroupMbrMapper.deleteGroupMembersByGroupId(groupId);

        // 그룹 삭제
        recipeShrnGroupMapper.deleteGroup(groupId);

        log.debug("그룹 삭제 완료 - groupId: {}", groupId);
    }
}
