package com.bio.bio_backend.domain.base.member.scheduler;

import com.bio.bio_backend.domain.base.member.dto.MemberDto;
import com.bio.bio_backend.domain.base.member.service.MemberService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.concurrent.ThreadLocalRandom;

/**
 * 멤버 동기화 스케줄러
 * ShedLock을 사용하여 분산 환경에서 중복 실행을 방지합니다.
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class MemberSyncScheduler {

    private final MemberService memberService;

    /**
     * 1시간마다 멤버 동기화를 실행합니다.
     * 현재는 더미 데이터를 생성하지만, 추후 실제 조직도 연동으로 변경 예정입니다.
     */
    @Scheduled(cron = "0 0 * * * *") // 1시간마다
    @SchedulerLock(name = "memberSync", lockAtMostFor = "50m", lockAtLeastFor = "5m")
    public void syncMembersAtTopOfHour() {
        log.info("1시간마다 멤버 동기화 시작");
        try {
            int createdCount = createDummyMembers(5); // 1시간마다 5명씩 생성
            log.info("1시간마다 멤버 동기화 완료: {}명 생성", createdCount);
        } catch (Exception e) {
            log.error("1시간마다 멤버 동기화 실패: {}", e.getMessage(), e);
        }
    }

    /**
     * 매일 새벽 2시에 대량 동기화를 실행합니다.
     */
    @Scheduled(cron = "0 0 2 * * *") // 매일 새벽 2시
    @SchedulerLock(name = "memberBulkSync", lockAtMostFor = "30m", lockAtLeastFor = "5m")
    public void bulkSyncMembers() {
        log.info("일일 대량 멤버 동기화 시작");
        try {
            int createdCount = createDummyMembers(20); // 새벽에 20명씩 생성
            log.info("일일 대량 멤버 동기화 완료: {}명 생성", createdCount);
        } catch (Exception e) {
            log.error("일일 대량 멤버 동기화 실패: {}", e.getMessage(), e);
        }
    }

    /**
     * 더미 멤버를 생성합니다.
     * 추후 실제 조직도 API 연동으로 변경될 예정입니다.
     *
     * @param count 생성할 멤버 수
     * @return 실제 생성된 멤버 수
     */
    private int createDummyMembers(int count) {
        int createdCount = 0;
        
        for (int i = 0; i < count; i++) {
            try {
                String randomSuffix = String.valueOf(System.currentTimeMillis() + i);
                
                MemberDto memberDto = MemberDto.builder()
                    .userId("user_" + randomSuffix)
                    .password("password123") // 실제로는 더 복잡한 패스워드 생성
                    .name(generateRandomName())
                    .email("user_" + randomSuffix + "@company.com")
                    .build();
                
                memberService.createMember(memberDto);
                createdCount++;
                
                log.debug("더미 멤버 생성 완료: {}", memberDto.getUserId());
                
            } catch (Exception e) {
                log.warn("더미 멤버 생성 실패 ({}번째): {}", i + 1, e.getMessage());
                // 개별 멤버 생성 실패는 전체 프로세스를 중단하지 않음
            }
        }
        
        return createdCount;
    }

    /**
     * 랜덤한 이름을 생성합니다.
     * 실제 환경에서는 조직도에서 가져온 실제 이름을 사용합니다.
     *
     * @return 생성된 랜덤 이름
     */
    private String generateRandomName() {
        String[] surnames = {"김", "이", "박", "최", "정", "강", "조", "윤", "장", "임"};
        String[] givenNames = {"민수", "지영", "현우", "수진", "태현", "은지", "동훈", "예린", "준호", "서연"};
        
        String surname = surnames[ThreadLocalRandom.current().nextInt(surnames.length)];
        String givenName = givenNames[ThreadLocalRandom.current().nextInt(givenNames.length)];
        
        return surname + givenName;
    }
}
