package com.goldenchart.entity;

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

import java.time.LocalDateTime;

/**
 * 장치/사용자별 전역 지표 파라미터 설정.
 *
 * params_json 구조 예시:
 * {
 *   "RSI":             {"length": 9, "src": "close"},
 *   "MACD":            {"fastLength": 12, "slowLength": 26, "signalLength": 9, "src": "close"},
 *   "BollingerBands":  {"length": 20, "mult": 2.0, "src": "close"},
 *   "Stochastic":      {"kLength": 14, "smooth": 3, "dSmoothing": 3},
 *   "IchimokuCloud":   {"conversionPeriods": 9, "basePeriods": 26,
 *                       "laggingSpan2Periods": 52, "displacement": 26},
 *   ...
 * }
 *
 * 프론트엔드 indicatorRegistry.ts 의 defaultParams 를 완전히 대체한다.
 */
@Entity
@Table(name = "gc_indicator_settings")
@Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder
public class GcIndicatorSettings {

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

    /** 비회원 기기 식별자 (X-Device-Id 헤더) */
    @Column(name = "device_id", length = 100, unique = true)
    private String deviceId;

    /** 회원 ID (향후 확장) */
    @Column(name = "user_id", unique = true)
    private Long userId;

    /**
     * 지표 타입 → 파라미터 맵의 JSON 직렬화.
     * Map&lt;String, Map&lt;String, Object&gt;&gt; 형태로 역직렬화한다.
     */
    @Column(name = "params_json", columnDefinition = "JSON", nullable = false)
    @JdbcTypeCode(SqlTypes.JSON)
    @Builder.Default
    private String paramsJson = "{}";

    /**
     * 지표 타입 → 시각 설정(색상·선굵기·수평선) JSON 직렬화.
     * Map&lt;String, IndicatorVisual&gt; 형태로 역직렬화한다.
     * <pre>
     * {
     *   "RSI": {
     *     "plots":  [{"id":"plot0","color":"#7E57C2","lineWidth":2,"type":"line"}],
     *     "hlines": [{"price":70,"color":"#EF5350","visible":true}]
     *   }
     * }
     * </pre>
     */
    @Column(name = "visual_config_json", columnDefinition = "JSON")
    @JdbcTypeCode(SqlTypes.JSON)
    @Builder.Default
    private String visualConfigJson = "{}";

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