import React, { useState, useEffect } from 'react';
import {
  Box,
  Typography,
  Paper,
  Table,
  TableBody,
  TableCell,
  TableContainer,
  TableHead,
  TableRow,
  Select,
  MenuItem,
  FormControl,
  Switch,
  Button,
  Chip,
  Alert,
  AlertTitle,
  CircularProgress,
  Tooltip,
  IconButton,
} from '@mui/material';
import InfoIcon from '@mui/icons-material/Info';
import RefreshIcon from '@mui/icons-material/Refresh';
import RecommendIcon from '@mui/icons-material/Recommend';
import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore';
import {
  IndicatorCalculationSetting,
  MAPriceType,
  getAllSettings,
  getPriceTypes,
  updateSetting,
  resetToDefaults,
  applyRecommended,
} from '../../services/indicatorCalculationSettingService';

/**
 * 보조지표 계산 설정 탭
 */
const IndicatorCalculationSettingsTab: React.FC = () => {
  const [settings, setSettings] = useState<IndicatorCalculationSetting[]>([]);
  const [priceTypes, setPriceTypes] = useState<MAPriceType[]>([]);
  const [loading, setLoading] = useState<boolean>(true);
  const [saving, setSaving] = useState<Record<number, boolean>>({});
  const [successMessage, setSuccessMessage] = useState<string>('');
  const [errorMessage, setErrorMessage] = useState<string>('');

  // 초기 데이터 로드
  useEffect(() => {
    loadData();
  }, []);

  const loadData = async () => {
    try {
      setLoading(true);
      setErrorMessage('');
      const [settingsData, priceTypesData] = await Promise.all([
        getAllSettings(),
        getPriceTypes(),
      ]);
      setSettings(settingsData);
      setPriceTypes(priceTypesData);
    } catch (error) {
      console.error('설정 로드 실패:', error);
      setErrorMessage('설정을 불러오는데 실패했습니다.');
    } finally {
      setLoading(false);
    }
  };

  // 가격 타입 변경
  const handlePriceTypeChange = async (id: number, priceType: string) => {
    try {
      setSaving({ ...saving, [id]: true });
      setSuccessMessage('');
      setErrorMessage('');

      // 현재 설정 찾기
      const currentSetting = settings.find((s) => s.id === id);
      if (!currentSetting) {
        setErrorMessage('설정을 찾을 수 없습니다.');
        return;
      }

      // enabled 값을 포함하여 업데이트
      const updatedSetting = await updateSetting(id, {
        priceType,
        enabled: currentSetting.enabled,
      } as any);

      setSettings((prev) =>
        prev.map((s) => (s.id === id ? updatedSetting : s))
      );

      setSuccessMessage('설정이 저장되었습니다.');
      setTimeout(() => setSuccessMessage(''), 3000);
    } catch (error) {
      console.error('설정 저장 실패:', error);
      setErrorMessage('설정 저장에 실패했습니다.');
    } finally {
      setSaving({ ...saving, [id]: false });
    }
  };

  // 활성화/비활성화 토글
  const handleEnabledToggle = async (id: number, enabled: boolean) => {
    try {
      setSaving({ ...saving, [id]: true });
      setSuccessMessage('');
      setErrorMessage('');

      // 현재 설정 찾기
      const currentSetting = settings.find((s) => s.id === id);
      if (!currentSetting) {
        setErrorMessage('설정을 찾을 수 없습니다.');
        return;
      }

      // priceType 값을 포함하여 업데이트
      const updatedSetting = await updateSetting(id, {
        priceType: currentSetting.priceType,
        enabled,
      } as any);

      setSettings((prev) =>
        prev.map((s) => (s.id === id ? updatedSetting : s))
      );

      setSuccessMessage('설정이 저장되었습니다.');
      setTimeout(() => setSuccessMessage(''), 3000);
    } catch (error) {
      console.error('설정 저장 실패:', error);
      setErrorMessage('설정 저장에 실패했습니다.');
    } finally {
      setSaving({ ...saving, [id]: false });
    }
  };

  // 기본값으로 초기화
  const handleReset = async () => {
    if (!window.confirm('모든 설정을 기본값으로 초기화하시겠습니까?')) {
      return;
    }

    try {
      setLoading(true);
      setSuccessMessage('');
      setErrorMessage('');

      const message = await resetToDefaults();
      await loadData();

      setSuccessMessage(message);
    } catch (error) {
      console.error('초기화 실패:', error);
      setErrorMessage('초기화에 실패했습니다.');
    } finally {
      setLoading(false);
    }
  };

  // 권장 설정 적용
  const handleApplyRecommended = async () => {
    if (
      !window.confirm(
        '골든/데드크로스 감지 최적화를 위한 권장 설정을 적용하시겠습니까?\n(모든 지표 → Typical Price 방식)'
      )
    ) {
      return;
    }

    try {
      setLoading(true);
      setSuccessMessage('');
      setErrorMessage('');

      const message = await applyRecommended();
      await loadData();

      setSuccessMessage(message);
    } catch (error) {
      console.error('권장 설정 적용 실패:', error);
      setErrorMessage('권장 설정 적용에 실패했습니다.');
    } finally {
      setLoading(false);
    }
  };

  if (loading) {
    return (
      <Box display="flex" justifyContent="center" alignItems="center" minHeight={400}>
        <CircularProgress />
      </Box>
    );
  }

  return (
    <Box>
      <Box display="flex" justifyContent="space-between" alignItems="center" mb={3}>
        <Typography variant="h6">보조지표 계산 설정</Typography>
        <Box display="flex" gap={1}>
          <Button
            variant="outlined"
            size="small"
            startIcon={<RefreshIcon />}
            onClick={loadData}
          >
            새로고침
          </Button>
          <Button
            variant="outlined"
            size="small"
            color="warning"
            startIcon={<SettingsBackupRestoreIcon />}
            onClick={handleReset}
          >
            기본값 복원
          </Button>
          <Button
            variant="contained"
            size="small"
            color="success"
            startIcon={<RecommendIcon />}
            onClick={handleApplyRecommended}
          >
            권장 설정 적용
          </Button>
        </Box>
      </Box>

      {/* 설명 */}
      <Alert severity="info" sx={{ mb: 3 }}>
        <AlertTitle>보조지표 계산 방식 설정</AlertTitle>
        <Typography variant="body2">
          각 보조지표를 계산할 때 사용할 가격 타입을 선택할 수 있습니다.
          <br />
          <strong>권장:</strong> 골든/데드크로스 감지 정확도 향상을 위해{' '}
          <strong>Typical Price (HLC/3)</strong> 방식을 권장합니다.
          <br />
          이 방식은 캔들 내부에서 발생하는 교차를 더 잘 감지할 수 있습니다.
        </Typography>
      </Alert>

      {/* 성공 메시지 */}
      {successMessage && (
        <Alert severity="success" sx={{ mb: 2 }} onClose={() => setSuccessMessage('')}>
          {successMessage}
        </Alert>
      )}

      {/* 에러 메시지 */}
      {errorMessage && (
        <Alert severity="error" sx={{ mb: 2 }} onClose={() => setErrorMessage('')}>
          {errorMessage}
        </Alert>
      )}

      {/* 설정 테이블 */}
      <TableContainer component={Paper} elevation={2}>
        <Table>
          <TableHead>
            <TableRow>
              <TableCell>지표명</TableCell>
              <TableCell>타입</TableCell>
              <TableCell>가격 방식</TableCell>
              <TableCell width="40%">설명</TableCell>
              <TableCell align="center">활성화</TableCell>
            </TableRow>
          </TableHead>
          <TableBody>
            {settings.map((setting) => (
              <TableRow
                key={setting.id}
                sx={{
                  opacity: setting.enabled ? 1 : 0.5,
                  backgroundColor: setting.enabled ? 'inherit' : 'action.hover',
                }}
              >
                <TableCell>
                  <Typography variant="body1" fontWeight="bold">
                    {setting.indicatorName}
                  </Typography>
                </TableCell>
                <TableCell>
                  <Chip label={setting.indicatorType} size="small" color="primary" />
                </TableCell>
                <TableCell>
                  <FormControl size="small" fullWidth disabled={!setting.enabled || saving[setting.id]}>
                    <Select
                      value={setting.priceType}
                      onChange={(e) =>
                        handlePriceTypeChange(setting.id, e.target.value as string)
                      }
                    >
                      {priceTypes.map((type) => (
                        <MenuItem key={type.value} value={type.value}>
                          <Box>
                            <Typography variant="body2">{type.koreanName}</Typography>
                            <Typography variant="caption" color="text.secondary">
                              {type.description}
                            </Typography>
                          </Box>
                        </MenuItem>
                      ))}
                    </Select>
                  </FormControl>
                  <Box mt={0.5}>
                    <Typography variant="caption" color="text.secondary">
                      현재: {setting.priceTypeName}
                    </Typography>
                  </Box>
                </TableCell>
                <TableCell>
                  <Typography variant="body2" color="text.secondary">
                    {setting.description}
                  </Typography>
                </TableCell>
                <TableCell align="center">
                  <Switch
                    checked={setting.enabled}
                    onChange={(e) =>
                      handleEnabledToggle(setting.id, e.target.checked)
                    }
                    disabled={saving[setting.id]}
                  />
                </TableCell>
              </TableRow>
            ))}
          </TableBody>
        </Table>
      </TableContainer>

      {/* 가격 타입 설명 */}
      <Paper elevation={1} sx={{ p: 2, mt: 3 }}>
        <Box display="flex" alignItems="center" gap={1} mb={2}>
          <InfoIcon color="primary" />
          <Typography variant="h6">가격 타입 설명</Typography>
        </Box>
        <Box component="ul" sx={{ pl: 2 }}>
          <li>
            <Typography variant="body2">
              <strong>종가 (Close):</strong> 가장 일반적으로 사용되는 방식. 캔들의 종가만 사용합니다.
            </Typography>
          </li>
          <li>
            <Typography variant="body2">
              <strong>평균가 (Typical Price, HLC/3):</strong> (고가 + 저가 + 종가) / 3.
              캔들 내부 교차 감지에 가장 효과적입니다. <strong>권장!</strong>
            </Typography>
          </li>
          <li>
            <Typography variant="body2">
              <strong>가중평균가 (Weighted Close, HLCC/4):</strong> (고가 + 저가 + 종가*2) / 4.
              종가에 더 높은 가중치를 부여합니다.
            </Typography>
          </li>
          <li>
            <Typography variant="body2">
              <strong>중간가 (Median Price, HL/2):</strong> (고가 + 저가) / 2.
              고가와 저가의 중간값입니다.
            </Typography>
          </li>
          <li>
            <Typography variant="body2">
              <strong>OHLC평균 (OHLC Average):</strong> (시가 + 고가 + 저가 + 종가) / 4.
              모든 가격을 동일하게 반영합니다.
            </Typography>
          </li>
        </Box>
      </Paper>
    </Box>
  );
};

export default IndicatorCalculationSettingsTab;
