package dev.awesomedev.mirim.domain;

import jakarta.persistence.*;

/**
 * 이 파일이 하는 일:
 * 학습 문서(가이드, 커리큘럼, 주차 계획, 채점 기준 등)의 메타데이터를 담는 JPA 엔티티다.
 * 실제 문서 본문은 frontend/public/docs/ 아래 HTML 파일이고,
 * 이 엔티티는 "어떤 문서가 어디에 있고 누가 볼 수 있는지"만 기록한다.
 */
@Entity
@Table(name = "documents")
public class Document {

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

    /**
     * URL에 쓰이는 고유 식별 문자열 (예: "week1-plan").
     * 학습 포인트: 숫자 id 대신 slug를 URL에 쓰는 이유 — 주소만 봐도 무슨 문서인지
     * 알 수 있고, DB를 다시 만들어 id가 바뀌어도 링크가 깨지지 않는다.
     * unique = true 덕분에 DB가 중복 slug를 거부한다(유니크 인덱스 생성).
     */
    @Column(nullable = false, unique = true)
    private String slug;

    /** 문서 제목 */
    @Column(nullable = false)
    private String title;

    /** 분류: GUIDE | CURRICULUM | PLAN | RUBRIC | LESSON | ASSIGNMENT | TICKET */
    @Column(nullable = false)
    private String category;

    /** 몇 주차 문서인지. 주차와 무관한 문서(전체 가이드 등)는 null. */
    private Integer week;

    /**
     * 누구에게 보여줄 문서인지: STUDENT | MENTOR | ALL
     * 학습 포인트: MENTOR 전용 문서(채점 기준 등)는 API 레벨에서 걸러서 수습생에게 노출하지 않는다.
     */
    @Column(nullable = false)
    private String audience;

    /** 프론트엔드에서 접근할 파일 경로 (예: "/docs/week1-plan.html") */
    @Column(nullable = false)
    private String filePath;

    /** 목록에서 보여줄 정렬 순서 */
    @Column(nullable = false)
    private Integer sortOrder;

    protected Document() {
    }

    public Document(String slug, String title, String category, Integer week,
                    String audience, String filePath, Integer sortOrder) {
        this.slug = slug;
        this.title = title;
        this.category = category;
        this.week = week;
        this.audience = audience;
        this.filePath = filePath;
        this.sortOrder = sortOrder;
    }

    public Long getId() {
        return id;
    }

    public String getSlug() {
        return slug;
    }

    public String getTitle() {
        return title;
    }

    public String getCategory() {
        return category;
    }

    public Integer getWeek() {
        return week;
    }

    public String getAudience() {
        return audience;
    }

    public String getFilePath() {
        return filePath;
    }

    public Integer getSortOrder() {
        return sortOrder;
    }
}
