package incheon.com.security.service.impl;

import incheon.com.security.mapper.UserRoleAssignMapper;
import incheon.com.security.service.UserRoleAssignService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 * 사용자 역할 자동 할당 서비스 구현체
 * - 시스템 진입 시 기본 역할 Lazy 할당
 * - 신청 프로세스 없이 직접 할당
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class UserRoleAssignServiceImpl implements UserRoleAssignService {

    private final UserRoleAssignMapper userRoleAssignMapper;

    @Override
    public boolean hasRole(String userId, String roleCd, String sysCd) {
        if (userId == null || roleCd == null || sysCd == null) {
            return false;
        }
        int count = userRoleAssignMapper.existsUserRole(userId, roleCd, sysCd);
        return count > 0;
    }

    @Override
    @Transactional
    public boolean assignRoleIfAbsent(String userId, String roleCd, String sysCd) {
        if (userId == null || roleCd == null || sysCd == null) {
            log.warn("역할 할당 실패 - 필수 파라미터 누락: userId={}, roleCd={}, sysCd={}",
                    userId, roleCd, sysCd);
            return false;
        }

        // 이미 보유 중인지 확인
        if (hasRole(userId, roleCd, sysCd)) {
            log.debug("역할 이미 보유: userId={}, roleCd={}, sysCd={}", userId, roleCd, sysCd);
            return false;
        }

        // 오늘 날짜로 시작일 설정
        String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

        try {
            int result = userRoleAssignMapper.insertUserRole(userId, roleCd, sysCd, today);

            if (result > 0) {
                log.info("역할 자동 할당 성공: userId={}, roleCd={}, sysCd={}, bgngYmd={}",
                        userId, roleCd, sysCd, today);
                return true;
            } else {
                log.warn("역할 자동 할당 실패: userId={}, roleCd={}, sysCd={}", userId, roleCd, sysCd);
                return false;
            }
        } catch (Exception e) {
            log.error("역할 자동 할당 중 오류: userId={}, roleCd={}, sysCd={}", userId, roleCd, sysCd, e);
            return false;
        }
    }
}
