'use client';

import { useState, useEffect } from 'react';
import { fileApi } from '@/lib/api';
import { FileItem } from '@/types';
import { formatBytes } from '@/lib/utils';
import { motion, AnimatePresence } from 'framer-motion';
import { Search, Grid, List, X, ChevronLeft, ChevronRight, ZoomIn, ZoomOut } from 'lucide-react';

export default function ImagesPage() {
  const [images, setImages] = useState<FileItem[]>([]);
  const [loading, setLoading] = useState(true);
  const [view, setView] = useState<'grid' | 'list'>('grid');
  const [search, setSearch] = useState('');
  const [preview, setPreview] = useState<FileItem | null>(null);

  useEffect(() => { loadImages(); }, []);

  const loadImages = async () => {
    try {
      const { data } = await fileApi.getAll({ category: 'image' });
      setImages(data);
    } catch {} finally {
      setLoading(false);
    }
  };

  const filtered = images.filter(i =>
    i.originalName.toLowerCase().includes(search.toLowerCase())
  );

  if (loading) {
    return (
      <div className="h-full flex items-center justify-center">
        <div className="flex items-center gap-3">
          <div className="w-6 h-6 border-2 border-primary-500 border-t-transparent rounded-full animate-spin" />
          <p className="text-sm text-vault-muted">Loading images...</p>
        </div>
      </div>
    );
  }

  return (
    <div className="h-full flex flex-col p-6">
      {/* Header */}
      <div className="flex items-center justify-between mb-6">
        <div>
          <h1 className="text-2xl font-bold">Image Center</h1>
          <p className="text-sm text-vault-muted">{images.length} images</p>
        </div>
        <div className="flex items-center gap-2">
          <button onClick={() => setView('grid')} className={`p-2 rounded-lg ${view === 'grid' ? 'bg-primary-500/20 text-primary-400' : 'text-vault-muted hover:text-vault-text'}`}>
            <Grid className="w-4 h-4" />
          </button>
          <button onClick={() => setView('list')} className={`p-2 rounded-lg ${view === 'list' ? 'bg-primary-500/20 text-primary-400' : 'text-vault-muted hover:text-vault-text'}`}>
            <List className="w-4 h-4" />
          </button>
        </div>
      </div>

      {/* Search */}
      <div className="flex items-center gap-2 glass rounded-lg px-3 py-2 max-w-md mb-6">
        <Search className="w-4 h-4 text-vault-muted" />
        <input
          value={search}
          onChange={(e) => setSearch(e.target.value)}
          placeholder="Search images..."
          className="flex-1 bg-transparent text-sm text-vault-text placeholder-vault-muted/50 focus:outline-none"
        />
        {search && <X className="w-4 h-4 text-vault-muted cursor-pointer" onClick={() => setSearch('')} />}
      </div>

      {/* Grid */}
      {view === 'grid' ? (
        <div className="flex-1 overflow-y-auto scrollbar-thin">
          <div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 gap-4">
            {filtered.map((img) => (
              <motion.div
                key={img.id}
                layout
                initial={{ opacity: 0 }}
                animate={{ opacity: 1 }}
                onClick={() => setPreview(img)}
                className="aspect-square rounded-xl overflow-hidden cursor-pointer glass-card hover:border-primary-500/30 transition-all group"
              >
                <div className="w-full h-full relative">
                  <img
                    src={`http://localhost:5000/${img.path}`}
                    alt={img.originalName}
                    className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-300"
                  />
                  <div className="absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity flex items-end p-3">
                    <div className="text-white text-xs">
                      <p className="truncate font-medium">{img.originalName}</p>
                      <p className="opacity-70">{formatBytes(img.fileSize)}</p>
                    </div>
                  </div>
                </div>
              </motion.div>
            ))}
          </div>
          {filtered.length === 0 && (
            <div className="text-center py-20 text-vault-muted">No images found</div>
          )}
        </div>
      ) : (
        <div className="flex-1 overflow-y-auto scrollbar-thin">
          <div className="space-y-1">
            {filtered.map((img) => (
              <div
                key={img.id}
                onClick={() => setPreview(img)}
                className="flex items-center gap-4 px-4 py-3 glass-card cursor-pointer hover:border-primary-500/20 transition-all group"
              >
                <div className="w-12 h-12 rounded-lg overflow-hidden flex-shrink-0">
                  <img src={`http://localhost:5000/${img.path}`} alt={img.originalName} className="w-full h-full object-cover" />
                </div>
                <div className="flex-1 min-w-0">
                  <p className="text-sm font-medium truncate">{img.originalName}</p>
                  <p className="text-[10px] text-vault-muted">{formatBytes(img.fileSize)}</p>
                </div>
              </div>
            ))}
          </div>
        </div>
      )}

      {/* Full-screen preview */}
      <AnimatePresence>
        {preview && (
          <motion.div
            initial={{ opacity: 0 }}
            animate={{ opacity: 1 }}
            exit={{ opacity: 0 }}
            className="fixed inset-0 z-50 bg-black/90 backdrop-blur-lg flex items-center justify-center"
            onClick={() => setPreview(null)}
          >
            <button
              onClick={() => setPreview(null)}
              className="absolute top-4 right-4 p-2 rounded-full bg-white/10 hover:bg-white/20 transition-colors"
            >
              <X className="w-6 h-6 text-white" />
            </button>

            <div className="max-w-[90vw] max-h-[90vh]" onClick={(e) => e.stopPropagation()}>
              <img
                src={`http://localhost:5000/${preview.path}`}
                alt={preview.originalName}
                className="max-w-full max-h-[90vh] object-contain rounded-lg"
              />
              <div className="absolute bottom-6 left-1/2 -translate-x-1/2 glass-darker px-4 py-2 rounded-xl">
                <p className="text-sm font-medium text-white">{preview.originalName}</p>
                <p className="text-xs text-white/60">{formatBytes(preview.fileSize)}</p>
              </div>
            </div>
          </motion.div>
        )}
      </AnimatePresence>
    </div>
  );
}
