import AdminLayout from '@/Layouts/AdminLayout';
import { Head, useForm, router } from '@inertiajs/react';
import { Upload, Trash2, Search, Filter, Image as ImageIcon, FileText, MoreVertical, CheckCircle2, X } from 'lucide-react';
import { useState, useRef } from 'react';
import { toast } from 'sonner';

interface MediaItem {
    id: number;
    file_name: string;
    path: string;
    mime_type: string;
    file_size: number;
    url: string;
    title: string;
    created_at: string;
}

interface Props {
    media: {
        data: MediaItem[];
        links: any;
    };
}

export default function Index({ media }: Props) {
    const [isUploading, setIsUploading] = useState(false);
    const [uploadProgress, setUploadProgress] = useState(0);
    const fileInputRef = useRef<HTMLInputElement>(null);
    const [selectedItems, setSelectedItems] = useState<number[]>([]);
    const [previewItem, setPreviewItem] = useState<MediaItem | null>(null);

    const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
        const files = Array.from(e.target.files || []);
        if (files.length === 0) return;

        setIsUploading(true);
        setUploadProgress(0);

        const formData = new FormData();
        files.forEach(file => formData.append('files[]', file));

        router.post(route('admin.media.store'), formData, {
            forceFormData: true,
            onProgress: (progress) => {
                if (progress?.percentage) setUploadProgress(progress.percentage);
            },
            onSuccess: () => {
                toast.success('Upload complete');
                setIsUploading(false);
                if (fileInputRef.current) fileInputRef.current.value = '';
            },
            onError: () => {
                toast.error('Upload failed');
                setIsUploading(false);
            },
        });
    };

    const deleteMedia = (id: number) => {
        if (!confirm('Are you sure you want to delete this file? This cannot be undone.')) return;
        
        router.delete(route('admin.media.destroy', id), {
            onSuccess: () => {
                toast.success('File deleted');
                if (previewItem?.id === id) setPreviewItem(null);
            },
        });
    };

    const toggleSelect = (item: MediaItem) => {
        setPreviewItem(item);
        setSelectedItems(prev => 
            prev.includes(item.id) ? prev.filter(i => i !== item.id) : [...prev, item.id]
        );
    };

    const formatSize = (bytes: number) => {
        if (bytes === 0) return '0 Bytes';
        const k = 1024;
        const sizes = ['Bytes', 'KB', 'MB', 'GB'];
        const i = Math.floor(Math.log(bytes) / Math.log(k));
        return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
    };

    const copyToClipboard = (text: string) => {
        navigator.clipboard.writeText(text);
        toast.success('URL copied to clipboard');
    };

    return (
        <AdminLayout>
            <Head title="Media Library" />

            <div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4 mb-8">
                <div>
                    <h1 className="font-display text-[1.625rem] font-normal tracking-[-0.02em] text-ink leading-none">
                        Media Library
                    </h1>
                    <p className="mt-2.5 text-[0.9375rem] text-[#8C92AC]">
                        Manage all your assets and files centrally.
                    </p>
                </div>
                
                <div className="flex items-center gap-3">
                    <input 
                        type="file" 
                        multiple 
                        className="hidden" 
                        ref={fileInputRef} 
                        onChange={handleFileUpload}
                        accept="image/*"
                    />
                    <button 
                        onClick={() => fileInputRef.current?.click()}
                        disabled={isUploading}
                        className="inline-flex items-center gap-2 px-6 py-2.5 bg-ink text-white rounded-xl text-[14px] font-semibold hover:bg-accent transition-all shadow-lg shadow-ink/10"
                    >
                        <Upload className="h-4 w-4" />
                        {isUploading ? `Uploading ${uploadProgress}%` : 'Upload Assets'}
                    </button>
                </div>
            </div>

            <div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 gap-4">
                {media.data.length === 0 ? (
                    <div className="col-span-full py-20 text-center bg-white rounded-3xl border-2 border-dashed border-[#E8E6DF]">
                        <ImageIcon className="h-12 w-12 text-[#C0BDBA] mx-auto mb-4" />
                        <h3 className="text-[15px] font-semibold text-ink">No media found</h3>
                        <p className="text-[13px] text-[#8C92AC] mt-1">Upload some files to get started.</p>
                    </div>
                ) : (
                    media.data.map((item) => (
                        <div 
                            key={item.id}
                            className={`group relative aspect-square bg-white rounded-2xl border transition-all overflow-hidden cursor-pointer ${
                                previewItem?.id === item.id 
                                    ? 'border-accent ring-2 ring-accent ring-offset-1' 
                                    : 'border-[#E8E6DF] hover:shadow-lg'
                            }`}
                            onClick={() => setPreviewItem(item)}
                        >
                            <div className="absolute inset-0 flex items-center justify-center p-2">
                                {item.mime_type.startsWith('image/') ? (
                                    <img src={item.url} alt={item.title} className="w-full h-full object-cover rounded-lg transition-transform duration-500 group-hover:scale-110" />
                                ) : (
                                    <FileText className="h-10 w-10 text-[#C0BDBA]" />
                                )}
                            </div>
                            <div className="absolute inset-0 bg-ink/0 group-hover:bg-ink/10 transition-colors" />
                            {selectedItems.includes(item.id) && (
                                <div className="absolute top-2 right-2 z-10">
                                    <CheckCircle2 className="h-5 w-5 text-white fill-accent" />
                                </div>
                            )}
                        </div>
                    ))
                )}
            </div>

            {/* Preview Modal */}
            {previewItem && (
                <div className="fixed inset-0 z-[110] flex items-center justify-center p-4 sm:p-6 lg:p-10">
                    <div className="absolute inset-0 bg-ink/60 backdrop-blur-md" onClick={() => setPreviewItem(null)} />
                    
                    <div className="relative w-full max-w-5xl bg-white rounded-[2rem] shadow-2xl overflow-hidden flex flex-col lg:flex-row max-h-[90vh] animate-in zoom-in-95 duration-300">
                        {/* Close button */}
                        <button 
                            onClick={() => setPreviewItem(null)}
                            className="absolute top-5 right-5 z-20 p-2 bg-white/10 backdrop-blur-md text-white lg:text-ink lg:bg-transparent rounded-full hover:scale-110 transition-transform"
                        >
                            <X className="h-6 w-6" />
                        </button>

                        {/* Media Section */}
                        <div className="flex-1 bg-ink/5 flex items-center justify-center overflow-hidden p-6 lg:p-10">
                            {previewItem.mime_type.startsWith('image/') ? (
                                <img src={previewItem.url} alt={previewItem.file_name} className="max-w-full max-h-full object-contain rounded-xl shadow-2xl" />
                            ) : (
                                <div className="text-center">
                                    <FileText className="h-32 w-32 text-[#C0BDBA] mx-auto mb-4" />
                                    <p className="text-ink font-medium">{previewItem.file_name}</p>
                                </div>
                            )}
                        </div>

                        {/* Details Section */}
                        <div className="w-full lg:w-96 bg-white flex flex-col border-l border-[#E8E6DF]">
                            <div className="p-8 flex-1 overflow-y-auto custom-scrollbar">
                                <h3 className="font-display text-2xl font-normal text-ink mb-8">File Information</h3>
                                
                                <div className="space-y-6">
                                    <div className="p-4 bg-[#FAFAF8] rounded-2xl border border-[#F0EDE8]">
                                        <label className="text-[10px] font-bold text-[#C0BDBA] uppercase tracking-widest block mb-2">Direct Link</label>
                                        <div className="flex items-center gap-2">
                                            <input 
                                                readOnly 
                                                value={previewItem.url} 
                                                className="flex-1 bg-transparent border-none text-[11px] text-[#8C92AC] outline-none truncate"
                                            />
                                            <button 
                                                onClick={() => copyToClipboard(previewItem.url)}
                                                className="text-accent hover:text-ink transition-colors font-bold text-[11px]"
                                            >
                                                COPY
                                            </button>
                                        </div>
                                    </div>

                                    <div className="grid grid-cols-1 gap-6">
                                        <div>
                                            <label className="text-[10px] font-bold text-[#C0BDBA] uppercase tracking-widest block mb-1">File Name</label>
                                            <p className="text-[14px] text-ink font-medium break-all">{previewItem.file_name}</p>
                                        </div>
                                        <div className="grid grid-cols-2 gap-4">
                                            <div>
                                                <label className="text-[10px] font-bold text-[#C0BDBA] uppercase tracking-widest block mb-1">File Size</label>
                                                <p className="text-[14px] text-ink font-medium">{formatSize(previewItem.file_size)}</p>
                                            </div>
                                            <div>
                                                <label className="text-[10px] font-bold text-[#C0BDBA] uppercase tracking-widest block mb-1">File Type</label>
                                                <p className="text-[14px] text-ink font-medium uppercase">{previewItem.mime_type.split('/')[1]}</p>
                                            </div>
                                        </div>
                                        <div>
                                            <label className="text-[10px] font-bold text-[#C0BDBA] uppercase tracking-widest block mb-1">Upload Date</label>
                                            <p className="text-[14px] text-ink font-medium">
                                                {new Date(previewItem.created_at).toLocaleDateString('en-GB', { day: 'numeric', month: 'long', year: 'numeric' })}
                                            </p>
                                        </div>
                                    </div>
                                </div>
                            </div>

                            <div className="p-8 border-t border-[#E8E6DF] bg-[#FAFAF8] flex items-center gap-4">
                                <button 
                                    onClick={() => deleteMedia(previewItem.id)}
                                    className="flex-1 inline-flex items-center justify-center gap-2 px-6 py-3 text-red-600 rounded-2xl text-[14px] font-semibold hover:bg-red-50 transition-all border border-red-100"
                                >
                                    <Trash2 className="h-4 w-4" />
                                    Delete
                                </button>
                                <button 
                                    onClick={() => setPreviewItem(null)}
                                    className="flex-1 px-6 py-3 bg-ink text-white rounded-2xl text-[14px] font-semibold hover:bg-accent transition-all shadow-lg shadow-ink/10"
                                >
                                    Done
                                </button>
                            </div>
                        </div>
                    </div>
                </div>
            )}
        </AdminLayout>
    );
}
