import AdminLayout from '@/Layouts/AdminLayout';
import { Head, useForm, Link } from '@inertiajs/react';
import { ArrowLeft, Save, Plus, X, Image as ImageIcon, LayoutGrid, File as FileIcon, Upload, FileText, FileArchive } from 'lucide-react';
import { FormEvent, useState, useEffect } from 'react';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/Components/ui/select';
import MediaPicker from '@/Components/MediaPicker';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/Components/ui/tabs';

const FileTypeIcon = ({ mime, className }: { mime: string, className?: string }) => {
    if (mime.startsWith('image/')) return <ImageIcon className={className} />;
    if (mime.includes('pdf')) return <FileText className={className} />;
    if (mime.includes('zip') || mime.includes('compressed')) return <FileArchive className={className} />;
    return <FileIcon className={className} />;
};

interface Product {
    id: number;
    name: string;
    description: string | null;
    price: number;
    currency: string;
    type: string;
    features: string[] | null;
    is_active: boolean;
    image_path: string | null;
    media_id: number | null;
    digital_file_path: string | null;
    download_limit: number;
    expiry_days: number;
    media?: { id: number, url: string, mime_type: string, file_name: string, file_size: number };
    gallery?: Array<{ id: number, url: string, mime_type: string, file_name: string, file_size: number }>;
    modules?: any[];
}

export default function Form({ product }: { product?: Product }) {
    const isEditing = !!product;

    const [pickerOpen, setPickerOpen] = useState(false);
    const [pickerType, setPickerType] = useState<'primary' | 'gallery'>('primary');
    const [activeTab, setActiveTab] = useState('details');

    const { data, setData, post, processing, errors } = useForm({
        _method: isEditing ? 'PUT' : 'POST',
        name: product?.name || '',
        description: product?.description || '',
        price: product?.price || 0,
        currency: product?.currency || 'NGN',
        type: product?.type || 'Resource',
        features: product?.features || [],
        is_active: product?.is_active ?? true,
        media_id: product?.media_id || null,
        gallery: product?.gallery?.map(m => m.id) || [] as number[],
        digital_file_path: product?.digital_file_path || '',
        download_limit: product?.download_limit || 5,
        expiry_days: product?.expiry_days || 7,
    });

    const [selectedMedia, setSelectedMedia] = useState(product?.media || null);
    const [selectedGallery, setSelectedGallery] = useState(product?.gallery || []);

    useEffect(() => {
        if (!isEditing && data.type === 'Course') {
            setData('is_active', false);
        }
    }, [data.type]);

    const addFeature = () => {
        setData('features', [...data.features, '']);
    };

    const removeFeature = (index: number) => {
        const newFeatures = [...data.features];
        newFeatures.splice(index, 1);
        setData('features', newFeatures);
    };

    const updateFeature = (index: number, value: string) => {
        const newFeatures = [...data.features];
        newFeatures[index] = value;
        setData('features', newFeatures);
    };

    const handleSubmit = (e: FormEvent) => {
        e.preventDefault();
        if (isEditing) {
            post(route('admin.products.update', product.id));
        } else {
            post(route('admin.products.store'));
        }
    };

    const isDigital = ['Resource', 'Course'].includes(data.type);

    return (
        <AdminLayout>
            <Head title={isEditing ? `Edit ${data.name}` : 'Create Product'} />

            <div className="max-w-[1100px] mx-auto">
                <div className="mb-10 flex flex-col md:flex-row md:items-center justify-between gap-6">
                    <div className="flex-1">
                        <Link
                            href={route('admin.products.index')}
                            className="inline-flex items-center gap-2 text-xs font-semibold uppercase tracking-wider text-[#8C92AC] hover:text-ink mb-3 transition-colors"
                        >
                            <ArrowLeft className="h-3 w-3" />
                            Back to products
                        </Link>
                        <div className="flex items-center gap-4 flex-wrap">
                            <h1 className="font-display text-[1.75rem] md:text-[2.5rem] font-normal tracking-[-0.02em] text-ink leading-tight">
                                {isEditing ? 'Edit Product' : 'New Product'}
                            </h1>
                            <button
                                type="button"
                                onClick={() => setData('is_active', !data.is_active)}
                                className={`h-7 px-3 rounded-full text-[10px] font-bold uppercase tracking-wider transition-all border flex items-center justify-center mt-1.5 ${
                                    data.is_active 
                                        ? 'bg-emerald-50 border-emerald-100 text-emerald-700' 
                                        : 'bg-amber-50 border-amber-100 text-amber-700'
                                }`}
                            >
                                {data.is_active ? '● Active' : '○ Draft'}
                            </button>
                        </div>
                    </div>
                    <div className="flex items-center gap-3">
                        <button
                            onClick={handleSubmit}
                            disabled={processing}
                            className="w-full md:w-auto h-11 px-8 md:h-9 md:px-6 inline-flex items-center justify-center gap-2 rounded-xl md:rounded-lg bg-ink text-white text-[12px] font-bold hover:bg-primary transition-all disabled:opacity-50"
                        >
                            <Save className="h-4 w-4" />
                            <span className="truncate">
                                {data.type === 'Course' ? 'Save & Course Builder' : (isEditing ? 'Save Changes' : 'Publish Product')}
                            </span>
                        </button>
                    </div>
                </div>

                <div className="space-y-8">
                        <form onSubmit={handleSubmit} className="grid gap-8 lg:grid-cols-12">
                    {/* Main Content */}
                    <div className="lg:col-span-8 space-y-8">
                        {/* Digital Delivery */}
                        {data.type === 'Resource' && (
                            <div className="bg-primary/5 rounded-[2rem] border border-primary/20 p-8 space-y-8">
                                <div className="flex items-center justify-between">
                                    <div className="flex items-center gap-3">
                                        <div className="h-10 w-10 rounded-2xl bg-primary/10 flex items-center justify-center">
                                            <FileIcon className="h-5 w-5 text-primary" />
                                        </div>
                                        <div>
                                            <h2 className="text-[15px] font-bold text-ink">Digital Assets & Fulfillment</h2>
                                            <p className="text-[11px] text-[#8C92AC] font-medium uppercase tracking-wider">Configure what the customer receives</p>
                                        </div>
                                    </div>
                                    <button
                                        type="button"
                                        onClick={() => { setPickerType('gallery'); setPickerOpen(true); }}
                                        className="h-10 px-5 inline-flex items-center gap-2 rounded-xl bg-primary text-white text-[12px] font-bold hover:brightness-110 transition-all shadow-md shadow-primary/10"
                                    >
                                        <Plus className="h-4 w-4" /> Attach Files
                                    </button>
                                </div>
                                
                                <div className="grid gap-3">
                                    {selectedGallery.map((item) => (
                                        <div key={item.id} className="flex items-center justify-between p-4 bg-white border border-[#E8E6DF] rounded-2xl group hover:border-primary/50 transition-all shadow-sm">
                                            <div className="flex items-center gap-4 min-w-0">
                                                <div className="h-12 w-12 flex items-center justify-center bg-[#F5F3EF] rounded-xl border border-[#E8E6DF] flex-shrink-0">
                                                    {item.mime_type.startsWith('image/') ? (
                                                        <img src={item.url} className="w-full h-full object-cover rounded-xl" />
                                                    ) : (
                                                        <FileTypeIcon mime={item.mime_type} className="h-6 w-6 text-[#8C92AC]" />
                                                    )}
                                                </div>
                                                <div className="min-w-0">
                                                    <p className="text-[14px] font-bold text-ink truncate">{item.file_name}</p>
                                                    <div className="flex items-center gap-2 mt-0.5">
                                                        <span className="text-[10px] bg-[#F5F3EF] px-1.5 py-0.5 rounded text-[#8C92AC] font-bold uppercase tracking-tighter">
                                                            {item.mime_type.split('/')[1]}
                                                        </span>
                                                        <span className="text-[10px] text-[#C0BDBA] font-bold">•</span>
                                                        <span className="text-[10px] text-[#8C92AC] font-bold uppercase tracking-tighter">
                                                            {Math.round(item.file_size / 1024)} KB
                                                        </span>
                                                    </div>
                                                </div>
                                            </div>
                                            <button 
                                                type="button"
                                                onClick={() => {
                                                    const newGallery = selectedGallery.filter(m => m.id !== item.id);
                                                    setSelectedGallery(newGallery);
                                                    setData('gallery', newGallery.map(m => m.id));
                                                }}
                                                className="p-2.5 text-[#C0BDBA] hover:text-red-500 hover:bg-red-50 rounded-xl transition-all"
                                            >
                                                <X className="h-4 w-4" />
                                            </button>
                                        </div>
                                    ))}
                                    
                                    {selectedGallery.length === 0 && (
                                        <div 
                                            onClick={() => { setPickerType('gallery'); setPickerOpen(true); }}
                                            className="py-12 cursor-pointer text-center border-2 border-dashed border-primary/20 rounded-[2rem] bg-white hover:bg-primary/5 hover:border-primary/40 transition-all group"
                                        >
                                            <div className="h-12 w-12 rounded-2xl bg-primary/5 flex items-center justify-center mx-auto mb-4 group-hover:scale-110 transition-transform">
                                                <Upload className="h-6 w-6 text-primary" />
                                            </div>
                                            <p className="text-[13px] font-bold text-ink">No deliverables attached yet</p>
                                            <p className="text-[11px] text-[#8C92AC] mt-1">Click to upload or select the files you are selling</p>
                                        </div>
                                    )}
                                </div>

                                <div className="grid sm:grid-cols-2 gap-6 pt-4 border-t border-primary/10">
                                    <div className="sm:col-span-2">
                                        <label className="block text-[11px] font-bold uppercase tracking-wider text-[#8C92AC] mb-3">Legacy Path (Optional)</label>
                                        <input
                                            type="text"
                                            value={data.digital_file_path || ''}
                                            onChange={(e) => setData('digital_file_path', e.target.value)}
                                            className="w-full rounded-xl border border-[#E8E6DF] bg-white px-5 py-3 text-[13px] text-ink outline-none focus:border-primary/50"
                                            placeholder="e.g. protected/products/playbook.pdf"
                                        />
                                    </div>
                                    
                                    <div>
                                        <label className="block text-[11px] font-bold uppercase tracking-wider text-[#8C92AC] mb-3">Download Limit</label>
                                        <input
                                            type="number"
                                            value={data.download_limit}
                                            onChange={(e) => setData('download_limit', parseInt(e.target.value))}
                                            className="w-full rounded-xl border border-[#E8E6DF] bg-white px-5 py-3 text-[13px] text-ink outline-none focus:border-primary/50"
                                        />
                                    </div>
                                    
                                    <div>
                                        <label className="block text-[11px] font-bold uppercase tracking-wider text-[#8C92AC] mb-3">Expiry Days</label>
                                        <input
                                            type="number"
                                            value={data.expiry_days}
                                            onChange={(e) => setData('expiry_days', parseInt(e.target.value))}
                                            className="w-full rounded-xl border border-[#E8E6DF] bg-white px-5 py-3 text-[13px] text-ink outline-none focus:border-primary/50"
                                        />
                                    </div>
                                </div>
                            </div>
                        )}

                        {/* Basic Info */}
                        <div className="bg-white rounded-[2rem] border border-[#E8E6DF] p-8 space-y-6">
                            <div>
                                <label className="block text-[11px] font-bold uppercase tracking-wider text-[#8C92AC] mb-3">Product Name</label>
                                <input
                                    type="text"
                                    value={data.name}
                                    onChange={(e) => setData('name', e.target.value)}
                                    className="w-full rounded-xl border border-[#E8E6DF] bg-white px-5 py-3.5 text-[15px] text-ink outline-none focus:border-primary/50 transition-all placeholder:text-[#C0BDBA]"
                                    placeholder="e.g. Digital Strategy Playbook"
                                />
                                {errors.name && <p className="text-red-500 text-[11px] mt-2 font-medium">{errors.name}</p>}
                            </div>

                            <div>
                                <label className="block text-[11px] font-bold uppercase tracking-wider text-[#8C92AC] mb-3">Description</label>
                                <textarea
                                    value={data.description || ''}
                                    onChange={(e) => setData('description', e.target.value)}
                                    rows={8}
                                    className="w-full rounded-xl border border-[#E8E6DF] bg-white px-5 py-4 text-[14px] leading-relaxed text-ink outline-none focus:border-primary/50 transition-all placeholder:text-[#C0BDBA] resize-none"
                                    placeholder="Provide a detailed overview of the product..."
                                />
                                {errors.description && <p className="text-red-500 text-[11px] mt-2 font-medium">{errors.description}</p>}
                            </div>
                        </div>

                        {/* Features */}
                        <div className="bg-white rounded-[2rem] border border-[#E8E6DF] p-8 space-y-8">
                            <div>
                                <div className="flex items-center justify-between mb-6">
                                    <label className="text-[11px] font-bold uppercase tracking-wider text-[#8C92AC]">Key Features</label>
                                    <button
                                        type="button"
                                        onClick={addFeature}
                                        className="inline-flex items-center gap-1.5 text-[11px] font-bold text-primary hover:opacity-70 transition-opacity"
                                    >
                                        <Plus className="h-3.5 w-3.5" /> Add feature
                                    </button>
                                </div>
                                <div className="space-y-3">
                                    {data.features.map((feature, index) => (
                                        <div key={index} className="flex gap-2 group">
                                            <input
                                                type="text"
                                                value={feature}
                                                onChange={(e) => updateFeature(index, e.target.value)}
                                                className="flex-1 rounded-xl border border-[#E8E6DF] bg-[#FAFAF8] px-4 py-2.5 text-[13px] text-ink outline-none focus:border-primary/50 transition-all"
                                                placeholder="e.g. 50+ editable templates"
                                            />
                                            <button
                                                type="button"
                                                onClick={() => removeFeature(index)}
                                                className="p-2 text-[#C0BDBA] hover:text-red-500 transition-colors"
                                            >
                                                <X className="h-4 w-4" />
                                            </button>
                                        </div>
                                    ))}
                                    {data.features.length === 0 && (
                                        <div className="py-10 text-center border-2 border-dashed border-[#F0EDE8] rounded-2xl">
                                            <p className="text-[12px] text-[#8C92AC]">No features listed yet.</p>
                                        </div>
                                    )}
                                </div>
                            </div>
                        </div>

                        <div className="pt-4">
                            <button
                                onClick={handleSubmit}
                                disabled={processing}
                                className="w-full h-14 inline-flex items-center justify-center gap-3 rounded-[1.5rem] bg-ink text-white text-[15px] font-bold hover:bg-primary transition-all shadow-xl shadow-ink/10 disabled:opacity-50"
                            >
                                <Save className="h-5 w-5" />
                                {data.type === 'Course' ? 'Save & Launch Course Builder' : (isEditing ? 'Save Changes' : 'Publish Product')}
                            </button>
                        </div>
                    </div>

                    {/* Sidebar */}
                    <div className="lg:col-span-4 space-y-8">
                        {/* Status & Pricing */}
                        <div className="bg-white rounded-[2rem] border border-[#E8E6DF] p-8 space-y-8">
                            <div>
                                <label className="block text-[11px] font-bold uppercase tracking-wider text-[#8C92AC] mb-4">Pricing</label>
                                <div className="flex items-center gap-2">
                                    <div className="w-[90px] flex-shrink-0">
                                        <Select 
                                            value={data.currency} 
                                            onValueChange={(val) => setData('currency', val)}
                                        >
                                            <SelectTrigger className="w-full h-11 rounded-xl border-[#E8E6DF] bg-white px-3 text-[12px] font-bold text-ink focus:ring-0 focus:border-primary/50">
                                                <SelectValue />
                                            </SelectTrigger>
                                            <SelectContent className="bg-white border-[#E8E6DF] rounded-xl shadow-xl">
                                                <SelectItem value="NGN">₦ NGN</SelectItem>
                                                <SelectItem value="GBP">£ GBP</SelectItem>
                                                <SelectItem value="USD">$ USD</SelectItem>
                                            </SelectContent>
                                        </Select>
                                    </div>
                                    <div className="flex-1 min-w-0">
                                        <input
                                            type="number"
                                            value={data.price}
                                            onChange={(e) => setData('price', parseFloat(e.target.value))}
                                            className="w-full h-11 rounded-xl border border-[#E8E6DF] bg-white px-4 text-[14px] font-bold text-ink outline-none focus:border-primary/50"
                                            step="0.01"
                                        />
                                    </div>
                                </div>
                                {errors.price && <p className="text-red-500 text-[11px] mt-2 font-medium">{errors.price}</p>}
                            </div>

                            <div>
                                <label className="block text-[11px] font-bold uppercase tracking-wider text-[#8C92AC] mb-4">Category</label>
                                <Select 
                                    value={data.type} 
                                    onValueChange={(val) => setData('type', val)}
                                >
                                    <SelectTrigger className="w-full h-12 rounded-xl border-[#E8E6DF] bg-white px-5 text-[13px] font-bold text-ink focus:ring-0 focus:border-primary/50">
                                        <SelectValue />
                                    </SelectTrigger>
                                    <SelectContent className="bg-white border-[#E8E6DF] rounded-xl shadow-xl">
                                        <SelectItem value="Resource">Digital Resource</SelectItem>
                                        <SelectItem value="Course">Online Course</SelectItem>
                                    </SelectContent>
                                </Select>
                            </div>

                            <div>
                                <label className="block text-[11px] font-bold uppercase tracking-wider text-[#8C92AC] mb-4">Primary Image</label>
                                <div 
                                    onClick={() => { setPickerType('primary'); setPickerOpen(true); }}
                                    className="relative cursor-pointer group aspect-[4/3] rounded-2xl border-2 border-dashed border-[#E8E6DF] flex flex-col items-center justify-center p-2 transition-all hover:border-primary/50 hover:bg-primary/5 overflow-hidden"
                                >
                                    {selectedMedia ? (
                                        <img src={selectedMedia.url} alt="Selected" className="w-full h-full object-cover rounded-xl" />
                                    ) : (
                                        <div className="text-center">
                                            <ImageIcon className="h-8 w-8 text-[#C0BDBA] mx-auto mb-2" strokeWidth={1.5} />
                                            <p className="text-[11px] font-bold text-[#8C92AC]">SELECT IMAGE</p>
                                        </div>
                                    )}
                                    <div className="absolute inset-0 bg-ink/40 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center backdrop-blur-[2px]">
                                        <span className="bg-white text-ink px-4 py-2 rounded-lg text-[10px] font-bold uppercase tracking-wider shadow-xl">Change Cover</span>
                                    </div>
                                </div>
                                {errors.media_id && <p className="text-red-500 text-[11px] mt-2 font-medium">{errors.media_id}</p>}
                            </div>
                        </div>


                    </div>
                </form>
            </div>

                <MediaPicker 
                    open={pickerOpen}
                    onClose={() => setPickerOpen(false)}
                    type={pickerType === 'primary' ? 'image' : 'all'}
                    onSelect={(media) => {
                        if (pickerType === 'primary') {
                            setSelectedMedia(media);
                            setData('media_id', media.id);
                        } else {
                            if (!selectedGallery.find(m => m.id === media.id)) {
                                const newGallery = [...selectedGallery, media];
                                setSelectedGallery(newGallery);
                                setData('gallery', newGallery.map(m => m.id));
                            }
                        }
                    }}
                    title={pickerType === 'primary' ? "Select Product Image" : "Attach Deliverable Files"}
                />
            </div>
        </AdminLayout>
    );
}
