package com.kt.distribution.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 배포 상태 엔티티
 *
 * 이벤트의 전체 배포 상태 정보를 저장합니다.
 *
 * @author Backend Developer
 * @since 2025-10-24
 */
@Entity
@Table(name = "distribution_status", indexes = {
    @Index(name = "idx_event_id", columnList = "event_id", unique = true)
})
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DistributionStatus {

    /**
     * 배포 상태 ID (Primary Key)
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 이벤트 ID (Unique)
     */
    @Column(name = "event_id", nullable = false, unique = true, length = 100)
    private String eventId;

    /**
     * 전체 배포 상태
     * - PENDING: 대기 중
     * - IN_PROGRESS: 진행 중
     * - COMPLETED: 완료
     * - PARTIAL_FAILURE: 부분 성공
     * - FAILED: 실패
     */
    @Column(name = "overall_status", nullable = false, length = 20)
    private String overallStatus;

    /**
     * 배포 시작 시각
     */
    @Column(name = "started_at")
    private LocalDateTime startedAt;

    /**
     * 배포 완료 시각
     */
    @Column(name = "completed_at")
    private LocalDateTime completedAt;

    /**
     * 채널별 배포 상태 목록 (1:N 관계)
     */
    @OneToMany(mappedBy = "distributionStatus", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @Builder.Default
    private List<ChannelStatusEntity> channels = new ArrayList<>();

    /**
     * 생성 시각
     */
    @Column(name = "created_at", nullable = false, updatable = false)
    private LocalDateTime createdAt;

    /**
     * 수정 시각
     */
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;

    /**
     * 생성 시 자동으로 생성 시각 설정
     */
    @PrePersist
    protected void onCreate() {
        createdAt = LocalDateTime.now();
        updatedAt = LocalDateTime.now();
    }

    /**
     * 수정 시 자동으로 수정 시각 설정
     */
    @PreUpdate
    protected void onUpdate() {
        updatedAt = LocalDateTime.now();
    }

    /**
     * 채널 상태 추가 헬퍼 메서드
     */
    public void addChannelStatus(ChannelStatusEntity channelStatus) {
        channels.add(channelStatus);
        channelStatus.setDistributionStatus(this);
    }

    /**
     * 채널 상태 제거 헬퍼 메서드
     */
    public void removeChannelStatus(ChannelStatusEntity channelStatus) {
        channels.remove(channelStatus);
        channelStatus.setDistributionStatus(null);
    }
}
