package dev.awesomedev.mirim.domain;

import jakarta.persistence.*;

import java.time.Instant;

/**
 * 이 파일이 하는 일:
 * "어떤 사용자가 학습 센터의 어떤 코스를 완료했다"는 사실 하나를 기록하는 JPA 엔티티다.
 * 행이 존재하면 완료, 없으면 미완료 — 완료 취소는 행 삭제로 표현한다 (Progress와 같은 방식).
 *
 * 학습 포인트: 체크리스트(Progress)와 달리 코스 목록은 DB 테이블이 아니라
 * 프론트의 courseCatalog.jsx(데이터 파일)에 있다. 그래서 외래키 대신
 * 코스의 slug 문자열("hardware", "sql" 같은 주소 조각)을 그대로 저장한다.
 * 장점: 코스를 추가할 때 DB 작업이 필요 없다. 단점: DB가 slug의 유효성을 보장하지 못한다.
 * 이런 트레이드오프(교환 관계)를 알고 선택하는 것이 설계다.
 */
@Entity
@Table(
        name = "course_progress",
        uniqueConstraints = @UniqueConstraint(columnNames = {"user_id", "course_slug"})
)
public class CourseProgress {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /** 완료한 사용자. DB에는 user_id 외래키 컬럼이 된다. */
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id")
    private User user;

    /** 완료한 코스의 slug (예: "hardware", "sql", "tool-vscode") */
    @Column(name = "course_slug", nullable = false, length = 60)
    private String courseSlug;

    /** 완료한 시각 */
    @Column(nullable = false)
    private Instant completedAt;

    protected CourseProgress() {
    }

    public CourseProgress(User user, String courseSlug) {
        this.user = user;
        this.courseSlug = courseSlug;
        this.completedAt = Instant.now();
    }

    public Long getId() {
        return id;
    }

    public User getUser() {
        return user;
    }

    public String getCourseSlug() {
        return courseSlug;
    }

    public Instant getCompletedAt() {
        return completedAt;
    }
}
