"use client";

import { useState, useCallback, useRef, useEffect } from "react";
import {
    Edit3, Eye, Save, RotateCcw, Clock, Search, Replace,
    Loader2, Check, AlertCircle, ChevronUp, ChevronDown,
    X, Minus, Plus, FileText, Trash2
} from "lucide-react";
import { clsx } from "clsx";

const API = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001";

interface SRTCue {
    index: number;
    startTime: string;
    endTime: string;
    text: string;
    originalText?: string;
}

interface InlineSubtitleEditorProps {
    filePath?: string;         // path to .srt file OR video file
    streamIndex?: number;      // subtitle stream index if video file
    cues?: SRTCue[];           // pre-loaded cues (from parent)
    onSave?: (cues: SRTCue[]) => void;
    onClose?: () => void;
    title?: string;
}

export default function InlineSubtitleEditor({
    filePath, streamIndex = 0, cues: externalCues, onSave, onClose, title
}: InlineSubtitleEditorProps) {
    const [cues, setCues] = useState<SRTCue[]>(externalCues || []);
    const [originalCues, setOriginalCues] = useState<SRTCue[]>(externalCues || []);
    const [selectedIndex, setSelectedIndex] = useState<number | null>(0);
    const [mode, setMode] = useState<"edit" | "preview">("edit");
    const [loading, setLoading] = useState(false);
    const [saving, setSaving] = useState(false);
    const [error, setError] = useState<string | null>(null);
    const [success, setSuccess] = useState<string | null>(null);

    // Find & Replace
    const [findText, setFindText] = useState("");
    const [replaceText, setReplaceText] = useState("");
    const [showFindReplace, setShowFindReplace] = useState(false);

    // Timing
    const [shiftMs, setShiftMs] = useState(0);

    const listRef = useRef<HTMLDivElement>(null);
    const editRef = useRef<HTMLTextAreaElement>(null);

    const authHeaders = useCallback(() => {
        const token = typeof window !== "undefined" ? localStorage.getItem("mhb_token") : "";
        return { "Content-Type": "application/json", Authorization: `Bearer ${token}` };
    }, []);

    // Load from file if no external cues
    useEffect(() => {
        if (externalCues && externalCues.length > 0) {
            setCues(externalCues);
            setOriginalCues(JSON.parse(JSON.stringify(externalCues)));
            return;
        }
        if (!filePath) return;
        loadSubtitle();
    }, [filePath, externalCues]);

    async function loadSubtitle() {
        setLoading(true);
        setError(null);
        try {
            const ext = filePath?.split('.').pop()?.toLowerCase();
            const isVideo = ['mkv', 'mp4', 'avi', 'mov', 'webm'].includes(ext || '');

            const endpoint = isVideo ? '/api/subtitle-editor/preview-extract' : '/api/subtitle-editor/parse';
            const body = isVideo
                ? { filePath, streamIndex }
                : { filePath };

            const res = await fetch(`${API}${endpoint}`, {
                method: 'POST',
                headers: authHeaders(),
                body: JSON.stringify(body),
            });
            const data = await res.json();
            if (!data.success) throw new Error(data.error);
            setCues(data.cues || []);
            setOriginalCues(JSON.parse(JSON.stringify(data.cues || [])));
            setSelectedIndex(0);
        } catch (err: any) {
            setError(err.message);
        } finally {
            setLoading(false);
        }
    }

    async function handleSave() {
        if (!filePath || !cues.length) {
            onSave?.(cues);
            return;
        }
        setSaving(true);
        try {
            const res = await fetch(`${API}/api/subtitle-editor/save`, {
                method: 'POST',
                headers: authHeaders(),
                body: JSON.stringify({ filePath, cues, createBackup: true }),
            });
            const data = await res.json();
            if (!data.success) throw new Error(data.error);
            setSuccess(`Saved ${cues.length} cues. Backup: .bak`);
            setOriginalCues(JSON.parse(JSON.stringify(cues)));
            onSave?.(cues);
            setTimeout(() => setSuccess(null), 3000);
        } catch (err: any) {
            setError(err.message);
        } finally {
            setSaving(false);
        }
    }

    async function handleShiftTiming() {
        if (shiftMs === 0) return;
        try {
            const res = await fetch(`${API}/api/subtitle-editor/adjust-timing`, {
                method: 'POST',
                headers: authHeaders(),
                body: JSON.stringify({ cues, shiftMs }),
            });
            const data = await res.json();
            if (!data.success) throw new Error(data.error);
            setCues(data.cues);
            setSuccess(`Shifted all timings by ${shiftMs > 0 ? '+' : ''}${shiftMs}ms`);
            setTimeout(() => setSuccess(null), 2000);
        } catch (err: any) {
            setError(err.message);
        }
    }

    async function handleFindReplace() {
        if (!findText) return;
        try {
            const res = await fetch(`${API}/api/subtitle-editor/replace-text`, {
                method: 'POST',
                headers: authHeaders(),
                body: JSON.stringify({ cues, find: findText, replace: replaceText }),
            });
            const data = await res.json();
            if (!data.success) throw new Error(data.error);
            setCues(data.cues);
            setSuccess(`Replaced ${data.replacements} occurrence(s)`);
            setTimeout(() => setSuccess(null), 2000);
        } catch (err: any) {
            setError(err.message);
        }
    }

    async function handleAutoClean() {
        const BRANDING_REGEX = /((https?:\/\/|www\.)[\w\d.\-/]+)|([\w\d.-]+\.(com|net|org|online|one|me|io|my|bd|link|click|site|top|info))|(\b(Visit|Download|Watching|Subtitles|Encoded|Telegram|Join|Support)[\s\w]*[:\-])/gi;
        
        let count = 0;
        const cleaned = cues.map(cue => {
            const newText = cue.text.replace(BRANDING_REGEX, "").replace(/\n\n+/g, "\n").trim();
            if (newText !== cue.text) count++;
            return { ...cue, text: newText };
        }).filter(cue => cue.text.length > 0); // Remove empty cues
        
        setCues(cleaned);
        setSuccess(`Cleaned ${count} cues. ${cues.length - cleaned.length} empty cues removed.`);
        setTimeout(() => setSuccess(null), 3000);
    }

    function handleReset() {
        setCues(JSON.parse(JSON.stringify(originalCues)));
        setSuccess("Reverted to original");
        setTimeout(() => setSuccess(null), 2000);
    }

    function updateCueText(idx: number, newText: string) {
        setCues(prev => prev.map((c, i) => i === idx ? { ...c, text: newText } : c));
    }

    function deleteCue(idx: number) {
        setCues(prev => prev.filter((_, i) => i !== idx).map((c, i) => ({ ...c, index: i + 1 })));
        if (selectedIndex !== null && selectedIndex >= idx) {
            setSelectedIndex(Math.max(0, idx - 1));
        }
    }

    const selectedCue = selectedIndex !== null ? cues[selectedIndex] : null;
    const hasChanges = JSON.stringify(cues) !== JSON.stringify(originalCues);

    if (loading) {
        return (
            <div className="flex items-center justify-center h-64 gap-3 text-white/40">
                <Loader2 className="w-5 h-5 animate-spin text-accent-cyan" />
                <span>Loading subtitle...</span>
            </div>
        );
    }

    return (
        <div className="flex flex-col h-full bg-[#0a0c10] border border-white/10 rounded-2xl overflow-hidden">
            {/* ── Header ─────────────────────────────────────────────── */}
            <div className="flex items-center justify-between px-5 py-3 border-b border-white/5 bg-white/[0.02]">
                <div className="flex items-center gap-3">
                    <FileText className="w-4 h-4 text-accent-cyan" />
                    <span className="text-sm font-black text-white">{title || "Subtitle Editor"}</span>
                    <span className="text-xs text-white/30 font-mono">{cues.length} cues</span>
                    {hasChanges && <span className="text-[10px] font-black px-2 py-0.5 bg-amber-500/20 text-amber-400 rounded-full">UNSAVED</span>}
                </div>
                <div className="flex items-center gap-2">
                    {/* Mode Toggle */}
                    <div className="flex bg-white/5 rounded-xl p-0.5">
                        <button onClick={() => setMode("edit")} className={clsx("flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-bold transition-all", mode === "edit" ? "bg-white/10 text-white" : "text-white/30 hover:text-white/60")}>
                            <Edit3 className="w-3 h-3" /> Edit
                        </button>
                        <button onClick={() => setMode("preview")} className={clsx("flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-bold transition-all", mode === "preview" ? "bg-white/10 text-white" : "text-white/30 hover:text-white/60")}>
                            <Eye className="w-3 h-3" /> Preview
                        </button>
                    </div>
                    <button onClick={handleReset} disabled={!hasChanges} className="p-2 rounded-xl bg-white/5 text-white/30 hover:text-white disabled:opacity-30 transition-all" title="Revert all changes">
                        <RotateCcw className="w-3.5 h-3.5" />
                    </button>
                    <button onClick={handleSave} disabled={saving || !hasChanges} className="flex items-center gap-1.5 px-4 py-2 rounded-xl bg-accent-cyan/10 border border-accent-cyan/20 text-accent-cyan text-xs font-black hover:bg-accent-cyan/20 disabled:opacity-40 transition-all">
                        {saving ? <Loader2 className="w-3.5 h-3.5 animate-spin" /> : <Save className="w-3.5 h-3.5" />}
                        Save
                    </button>
                    {onClose && <button onClick={onClose} className="p-2 rounded-xl bg-white/5 text-white/30 hover:text-red-400 transition-all"><X className="w-3.5 h-3.5" /></button>}
                </div>
            </div>

            {/* ── Toolbar ─────────────────────────────────────────────── */}
            {mode === "edit" && (
                <div className="flex items-center gap-3 px-5 py-2.5 border-b border-white/5 bg-white/[0.01] flex-wrap">
                    {/* Timing Shift */}
                    <div className="flex items-center gap-2 bg-white/5 rounded-xl px-3 py-1.5">
                        <Clock className="w-3.5 h-3.5 text-white/40" />
                        <button onClick={() => setShiftMs(s => s - 100)} className="w-5 h-5 flex items-center justify-center rounded bg-white/5 hover:bg-white/10 text-white/60 transition-all"><Minus className="w-3 h-3" /></button>
                        <input
                            type="number"
                            value={shiftMs}
                            onChange={e => setShiftMs(parseInt(e.target.value) || 0)}
                            className="w-16 bg-transparent text-center text-xs font-mono text-white outline-none"
                        />
                        <button onClick={() => setShiftMs(s => s + 100)} className="w-5 h-5 flex items-center justify-center rounded bg-white/5 hover:bg-white/10 text-white/60 transition-all"><Plus className="w-3 h-3" /></button>
                        <span className="text-[10px] text-white/30">ms</span>
                        <button onClick={handleShiftTiming} disabled={shiftMs === 0} className="px-2 py-0.5 rounded bg-blue-500/20 text-blue-400 text-[10px] font-black hover:bg-blue-500/30 disabled:opacity-30 transition-all">Apply</button>
                    </div>

                    <button onClick={handleAutoClean} className="flex items-center gap-1.5 px-3 py-1.5 rounded-xl bg-emerald-500/10 text-emerald-400 text-xs font-bold hover:bg-emerald-500/20 transition-all shadow-sm shadow-emerald-500/10">
                        <Trash2 className="w-3 h-3" /> Auto Clean Branding
                    </button>

                    {/* Find & Replace toggle */}
                    <button onClick={() => setShowFindReplace(s => !s)} className={clsx("flex items-center gap-1.5 px-3 py-1.5 rounded-xl text-xs font-bold transition-all", showFindReplace ? "bg-violet-500/20 text-violet-400" : "bg-white/5 text-white/40 hover:text-white")}>
                        <Search className="w-3 h-3" /> Find & Replace
                    </button>
                </div>
            )}

            {/* Find & Replace bar */}
            {showFindReplace && mode === "edit" && (
                <div className="flex items-center gap-3 px-5 py-2.5 border-b border-white/5 bg-violet-500/5">
                    <input
                        type="text"
                        placeholder="Find..."
                        value={findText}
                        onChange={e => setFindText(e.target.value)}
                        className="flex-1 bg-white/5 border border-white/10 rounded-lg px-3 py-1.5 text-xs text-white outline-none focus:border-violet-500/50"
                    />
                    <input
                        type="text"
                        placeholder="Replace with..."
                        value={replaceText}
                        onChange={e => setReplaceText(e.target.value)}
                        className="flex-1 bg-white/5 border border-white/10 rounded-lg px-3 py-1.5 text-xs text-white outline-none focus:border-violet-500/50"
                    />
                    <button onClick={handleFindReplace} disabled={!findText} className="px-4 py-1.5 rounded-lg bg-violet-500/20 text-violet-400 text-xs font-black hover:bg-violet-500/30 disabled:opacity-40 transition-all flex items-center gap-1.5">
                        <Replace className="w-3 h-3" /> Replace All
                    </button>
                </div>
            )}

            {/* ── Status bar ──────────────────────────────────────────── */}
            {(error || success) && (
                <div className={clsx("flex items-center gap-2 px-5 py-2 text-xs font-bold", error ? "bg-red-500/10 text-red-400" : "bg-emerald-500/10 text-emerald-400")}>
                    {error ? <AlertCircle className="w-3.5 h-3.5" /> : <Check className="w-3.5 h-3.5" />}
                    {error || success}
                    <button onClick={() => { setError(null); setSuccess(null); }} className="ml-auto opacity-50 hover:opacity-100"><X className="w-3 h-3" /></button>
                </div>
            )}

            {/* ── Main Content ─────────────────────────────────────────── */}
            {cues.length === 0 ? (
                <div className="flex-1 flex items-center justify-center text-white/20 text-sm gap-2">
                    <FileText className="w-5 h-5" /> No subtitles loaded
                </div>
            ) : mode === "preview" ? (
                /* Preview Mode */
                <div className="flex-1 overflow-y-auto p-5 space-y-3 custom-scrollbar">
                    {cues.map((cue, i) => (
                        <div key={i} className="group flex gap-3 p-3 rounded-xl hover:bg-white/5 transition-all">
                            <div className="w-8 text-center text-[10px] font-black text-white/20 pt-0.5">{cue.index}</div>
                            <div className="flex-1">
                                <p className="text-[10px] font-mono text-white/30 mb-1">{cue.startTime} → {cue.endTime}</p>
                                <p className="text-sm text-white leading-relaxed whitespace-pre-wrap">{cue.text}</p>
                                {cue.originalText && cue.text !== cue.originalText && (
                                    <p className="text-[10px] text-amber-400/60 mt-1 line-through">{cue.originalText}</p>
                                )}
                            </div>
                        </div>
                    ))}
                </div>
            ) : (
                /* Edit Mode */
                <div className="flex-1 flex overflow-hidden">
                    {/* Cue List */}
                    <div className="w-72 border-r border-white/5 overflow-y-auto custom-scrollbar shrink-0" ref={listRef}>
                        {cues.map((cue, i) => (
                            <div
                                key={i}
                                onClick={() => setSelectedIndex(i)}
                                className={clsx(
                                    "flex items-start gap-2 p-3 border-b border-white/5 cursor-pointer transition-all group hover:bg-white/5",
                                    selectedIndex === i ? "bg-accent-cyan/5 border-l-2 border-l-accent-cyan" : ""
                                )}
                            >
                                <span className="text-[10px] font-black text-white/20 pt-0.5 w-6 shrink-0">{cue.index}</span>
                                <div className="flex-1 min-w-0">
                                    <p className="text-[9px] font-mono text-white/30 mb-0.5 truncate">{cue.startTime}</p>
                                    <p className={clsx("text-xs text-white/70 truncate leading-relaxed", cue.text !== cue.originalText ? "text-amber-300" : "")}>{cue.text}</p>
                                </div>
                                <button
                                    onClick={(e) => { e.stopPropagation(); deleteCue(i); }}
                                    className="opacity-0 group-hover:opacity-100 p-1 rounded text-red-400/60 hover:text-red-400 transition-all shrink-0"
                                >
                                    <Trash2 className="w-3 h-3" />
                                </button>
                            </div>
                        ))}
                    </div>

                    {/* Cue Editor */}
                    <div className="flex-1 flex flex-col overflow-hidden">
                        {selectedCue ? (
                            <>
                                <div className="flex items-center gap-4 px-5 py-3 border-b border-white/5 bg-white/[0.02]">
                                    <div className="flex items-center gap-2">
                                        <span className="text-[10px] font-black uppercase tracking-widest text-white/30">Start</span>
                                        <input
                                            type="text"
                                            value={selectedCue.startTime}
                                            onChange={e => setCues(prev => prev.map((c, i) => i === selectedIndex ? { ...c, startTime: e.target.value } : c))}
                                            className="font-mono text-xs bg-white/5 border border-white/10 rounded-lg px-2 py-1.5 text-accent-cyan w-36 outline-none focus:border-accent-cyan/50"
                                        />
                                    </div>
                                    <span className="text-white/20">→</span>
                                    <div className="flex items-center gap-2">
                                        <span className="text-[10px] font-black uppercase tracking-widest text-white/30">End</span>
                                        <input
                                            type="text"
                                            value={selectedCue.endTime}
                                            onChange={e => setCues(prev => prev.map((c, i) => i === selectedIndex ? { ...c, endTime: e.target.value } : c))}
                                            className="font-mono text-xs bg-white/5 border border-white/10 rounded-lg px-2 py-1.5 text-accent-cyan w-36 outline-none focus:border-accent-cyan/50"
                                        />
                                    </div>
                                    <div className="ml-auto flex items-center gap-1">
                                        <button onClick={() => setSelectedIndex(i => Math.max(0, (i ?? 0) - 1))} disabled={selectedIndex === 0} className="p-1.5 rounded-lg bg-white/5 text-white/40 hover:text-white disabled:opacity-20 transition-all"><ChevronUp className="w-3.5 h-3.5" /></button>
                                        <button onClick={() => setSelectedIndex(i => Math.min(cues.length - 1, (i ?? 0) + 1))} disabled={selectedIndex === cues.length - 1} className="p-1.5 rounded-lg bg-white/5 text-white/40 hover:text-white disabled:opacity-20 transition-all"><ChevronDown className="w-3.5 h-3.5" /></button>
                                    </div>
                                </div>
                                <div className="flex-1 p-5">
                                    <textarea
                                        ref={editRef}
                                        value={selectedCue.text}
                                        onChange={e => updateCueText(selectedIndex!, e.target.value)}
                                        className="w-full h-full bg-transparent text-white text-sm leading-relaxed outline-none resize-none custom-scrollbar placeholder-white/20 font-sans"
                                        placeholder="Subtitle text..."
                                        spellCheck={false}
                                    />
                                </div>
                                {selectedCue.originalText && selectedCue.text !== selectedCue.originalText && (
                                    <div className="px-5 py-3 border-t border-white/5 bg-amber-500/5">
                                        <p className="text-[10px] font-black uppercase tracking-widest text-amber-400/60 mb-1">Original</p>
                                        <p className="text-xs text-white/30 whitespace-pre-wrap">{selectedCue.originalText}</p>
                                    </div>
                                )}
                            </>
                        ) : (
                            <div className="flex-1 flex items-center justify-center text-white/20 text-sm">
                                Select a cue to edit
                            </div>
                        )}
                    </div>
                </div>
            )}
        </div>
    );
}
