package com.kt.distribution.entity;

import com.kt.distribution.dto.ChannelType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 채널별 배포 상태 엔티티
 *
 * 각 채널의 배포 진행 상태 및 결과 정보를 저장합니다.
 *
 * @author Backend Developer
 * @since 2025-10-24
 */
@Entity
@Table(name = "channel_status", indexes = {
    @Index(name = "idx_distribution_channel", columnList = "distribution_status_id, channel")
})
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ChannelStatusEntity {

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

    /**
     * 배포 상태 (Foreign Key)
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "distribution_status_id", nullable = false)
    private DistributionStatus distributionStatus;

    /**
     * 채널 타입
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "channel", nullable = false, length = 20)
    private ChannelType channel;

    /**
     * 채널별 배포 상태
     * - PENDING: 대기 중
     * - IN_PROGRESS: 진행 중
     * - COMPLETED: 완료
     * - FAILED: 실패
     */
    @Column(name = "status", nullable = false, length = 20)
    private String status;

    /**
     * 진행률 (0-100, IN_PROGRESS 상태일 때 사용)
     */
    @Column(name = "progress")
    private Integer progress;

    /**
     * 채널별 배포 ID (우리동네TV, 지니TV 등)
     */
    @Column(name = "distribution_id", length = 100)
    private String distributionId;

    /**
     * 예상 노출 수 (우리동네TV, 지니TV)
     */
    @Column(name = "estimated_views")
    private Integer estimatedViews;

    /**
     * 업데이트 완료 시각 (링고비즈)
     */
    @Column(name = "update_timestamp")
    private LocalDateTime updateTimestamp;

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

    /**
     * 노출 스케줄 (지니TV) - JSON 형태로 저장
     */
    @Column(name = "impression_schedule", columnDefinition = "TEXT")
    private String impressionSchedule;

    /**
     * 게시물 URL (Instagram, Naver Blog)
     */
    @Column(name = "post_url", columnDefinition = "TEXT")
    private String postUrl;

    /**
     * 게시물 ID (Instagram)
     */
    @Column(name = "post_id", length = 100)
    private String postId;

    /**
     * 메시지 ID (Kakao Channel)
     */
    @Column(name = "message_id", length = 100)
    private String messageId;

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

    /**
     * 오류 메시지 (실패 시)
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 재시도 횟수
     */
    @Column(name = "retries")
    @Builder.Default
    private Integer retries = 0;

    /**
     * 마지막 재시도 시각
     */
    @Column(name = "last_retry_at")
    private LocalDateTime lastRetryAt;

    /**
     * 생성 시각
     */
    @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();
    }
}
