import { useEffect, useState } from 'react';
import {
  Alert,
  Box,
  Button,
  LinearProgress,
  Stack,
  Typography,
} from '@mui/material';
import { useNavigate } from 'react-router-dom';
import { useAppStore } from '../store/useAppStore';
import { createEpubFromOcr } from '../utils/epubUtils';

const EpubStep = () => {
  const navigate = useNavigate();
  const ocrText = useAppStore((state) => state.ocrText);
  const translatedText = useAppStore((state) => state.translatedText);
  const translationStatus = useAppStore((state) => state.translationStatus);
  const translationError = useAppStore((state) => state.translationError);
  const generatedEpub = useAppStore((state) => state.generatedEpub);
  const setGeneratedEpub = useAppStore((state) => state.setGeneratedEpub);
  const setError = useAppStore((state) => state.setError);
  const coverImageId = useAppStore((state) => state.coverImageId);
  const croppedCoverImage = useAppStore((state) => state.croppedCoverImage);
  const [processing, setProcessing] = useState(false);
  const needsCoverCrop = Boolean(coverImageId && !croppedCoverImage);
  const translationBlocking = translationStatus === 'running';
  const exportText = translatedText?.trim() || ocrText;

  useEffect(() => {
    let cancelled = false;
    const run = async () => {
      if (!exportText?.trim() || generatedEpub || needsCoverCrop || translationBlocking) return;
      setProcessing(true);
      try {
        const epub = await createEpubFromOcr(exportText, croppedCoverImage);
        if (!cancelled) {
          setGeneratedEpub(epub);
        }
      } catch (error) {
        if (!cancelled) {
          setError(error.message || 'EPUB oluşturulamadı.');
        }
      } finally {
        if (!cancelled) {
          setProcessing(false);
        }
      }
    };
    run();
    return () => {
      cancelled = true;
    };
  }, [
    croppedCoverImage,
    exportText,
    generatedEpub,
    needsCoverCrop,
    setError,
    setGeneratedEpub,
    translationBlocking,
  ]);

  if (!ocrText?.trim()) {
    return (
      <Stack spacing={2}>
        <Alert severity="info">Önce OCR adımını tamamla.</Alert>
        <Button variant="contained" onClick={() => navigate('/ocr')}>
          OCR adımına dön
        </Button>
      </Stack>
    );
  }

  return (
    <Stack spacing={4}>
      <Box textAlign="center">
        <Typography variant="h5">EPUB çıktısı</Typography>
        <Typography color="text.secondary">
          OCR sonucundaki tüm metinleri tek bir EPUB dosyasında topluyoruz.
        </Typography>
      </Box>
      {translationBlocking && (
        <Alert severity="info">
          Türkçe çeviri tamamlanana kadar EPUB üretimi bekletiliyor. Lütfen çeviri ekranındaki işlemin bitmesini
          bekle.
        </Alert>
      )}
      {translationStatus === 'done' && translatedText && (
        <Alert severity="success">
          Çeviri tamamlandı. EPUB, Türkçe metinle oluşturuluyor.
        </Alert>
      )}
      {translationStatus === 'error' && (
        <Alert severity="warning">
          Çeviri sırasında bir sorun oluştu. EPUB üretiminde orijinal OCR metni kullanılacak.
          {translationError ? ` (${translationError})` : ''}
        </Alert>
      )}
      {needsCoverCrop && (
        <Alert severity="warning">
          Kapak olarak işaretlediğin görseli croplamalısın. Crop adımında kapak görselini kaydet ve tekrar dene.
        </Alert>
      )}
      {processing && <LinearProgress />}
      {generatedEpub && (
        <Alert severity="success">
          EPUB hazır: {generatedEpub.filename}
        </Alert>
      )}
      {croppedCoverImage ? (
        <Box sx={{ textAlign: 'center' }}>
          <Typography variant="subtitle1">Kapak önizlemesi</Typography>
          <Box
            component="img"
            src={croppedCoverImage.url}
            alt="Epub kapak görseli"
            sx={{
              mt: 2,
              maxHeight: 260,
              width: 'auto',
              borderRadius: 2,
              boxShadow: 3,
            }}
          />
        </Box>
      ) : (
        coverImageId && (
          <Alert severity="info">
            Kapak seçili ancak crop işlemi tamamlanmadı. Crop adımına dönerek kapak kesimini belirle.
          </Alert>
        )
      )}

      <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2} justifyContent="space-between">
        <Button variant="contained" onClick={() => navigate('/ocr')}>
          Geri dön
        </Button>
        <Button
          variant="contained"
          disabled={!generatedEpub || processing || needsCoverCrop || translationBlocking}
          onClick={() => navigate('/download')}
        >
          EPUB&apos;i indir
        </Button>
      </Stack>
    </Stack>
  );
};

export default EpubStep;
