package com.goldenchart.entity;

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;

import java.time.LocalDateTime;

/**
 * 차트 슬롯 설정.
 * 멀티차트 레이아웃 내 각 슬롯의 모든 설정값을 저장.
 */
@Entity
@Table(name = "gc_chart_slot",
    uniqueConstraints = @UniqueConstraint(name = "uk_slot_workspace_index",
        columnNames = {"workspace_id", "slot_index"}))
@Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder
public class GcChartSlot {

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "workspace_id", nullable = false)
    private GcChartWorkspace workspace;

    /** 슬롯 인덱스 (0-based) */
    @Column(name = "slot_index", nullable = false)
    private Integer slotIndex;

    /** 종목 코드 (e.g. "KRW-BTC", "AAPL") */
    @Column(name = "symbol", length = 50)
    private String symbol;

    /** 타임프레임 (1m/5m/15m/30m/1h/4h/1D/1W/1M) */
    @Column(name = "timeframe", length = 10)
    private String timeframe;

    /** 차트 타입 (candlestick/bar/line/area/baseline) */
    @Column(name = "chart_type", length = 20)
    @Builder.Default
    private String chartType = "candlestick";

    /** 테마 (dark/light/blue) */
    @Column(name = "theme", length = 20)
    @Builder.Default
    private String theme = "dark";

    /** 차트 모드 (chart/trading) */
    @Column(name = "mode", length = 20)
    @Builder.Default
    private String mode = "chart";

    /** 로그 스케일 사용 여부 */
    @Column(name = "log_scale")
    @Builder.Default
    private Boolean logScale = false;

    /**
     * 지표 설정 JSON 배열.
     * 형식: [{id, type, params, hidden, plotVisibility}]
     * frontend IndicatorConfig[] 구조와 1:1 대응
     */
    @Column(name = "indicators_json", columnDefinition = "JSON")
    @JdbcTypeCode(SqlTypes.JSON)
    private String indicatorsJson;

    /**
     * 드로잉 객체 JSON 배열.
     * 형식: [{id, type, points, color, lineWidth, style, text, visible, fibtzSettings}]
     * frontend Drawing[] 구조와 1:1 대응
     */
    @Column(name = "drawings_json", columnDefinition = "JSON")
    @JdbcTypeCode(SqlTypes.JSON)
    private String drawingsJson;

    /** 드로잉 잠금 여부 */
    @Column(name = "drawings_locked")
    @Builder.Default
    private Boolean drawingsLocked = false;

    /** 드로잉 표시 여부 */
    @Column(name = "drawings_visible")
    @Builder.Default
    private Boolean drawingsVisible = true;

    /**
     * 보조지표 창(pane) 레이아웃 JSON.
     * 형식: [{paneIndex, height}]
     */
    @Column(name = "pane_layout_json", columnDefinition = "JSON")
    @JdbcTypeCode(SqlTypes.JSON)
    private String paneLayoutJson;

    /**
     * 메인 차트 캔들 색상 설정 JSON.
     * frontend MainChartStyle 구조
     */
    @Column(name = "main_chart_style_json", columnDefinition = "JSON")
    @JdbcTypeCode(SqlTypes.JSON)
    private String mainChartStyleJson;

    @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();
    }
}
