package com.goldenchart.controller;

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

import java.util.Map;

/**
 * 전역 지표 파라미터 CRUD REST API.
 *
 * <p>프론트엔드 indicatorRegistry.ts 의 defaultParams 를 완전히 대체하는
 * 사용자별 지표 파라미터를 저장/조회한다.</p>
 *
 * <pre>
 * GET    /indicator-settings          — 전체 지표 파라미터 조회
 * GET    /indicator-settings/{type}   — 특정 지표 파라미터 조회
 * PUT    /indicator-settings          — 전체 지표 파라미터 저장 (덮어쓰기)
 * PATCH  /indicator-settings/{type}   — 특정 지표 파라미터 병합 저장
 * </pre>
 */
@RestController
@RequestMapping("/indicator-settings")
@RequiredArgsConstructor
public class IndicatorSettingsController {

    private final IndicatorSettingsService service;

    // ── 헤더 파싱 헬퍼 ────────────────────────────────────────────────────────

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

    // ── GET: 전체 파라미터 조회 ────────────────────────────────────────────────

    /**
     * 이 장치/사용자의 모든 지표 파라미터를 반환.
     * 프론트엔드 앱 시작 시 호출하여 전역 설정을 로드한다.
     */
    @GetMapping
    public ResponseEntity<Map<String, Map<String, Object>>> getAll(
            @RequestHeader(value = "X-User-Id",   required = false) String userIdHeader,
            @RequestHeader(value = "X-Device-Id", required = false) String deviceId) {
        Map<String, Map<String, Object>> result = service.getAll(userId(userIdHeader), deviceId);
        return ResponseEntity.ok(result);
    }

    // ── GET: 특정 지표 파라미터 조회 ──────────────────────────────────────────

    @GetMapping("/{indicatorType}")
    public ResponseEntity<Map<String, Object>> getForType(
            @PathVariable String indicatorType,
            @RequestHeader(value = "X-User-Id",   required = false) String userIdHeader,
            @RequestHeader(value = "X-Device-Id", required = false) String deviceId) {
        return ResponseEntity.ok(service.getForType(userId(userIdHeader), deviceId, indicatorType));
    }

    // ── PUT: 전체 파라미터 저장 ────────────────────────────────────────────────

    /**
     * 모든 지표 파라미터를 한 번에 저장(덮어쓰기).
     *
     * Request body:
     * {
     *   "RSI":           {"length": 9, "src": "close"},
     *   "MACD":          {"fastLength": 12, "slowLength": 26, "signalLength": 9},
     *   "BollingerBands":{"length": 20, "mult": 2.0},
     *   ...
     * }
     */
    @PutMapping
    public ResponseEntity<Void> saveAll(
            @RequestHeader(value = "X-User-Id",   required = false) String userIdHeader,
            @RequestHeader(value = "X-Device-Id", required = false) String deviceId,
            @RequestBody Map<String, Map<String, Object>> allParams) {
        service.saveAll(userId(userIdHeader), deviceId, allParams);
        return ResponseEntity.noContent().build();
    }

    // ── PATCH: 특정 지표 파라미터 병합 저장 ────────────────────────────────────

    /**
     * 특정 지표의 파라미터만 업데이트.
     * 나머지 지표 설정은 유지된다.
     *
     * PATCH /indicator-settings/RSI
     * Body: {"length": 14, "src": "close"}
     */
    @PatchMapping("/{indicatorType}")
    public ResponseEntity<Void> saveForType(
            @PathVariable String indicatorType,
            @RequestHeader(value = "X-User-Id",   required = false) String userIdHeader,
            @RequestHeader(value = "X-Device-Id", required = false) String deviceId,
            @RequestBody Map<String, Object> params) {
        service.saveForType(userId(userIdHeader), deviceId, indicatorType, params);
        return ResponseEntity.noContent().build();
    }

    // ── GET: 전체 시각 설정 조회 ───────────────────────────────────────────────

    /**
     * 모든 지표의 시각 설정(색상·선굵기·수평선)을 반환.
     * 프론트엔드 앱 시작 시 호출하여 전역 시각 설정을 로드한다.
     *
     * GET /indicator-settings/visual
     */
    @GetMapping("/visual")
    public ResponseEntity<Map<String, Map<String, Object>>> getAllVisual(
            @RequestHeader(value = "X-User-Id",   required = false) String userIdHeader,
            @RequestHeader(value = "X-Device-Id", required = false) String deviceId) {
        return ResponseEntity.ok(service.getAllVisual(userId(userIdHeader), deviceId));
    }

    // ── PATCH: 특정 지표 시각 설정 저장 ───────────────────────────────────────

    /**
     * 특정 지표의 시각 설정(색상·선굵기·수평선)을 병합 저장.
     *
     * PATCH /indicator-settings/RSI/visual
     * Body: {
     *   "plots":  [{"id":"plot0","color":"#ff0000","lineWidth":2,"type":"line"}],
     *   "hlines": [{"price":70,"color":"#EF5350","visible":true}]
     * }
     */
    @PatchMapping("/{indicatorType}/visual")
    public ResponseEntity<Void> saveVisualForType(
            @PathVariable String indicatorType,
            @RequestHeader(value = "X-User-Id",   required = false) String userIdHeader,
            @RequestHeader(value = "X-Device-Id", required = false) String deviceId,
            @RequestBody Map<String, Object> visual) {
        service.saveVisualForType(userId(userIdHeader), deviceId, indicatorType, visual);
        return ResponseEntity.noContent().build();
    }
}
