"use client";

import React, { useState, useCallback, useEffect } from "react";
import { DashboardElement, ChartDataSource, ChartConfig, QueryResult } from "./types";
import { QueryEditor } from "./QueryEditor";
import { ChartConfigPanel } from "./ChartConfigPanel";
import { VehicleMapConfigPanel } from "./VehicleMapConfigPanel";
import { DatabaseConfig } from "./data-sources/DatabaseConfig";
import { ApiConfig } from "./data-sources/ApiConfig";
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
import { X } from "lucide-react";
import { cn } from "@/lib/utils";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";

interface ElementConfigSidebarProps {
  element: DashboardElement | null;
  isOpen: boolean;
  onClose: () => void;
  onApply: (element: DashboardElement) => void;
}

/**
 * 요소 설정 사이드바 컴포넌트
 * - 왼쪽에서 슬라이드 인/아웃
 * - 캔버스 위에 오버레이
 * - "적용" 버튼으로 명시적 저장
 */
export function ElementConfigSidebar({ element, isOpen, onClose, onApply }: ElementConfigSidebarProps) {
  const [dataSource, setDataSource] = useState<ChartDataSource>({
    type: "database",
    connectionType: "current",
    refreshInterval: 0,
  });
  const [chartConfig, setChartConfig] = useState<ChartConfig>({});
  const [queryResult, setQueryResult] = useState<QueryResult | null>(null);
  const [customTitle, setCustomTitle] = useState<string>("");
  const [showHeader, setShowHeader] = useState<boolean>(true);

  // 사이드바가 열릴 때 초기화
  useEffect(() => {
    if (isOpen && element) {
      setDataSource(element.dataSource || { type: "database", connectionType: "current", refreshInterval: 0 });
      setChartConfig(element.chartConfig || {});
      setQueryResult(null);
      setCustomTitle(element.customTitle || "");
      setShowHeader(element.showHeader !== false);
    }
  }, [isOpen, element]);

  // Esc 키로 사이드바 닫기
  useEffect(() => {
    if (!isOpen) return;

    const handleEsc = (e: KeyboardEvent) => {
      if (e.key === "Escape") {
        onClose();
      }
    };

    window.addEventListener("keydown", handleEsc);
    return () => window.removeEventListener("keydown", handleEsc);
  }, [isOpen, onClose]);

  // 데이터 소스 타입 변경
  const handleDataSourceTypeChange = useCallback((type: "database" | "api") => {
    if (type === "database") {
      setDataSource({
        type: "database",
        connectionType: "current",
        refreshInterval: 0,
      });
    } else {
      setDataSource({
        type: "api",
        method: "GET",
        refreshInterval: 0,
      });
    }

    setQueryResult(null);
    setChartConfig({});
  }, []);

  // 데이터 소스 업데이트
  const handleDataSourceUpdate = useCallback((updates: Partial<ChartDataSource>) => {
    setDataSource((prev) => ({ ...prev, ...updates }));
  }, []);

  // 차트 설정 변경 처리
  const handleChartConfigChange = useCallback((newConfig: ChartConfig) => {
    setChartConfig(newConfig);
  }, []);

  // 쿼리 테스트 결과 처리
  const handleQueryTest = useCallback((result: QueryResult) => {
    setQueryResult(result);
    setChartConfig({});
  }, []);

  // 적용 처리
  const handleApply = useCallback(() => {
    if (!element) return;

    const updatedElement: DashboardElement = {
      ...element,
      dataSource,
      chartConfig,
      customTitle: customTitle.trim() || undefined,
      showHeader,
    };

    onApply(updatedElement);
    // 사이드바는 열린 채로 유지 (연속 수정 가능)
  }, [element, dataSource, chartConfig, customTitle, showHeader, onApply]);

  // 요소가 없으면 렌더링하지 않음
  if (!element) return null;

  // 차트 설정이 필요 없는 위젯 (쿼리/API만 필요)
  const isSimpleWidget =
    element.subtype === "todo" ||
    element.subtype === "booking-alert" ||
    element.subtype === "maintenance" ||
    element.subtype === "document" ||
    element.subtype === "risk-alert" ||
    element.subtype === "vehicle-status" ||
    element.subtype === "vehicle-list" ||
    element.subtype === "status-summary" ||
    element.subtype === "delivery-status" ||
    element.subtype === "delivery-status-summary" ||
    element.subtype === "delivery-today-stats" ||
    element.subtype === "cargo-list" ||
    element.subtype === "customer-issues" ||
    element.subtype === "driver-management" ||
    element.subtype === "work-history" ||
    element.subtype === "transport-stats";

  // 자체 기능 위젯 (DB 연결 불필요, 헤더 설정만 가능)
  const isSelfContainedWidget =
    element.subtype === "weather" || element.subtype === "exchange" || element.subtype === "calculator";

  // 지도 위젯 (위도/경도 매핑 필요)
  const isMapWidget = element.subtype === "vehicle-map" || element.subtype === "map-summary";

  // 헤더 전용 위젯
  const isHeaderOnlyWidget =
    element.type === "widget" &&
    (element.subtype === "clock" || element.subtype === "calendar" || isSelfContainedWidget);

  // 저장 가능 여부 확인
  const isPieChart = element.subtype === "pie" || element.subtype === "donut";
  const isApiSource = dataSource.type === "api";

  const hasYAxis =
    chartConfig.yAxis &&
    (typeof chartConfig.yAxis === "string" || (Array.isArray(chartConfig.yAxis) && chartConfig.yAxis.length > 0));

  const isTitleChanged = customTitle.trim() !== (element.customTitle || "");
  const isHeaderChanged = showHeader !== (element.showHeader !== false);

  const canApply =
    isTitleChanged ||
    isHeaderChanged ||
    (isSimpleWidget
      ? queryResult && queryResult.rows.length > 0
      : isMapWidget
        ? queryResult && queryResult.rows.length > 0 && chartConfig.latitudeColumn && chartConfig.longitudeColumn
        : queryResult &&
          queryResult.rows.length > 0 &&
          chartConfig.xAxis &&
          (isPieChart || isApiSource ? (chartConfig.aggregation === "count" ? true : hasYAxis) : hasYAxis));

  return (
    <div
      className={cn(
        "fixed top-14 left-0 z-[100] flex h-[calc(100vh-3.5rem)] w-96 flex-col bg-white shadow-2xl transition-transform duration-300 ease-in-out",
        isOpen ? "translate-x-0" : "translate-x-[-100%]",
      )}
    >
      {/* 헤더 */}
      <div className="flex items-center justify-between border-b p-4">
        <h3 className="text-lg font-semibold text-gray-900">{element.title} 설정</h3>
        <Button variant="ghost" size="icon" onClick={onClose} className="h-8 w-8">
          <X className="h-5 w-5" />
        </Button>
      </div>

      {/* 본문: 스크롤 가능 영역 */}
      <div className="flex-1 overflow-y-auto p-4">
        {/* 기본 설정 */}
        <div className="mb-4 space-y-3">
          {/* 커스텀 제목 입력 */}
          <div>
            <label className="mb-1 block text-sm font-medium text-gray-700">위젯 제목</label>
            <input
              type="text"
              value={customTitle}
              onChange={(e) => setCustomTitle(e.target.value)}
              onKeyDown={(e) => e.stopPropagation()}
              placeholder="제목을 입력해주세요."
              className="focus:border-primary focus:ring-primary w-full rounded-md border border-gray-300 px-3 py-2 text-sm focus:ring-1 focus:outline-none"
            />
          </div>

          {/* 헤더 표시 옵션 */}
          <div className="flex items-center gap-2">
            <input
              type="checkbox"
              id="showHeader"
              checked={showHeader}
              onChange={(e) => setShowHeader(e.target.checked)}
              className="text-primary focus:ring-primary h-4 w-4 rounded border-gray-300"
            />
            <label htmlFor="showHeader" className="text-sm font-medium text-gray-700">
              위젯 헤더 표시
            </label>
          </div>
        </div>

        {/* 헤더 전용 위젯이 아닐 때만 데이터 소스 탭 표시 */}
        {!isHeaderOnlyWidget && (
          <Tabs
            defaultValue={dataSource.type}
            onValueChange={(value) => handleDataSourceTypeChange(value as "database" | "api")}
            className="w-full"
          >
            <TabsList className="grid w-full grid-cols-2">
              <TabsTrigger value="database">데이터베이스</TabsTrigger>
              <TabsTrigger value="api">REST API</TabsTrigger>
            </TabsList>

            <TabsContent value="database" className="mt-4 space-y-4">
              <DatabaseConfig dataSource={dataSource} onChange={handleDataSourceUpdate} />
              <QueryEditor
                dataSource={dataSource}
                onDataSourceChange={handleDataSourceUpdate}
                onQueryTest={handleQueryTest}
              />

              {/* 차트/지도 설정 */}
              {!isSimpleWidget && queryResult && queryResult.rows.length > 0 && (
                <div className="mt-4">
                  {isMapWidget ? (
                    <VehicleMapConfigPanel
                      config={chartConfig}
                      queryResult={queryResult}
                      onConfigChange={handleChartConfigChange}
                    />
                  ) : (
                    <ChartConfigPanel
                      config={chartConfig}
                      queryResult={queryResult}
                      onConfigChange={handleChartConfigChange}
                      chartType={element.subtype}
                      dataSourceType={dataSource.type}
                      query={dataSource.query}
                    />
                  )}
                </div>
              )}
            </TabsContent>

            <TabsContent value="api" className="mt-4 space-y-4">
              <ApiConfig dataSource={dataSource} onChange={handleDataSourceUpdate} onTestResult={handleQueryTest} />

              {/* 차트/지도 설정 */}
              {!isSimpleWidget && queryResult && queryResult.rows.length > 0 && (
                <div className="mt-4">
                  {isMapWidget ? (
                    <VehicleMapConfigPanel
                      config={chartConfig}
                      queryResult={queryResult}
                      onConfigChange={handleChartConfigChange}
                    />
                  ) : (
                    <ChartConfigPanel
                      config={chartConfig}
                      queryResult={queryResult}
                      onConfigChange={handleChartConfigChange}
                      chartType={element.subtype}
                      dataSourceType={dataSource.type}
                      query={dataSource.query}
                    />
                  )}
                </div>
              )}
            </TabsContent>
          </Tabs>
        )}

        {/* 데이터 로드 상태 */}
        {queryResult && (
          <div className="mt-4">
            <Badge variant="default">{queryResult.rows.length}개 데이터 로드됨</Badge>
          </div>
        )}
      </div>

      {/* 푸터: 적용 버튼 */}
      <div className="flex items-center justify-end gap-2 border-t p-4">
        <Button variant="outline" size="sm" onClick={onClose}>
          취소
        </Button>
        <Button size="sm" onClick={handleApply} disabled={isHeaderOnlyWidget ? false : !canApply}>
          적용
        </Button>
      </div>
    </div>
  );
}
