package com.kt.event.content.infra.gateway.entity;

import com.kt.event.common.entity.BaseTimeEntity;
import com.kt.event.content.biz.domain.Content;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 콘텐츠 엔티티
 * 이벤트에 대한 전체 콘텐츠 정보를 저장
 */
@Entity
@Table(name = "contents")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class ContentEntity extends BaseTimeEntity {

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

    /**
     * 이벤트 ID (이벤트 초안 ID)
     */
    @Column(name = "event_draft_id", nullable = false)
    private Long eventDraftId;

    /**
     * 이벤트 제목
     */
    @Column(name = "event_title", nullable = false, length = 200)
    private String eventTitle;

    /**
     * 이벤트 설명
     */
    @Column(name = "event_description", columnDefinition = "TEXT")
    private String eventDescription;

    /**
     * 생성된 이미지 목록
     */
    @OneToMany(mappedBy = "content", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<GeneratedImageEntity> images = new ArrayList<>();

    /**
     * 정적 팩토리 메서드: 새 콘텐츠 생성
     *
     * @param eventDraftId      이벤트 초안 ID
     * @param eventTitle        이벤트 제목
     * @param eventDescription  이벤트 설명
     * @return ContentEntity
     */
    public static ContentEntity create(Long eventDraftId, String eventTitle, String eventDescription) {
        ContentEntity entity = new ContentEntity();
        entity.eventDraftId = eventDraftId;
        entity.eventTitle = eventTitle;
        entity.eventDescription = eventDescription;
        return entity;
    }

    /**
     * 도메인 모델로 변환
     *
     * @return Content 도메인 모델
     */
    public Content toDomain() {
        return Content.builder()
                .id(id)
                .eventDraftId(eventDraftId)
                .eventTitle(eventTitle)
                .eventDescription(eventDescription)
                .images(images.stream()
                        .map(GeneratedImageEntity::toDomain)
                        .collect(Collectors.toList()))
                .createdAt(getCreatedAt())
                .updatedAt(getUpdatedAt())
                .build();
    }

    /**
     * 콘텐츠 정보 업데이트
     *
     * @param eventTitle       이벤트 제목
     * @param eventDescription 이벤트 설명
     */
    public void update(String eventTitle, String eventDescription) {
        this.eventTitle = eventTitle;
        this.eventDescription = eventDescription;
    }

    /**
     * 이미지 추가
     *
     * @param image 생성된 이미지 엔티티
     */
    public void addImage(GeneratedImageEntity image) {
        images.add(image);
        image.assignContent(this);
    }
}
