package dev.awesomedev.mirim.service;

import dev.awesomedev.mirim.domain.CourseProgress;
import dev.awesomedev.mirim.domain.User;
import dev.awesomedev.mirim.repository.CourseProgressRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * 이 파일이 하는 일:
 * 코스 완료 기록의 비즈니스 로직 — 내 완료 목록 조회, 완료 토글(있으면 삭제, 없으면 저장).
 * ProgressService(체크리스트)와 같은 패턴이다. 패턴이 같으면 읽는 사람이 편하다.
 */
@Service
public class CourseProgressService {

    private final CourseProgressRepository courseProgressRepository;

    public CourseProgressService(CourseProgressRepository courseProgressRepository) {
        this.courseProgressRepository = courseProgressRepository;
    }

    /** 내가 완료한 코스 slug 목록 */
    @Transactional(readOnly = true)
    public List<String> completedSlugs(User user) {
        // 학습 포인트: 엔티티 리스트에서 필요한 값(slug)만 뽑아 돌려준다.
        // 프론트는 slug 배열만 있으면 되니까 — 필요한 만큼만 주는 것이 좋은 API다.
        return courseProgressRepository.findByUser(user).stream()
                .map(CourseProgress::getCourseSlug)
                .toList();
    }

    /**
     * 완료 상태 뒤집기. 반환값 = 토글 후 완료 여부.
     * 학습 포인트: "완료 취소"를 별도 API로 만들지 않고 토글 하나로 처리 —
     * 프론트 버튼 하나와 API 하나가 1:1로 대응해 단순하다.
     */
    @Transactional
    public boolean toggle(User user, String courseSlug) {
        Optional<CourseProgress> existing =
                courseProgressRepository.findByUserAndCourseSlug(user, courseSlug);
        if (existing.isPresent()) {
            courseProgressRepository.delete(existing.get());
            return false;
        }
        courseProgressRepository.save(new CourseProgress(user, courseSlug));
        return true;
    }
}
