package com.goldenchart.controller;

import com.goldenchart.service.AppSettingsService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * 앱 전역 차트 기본 설정 REST API.
 *
 * <p>프론트엔드에 하드코딩된 기본값들(기본 심볼·타임프레임·테마·캔들 색상 등)을
 * 장치/사용자별로 DB 에서 관리한다.</p>
 *
 * <pre>
 * GET  /app-settings   — 현재 기본 설정 로드 (앱 시작 시 호출)
 * PUT  /app-settings   — 기본 설정 저장
 * </pre>
 *
 * 반환 구조:
 * <pre>
 * {
 *   "defaultSymbol":    "KRW-BTC",
 *   "defaultTimeframe": "1D",
 *   "defaultChartType": "candlestick",
 *   "defaultTheme":     "dark",
 *   "defaultLogScale":  false,
 *   "defaultLayoutId":  "1",
 *   "mainChartStyle":   { "upColor":"#ff6b6b", "downColor":"#4dabf7", ... },
 *   "syncOptions":      { "symbol":false, "interval":false, "crosshair":true, ... }
 * }
 * </pre>
 */
@RestController
@RequestMapping("/app-settings")
@RequiredArgsConstructor
public class AppSettingsController {

    private final AppSettingsService service;

    // ── GET ───────────────────────────────────────────────────────────────────

    /**
     * 앱 시작 시 기본 설정 로드.
     * DB 에 데이터가 없으면 엔티티 기본값(hardcoded fallback)을 반환한다.
     */
    @GetMapping
    public ResponseEntity<Map<String, Object>> get(
            @RequestHeader(value = "X-User-Id",   required = false) String userIdHeader,
            @RequestHeader(value = "X-Device-Id", required = false) String deviceId) {
        return ResponseEntity.ok(service.get(parseUserId(userIdHeader), deviceId));
    }

    // ── PUT ───────────────────────────────────────────────────────────────────

    /**
     * 기본 설정 저장.
     * 변경된 필드만 보내도 되며, 없는 키는 기존 값 유지.
     *
     * <p>프론트엔드에서 호출해야 하는 시점:
     * <ul>
     *   <li>테마 변경 시 (defaultTheme)</li>
     *   <li>캔들 색상 변경 시 (mainChartStyle)</li>
     *   <li>레이아웃 변경 시 (defaultLayoutId)</li>
     *   <li>기본 심볼/타임프레임 변경 시</li>
     *   <li>동기화 옵션 변경 시 (syncOptions)</li>
     * </ul>
     */
    @PutMapping
    public ResponseEntity<Map<String, Object>> save(
            @RequestHeader(value = "X-User-Id",   required = false) String userIdHeader,
            @RequestHeader(value = "X-Device-Id", required = false) String deviceId,
            @RequestBody Map<String, Object> data) {
        return ResponseEntity.ok(service.save(parseUserId(userIdHeader), deviceId, data));
    }

    // ── helpers ───────────────────────────────────────────────────────────────

    private Long parseUserId(String header) {
        if (header == null || header.isBlank()) return null;
        try { return Long.parseLong(header); } catch (NumberFormatException e) { return null; }
    }
}
