const { useState, useEffect, useRef, useMemo } = React;

// REPLACE your existing stampSymbol function with this:
function stampSymbol(href, x, y, size, className, rotateDeg = 0, vbW = 20, vbH = 20) {
  // We remove 'scale' from the transform and set width/height directly.
  const width = size;
  const height = size * (vbH / vbW); 

  return (
    <g transform={`translate(${x} ${y}) rotate(${rotateDeg})`}>
      <use 
        href={href} 
        className={className} 
        x={-width / 2}   // Center horizontally
        y={-height / 2}  // Center vertically
        width={width}    // Explicit world-unit width
        height={height}  // Explicit world-unit height
      />
    </g>
  );
}

// REPLACE your existing stamp function with this:
function stamp(href, x, y, worldSize, className, rotate = 0) {
  const half = worldSize / 2;

  return (
    <g transform={`translate(${x} ${y}) rotate(${rotate})`}>
      <use 
        href={href} 
        className={className}
        x={-half}          // Center the symbol
        y={-half}
        width={worldSize}  // Set exact size in grid units (e.g., 8)
        height={worldSize} 
      />
    </g>
  );
}


// Safe instantiation
const warEngine = new window.WarEngine();

// ==================================================================================
// HELPER: Coordinate Layer
// ==================================================================================
const CoordinatesLayer = React.memo(({ visible }) => {
    if (!visible) return null;
    const config = window.WAR_ROOM_CONFIG;
    if (!config) return null;

    const { mapSize, gridSize } = config.game;
    const gridItems = [];
    for (let x = 0; x < mapSize; x += gridSize) {
        for (let y = 0; y < mapSize; y += gridSize) {
            const colIndex = x / gridSize;
            const rowIndex = y / gridSize;
            const label = config.utils.getGridLabel(colIndex, rowIndex);
            gridItems.push(<text key={`${x}-${y}`} x={x + 0.5} y={y + 1.5} fontSize="0.8" fill="rgba(255,255,255,0.4)" className="font-mono select-none pointer-events-none font-bold">{label}</text>);
        }
    }
    return <g>{gridItems}</g>;
});

// ==================================================================================
// COMPONENT: OPERATOR CONSOLE
// ==================================================================================
const OperatorConsole = ({ currentPhase, setPhase, onClose }) => {
    const [teamA, setTeamA] = useState(warEngine.teams.a);
    const [teamB, setTeamB] = useState(warEngine.teams.b);
    const [customLog, setCustomLog] = useState('');

    const handleUpdateConfig = () => {
        warEngine.setTeams(teamA, teamB);
    };

    const triggerLog = (msg) => {
        warEngine.triggerEvent('log', msg);
    };

    const triggerSystemChat = (msg) => {
        warEngine.triggerEvent('system_chat', msg);
    };

    return (
        <div className="fixed bottom-16 right-4 w-80 bg-black/95 border border-[var(--status-red)] rounded shadow-2xl z-50 flex flex-col overflow-hidden animate-fade-in font-mono text-xs">
            <div className="bg-[var(--status-red)] text-black font-bold px-3 py-1 flex justify-between items-center">
                <span className="font-orbitron tracking-wider">OPERATOR CONSOLE // ADMIN</span>
                <button onClick={onClose} className="hover:bg-black/20 p-1 rounded">✕</button>
            </div>
            <div className="p-4 space-y-4 overflow-y-auto max-h-[60vh]">
                <div>
                    <div className="text-[var(--tertiary-text)] mb-2 uppercase tracking-widest border-b border-gray-800 pb-1">Phase Override</div>
                    <div className="grid grid-cols-2 gap-2">
                        {['ARCHIVE', 'HYPE', 'LOGIN', 'LIVE'].map(p => (
                            <button key={p} onClick={() => setPhase(p)} className={`px-2 py-2 border rounded transition-all ${currentPhase === p ? 'bg-[var(--accent-orange)] border-[var(--accent-orange)] text-black font-bold' : 'border-gray-700 text-gray-400 hover:border-gray-500'}`}>
                                {p}
                            </button>
                        ))}
                    </div>
                </div>
                <div>
                    <div className="text-[var(--tertiary-text)] mb-2 uppercase tracking-widest border-b border-gray-800 pb-1">Hype Config</div>
                    <div className="space-y-2">
                        <input value={teamA} onChange={e => setTeamA(e.target.value)} className="w-full bg-gray-900 border border-gray-700 p-1 text-white" placeholder="Team A Name" />
                        <input value={teamB} onChange={e => setTeamB(e.target.value)} className="w-full bg-gray-900 border border-gray-700 p-1 text-white" placeholder="Team B Name" />
                        <button onClick={handleUpdateConfig} className="w-full bg-gray-800 hover:bg-gray-700 text-white py-1 border border-gray-600 rounded">UPDATE DISPLAY</button>
                    </div>
                </div>
                {currentPhase === 'LIVE' && (
                    <div>
                        <div className="text-[var(--tertiary-text)] mb-2 uppercase tracking-widest border-b border-gray-800 pb-1">Live Injection</div>
                        <div className="grid grid-cols-1 gap-2 mb-2">
                            <button onClick={() => triggerLog('⚠️ CRITICAL: BASE SHIELDS AT 50%')} className="bg-red-900/50 border border-red-700 text-red-200 py-1 rounded hover:bg-red-900">INJECT: SHIELD ALERT</button>
                            <button onClick={() => triggerLog('✅ REINFORCEMENTS ARRIVED: SECTOR 4')} className="bg-green-900/50 border border-green-700 text-green-200 py-1 rounded hover:bg-green-900">INJECT: REINFORCEMENTS</button>
                            <button onClick={() => triggerSystemChat('SERVER RESTART IN 5 MINUTES')} className="bg-yellow-900/50 border border-yellow-700 text-yellow-200 py-1 rounded hover:bg-yellow-900">CHAT: SYSTEM ANNOUNCE</button>
                        </div>
                        <div className="flex gap-1">
                            <input value={customLog} onChange={e => setCustomLog(e.target.value)} className="flex-1 bg-gray-900 border border-gray-700 p-1 text-white" placeholder="Custom Log..." />
                            <button onClick={() => {triggerLog(customLog); setCustomLog('')}} className="bg-gray-700 px-2 rounded text-white">→</button>
                        </div>
                    </div>
                )}
            </div>
        </div>
    );
};

// ==================================================================================
// COMPONENT: CLAN PROFILE
// ==================================================================================
const ClanProfile = ({ clanId, onBack }) => {
    const [clanData, setClanData] = useState(null);
    const [loading, setLoading] = useState(true);

    useEffect(() => {
        if (!clanId) return;
        const url = window.WAR_ROOM_CONFIG.vpsUrl;
        fetch(`${url}/api/warroom/clan/${clanId}`)
            .then(res => res.json())
            .then(data => { setClanData(data); setLoading(false); })
            .catch(err => { console.error(err); setLoading(false); });
    }, [clanId]);

    if (loading) return <div className="h-full flex items-center justify-center font-mono text-[var(--accent-orange)] animate-pulse">RETRIVING CLAN DATA...</div>;
    if (!clanData) return <div className="h-full flex items-center justify-center text-white">Clan profile unavailable. <button onClick={onBack} className="ml-4 underline">Back</button></div>;

    return (
        <div className="flex flex-col h-full overflow-y-auto p-4 md:p-8 animate-fade-in space-y-8 max-w-6xl mx-auto z-10">
            <div className="flex items-center justify-between border-b border-[var(--primary-border)] pb-4">
                <div className="flex items-center gap-4 md:gap-6">
                    <div className="w-16 h-16 md:w-24 md:h-24 bg-[var(--tertiary-bg)] border-2 border-[var(--accent-orange)] rounded flex items-center justify-center text-2xl md:text-4xl font-black font-orbitron">{clanData.name[0]}</div>
                    <div>
                        <h1 className="text-2xl md:text-4xl font-black font-orbitron text-white uppercase">{clanData.name}</h1>
                        <div className="text-[var(--tertiary-text)] font-mono text-xs md:text-sm tracking-widest">UPLINK ESTABLISHED: {new Date(clanData.created_at).toLocaleDateString()}</div>
                    </div>
                </div>
                <button onClick={onBack} className="bg-[var(--interactive-bg)] border border-[var(--primary-border)] px-4 py-2 rounded font-orbitron text-[10px] md:text-xs hover:border-[var(--accent-orange)] transition-all">RETURN TO HUB</button>
            </div>

            {/* Stats Grid: 1 col mobile, 4 cols desktop */}
            <div className="grid grid-cols-1 md:grid-cols-4 gap-4">
                <div className="bg-[var(--secondary-bg)] p-6 border border-[var(--primary-border)] rounded text-center">
                    <div className="text-[var(--accent-orange)] text-3xl font-black font-orbitron">{clanData.wins}</div>
                    <div className="text-xs text-[var(--tertiary-text)] font-mono uppercase">Total Victories</div>
                </div>
                <div className="bg-[var(--secondary-bg)] p-6 border border-[var(--primary-border)] rounded text-center">
                    <div className="text-white text-3xl font-black font-orbitron">{clanData.tier}</div>
                    <div className="text-xs text-[var(--tertiary-text)] font-mono uppercase">Operational Tier</div>
                </div>
                <div className="bg-[var(--secondary-bg)] p-6 border border-[var(--primary-border)] rounded text-center">
                    <div className="text-white text-3xl font-black font-orbitron">{clanData.prestige}</div>
                    <div className="text-xs text-[var(--tertiary-text)] font-mono uppercase">Prestige Level</div>
                </div>
                <div className="bg-[var(--secondary-bg)] p-6 border border-[var(--primary-border)] rounded text-center">
                    <div className="text-white text-3xl font-black font-orbitron">{clanData.score}</div>
                    <div className="text-xs text-[var(--tertiary-text)] font-mono uppercase">Power Rating</div>
                </div>
            </div>

            <div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
                <div className="space-y-4">
                    <h2 className="text-xl font-orbitron text-[var(--accent-orange)] border-b border-[var(--primary-border)] pb-2">/// OPERATION HISTORY</h2>
                    <div className="space-y-2">
                        {clanData.recentMatches?.length === 0 && <div className="text-xs font-mono text-[var(--tertiary-text)]">No operations recorded.</div>}
                        {clanData.recentMatches?.map(m => (
                            <div key={m.id} className="bg-[var(--tertiary-bg)] p-3 border border-[var(--primary-border)] rounded flex justify-between items-center text-sm font-mono">
                                <span className="text-[var(--tertiary-text)]">{new Date(m.end_time).toLocaleDateString()}</span>
                                <span className="font-bold">Match #{m.id}</span>
                                <span className={m.winner === clanData.name ? 'text-[var(--status-green)]' : 'text-[var(--status-red)]'}>
                                    {m.winner === clanData.name ? 'VICTORY' : 'DEFEAT'}
                                </span>
                            </div>
                        ))}
                    </div>
                </div>
                <div className="space-y-4">
                    <h2 className="text-xl font-orbitron text-[var(--primary-text)] border-b border-[var(--primary-border)] pb-2">/// CLAN LOGS</h2>
                    <div className="bg-black/30 p-4 border border-[var(--primary-border)] rounded h-80 overflow-y-auto space-y-4 font-mono text-xs">
                        {clanData.history?.length === 0 && <div className="text-center text-[var(--tertiary-text)] py-10">LOGS CLEAR</div>}
                        {clanData.history?.map((h, i) => (
                            <div key={i} className="border-l-2 border-[var(--accent-orange)] pl-3">
                                <div className="text-[var(--tertiary-text)] text-[10px]">{new Date(h.timestamp).toLocaleString()}</div>
                                <div className="text-white uppercase font-bold tracking-tighter">{h.event_type}</div>
                                <div className="text-[var(--secondary-text)]">{h.description}</div>
                            </div>
                        ))}
                    </div>
                </div>
            </div>
        </div>
    );
};

// ==================================================================================
// COMPONENT: ARCHIVE HUB (DASHBOARD)
// ==================================================================================
const ArchiveHub = ({ onEnterGatekeeper, currentPhase, leaderboard, pastMatches, onViewClan }) => {
    const [selectedMatch, setSelectedMatch] = useState(null);
    const [matchDetails, setMatchDetails] = useState(null); 
    const [selectedClan, setSelectedClan] = useState(null);
    
    const displayMatches = pastMatches || window.WAR_ROOM_CONFIG.pastMatches;
    const displayLeaderboard = leaderboard || window.WAR_ROOM_CONFIG.leaderboard;

    // Only allow entry if NOT in ARCHIVE phase
    const isOperationActive = currentPhase !== 'ARCHIVE';

    // Fetch details when match is selected
    const handleMatchSelect = (match) => {
        setSelectedMatch(match);
        const url = window.WAR_ROOM_CONFIG.vpsUrl;
        fetch(`${url}/api/warroom/match/${match.id}`)
            .then(res => res.json())
            .then(data => setMatchDetails(data))
            .catch(err => console.error("Telemetry fetch failed", err));
    };

    const handleCloseModal = () => {
        setSelectedMatch(null);
        setMatchDetails(null);
        setSelectedClan(null);
    };

    return (
        <div className="flex flex-col h-full overflow-hidden animate-fade-in relative">
            <div className="absolute inset-0 bg-[url('/images/404header.png')] bg-no-repeat bg-center opacity-5 pointer-events-none scale-150 blur-sm"></div>
            {/* Responsive Grid: 1 col on mobile, 3 cols on lg screens */}
            <div className="flex-1 p-4 md:p-8 grid grid-cols-1 lg:grid-cols-3 gap-8 overflow-y-auto z-10">
                <div className="lg:col-span-2 space-y-6">
                    <h2 className="text-xl md:text-2xl font-orbitron text-[var(--accent-orange)] border-b border-[var(--primary-border)] pb-2"><i className="mr-2">///</i> ARCHIVED OPERATIONS</h2>
                    <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
                        {displayMatches.length === 0 && <div className="text-[var(--tertiary-text)] font-mono text-sm">No operations recorded yet.</div>}
                        {displayMatches.map(match => (
                            <div key={match.id} onClick={() => handleMatchSelect(match)} className="bg-[var(--secondary-bg)] border border-[var(--primary-border)] p-4 rounded hover:border-[var(--accent-orange)] hover:translate-y-[-2px] transition-all cursor-pointer group">
                                <div className="flex justify-between text-xs font-mono text-[var(--tertiary-text)] mb-2"><span>OP-ID: {match.id}</span><span>{match.date}</span></div>
                                <div className="flex items-center justify-between mb-4"><div className="text-lg font-bold text-[var(--status-green)]">{match.winner}</div><div className="text-xs text-[var(--tertiary-text)]">VS</div><div className="text-lg font-bold text-[var(--status-red)]">{match.loser}</div></div>
                                <div className="text-center bg-[var(--tertiary-bg)] py-1 rounded text-sm font-mono group-hover:text-[var(--primary-text)]">RESULT: {match.score}</div>
                            </div>
                        ))}
                    </div>
                </div>
                <div className="space-y-6">
                    <h2 className="text-xl md:text-2xl font-orbitron text-[var(--primary-text)] border-b border-[var(--primary-border)] pb-2"><i className="mr-2">///</i> CLAN RANKINGS</h2>
                    <div className="bg-[var(--secondary-bg)] border border-[var(--primary-border)] rounded overflow-x-auto">
                        <table className="w-full text-left text-sm min-w-[300px]">
                            <thead className="bg-[var(--tertiary-bg)] font-mono text-[var(--tertiary-text)]"><tr><th className="p-3">#</th><th className="p-3">CLAN</th><th className="p-3 text-right">WINS</th><th className="p-3 text-right">K/D</th></tr></thead>
                            <tbody>
                                {displayLeaderboard.length === 0 && <tr><td colSpan="4" className="p-3 text-center text-[var(--tertiary-text)]">No data available.</td></tr>}
                                {displayLeaderboard.map((clan, idx) => (
                                    <tr key={idx} onClick={() => setSelectedClan(clan)} className="border-b border-[var(--primary-border)] hover:bg-[var(--interactive-bg)] cursor-pointer transition-colors">
                                        <td className="p-3 font-orbitron text-[var(--accent-orange)]">{clan.rank}</td>
                                        <td className="p-3 font-bold">{clan.name}</td>
                                        <td className="p-3 text-right font-mono">{clan.wins}</td>
                                        <td className="p-3 text-right font-mono text-[var(--secondary-text)]">{clan.kd}</td>
                                    </tr>
                                ))}
                            </tbody>
                        </table>
                    </div>
                    <div className="mt-8 p-6 bg-[var(--tertiary-bg)]/50 border border-[var(--primary-border)] rounded text-center">
                        <p className="text-sm text-[var(--secondary-text)] mb-4">
                            {isOperationActive ? 'ACTIVE SIGNAL DETECTED' : 'NO ACTIVE BATTLE SIGNAL'}
                        </p>
                        <button 
                            onClick={onEnterGatekeeper} 
                            disabled={!isOperationActive}
                            className={`w-full font-orbitron py-3 rounded transition-all border ${isOperationActive ? 'bg-[var(--accent-orange)] hover:bg-[var(--accent-hover)] border-[var(--accent-orange)] text-white' : 'bg-transparent border-[var(--primary-border)] text-[var(--tertiary-text)] cursor-not-allowed'}`}
                        >
                            {isOperationActive ? 'WATCH MATCH' : 'WAR ROOM OFFLINE'}
                        </button>
                    </div>
                </div>
            </div>
            {(selectedMatch || selectedClan) && (
                <div className="fixed inset-0 z-50 bg-black/80 backdrop-blur-sm flex items-center justify-center p-4" onClick={handleCloseModal}>
                    <div className="bg-[var(--secondary-bg)] border border-[var(--accent-orange)] p-4 md:p-8 max-w-2xl w-full rounded shadow-2xl relative max-h-[90vh] overflow-y-auto" onClick={e => e.stopPropagation()}>
                        <button className="absolute top-2 right-4 text-2xl hover:text-[var(--accent-orange)]" onClick={handleCloseModal}>×</button>
                        {selectedMatch && (
                            <div className="text-center space-y-6">
                                <h3 className="text-xl font-orbitron text-[var(--primary-text)]">OPERATION REPORT: {selectedMatch.id}</h3>
                                <div className="py-4 border-y border-[var(--primary-border)]">
                                    <div className="text-4xl font-black text-[var(--status-green)] mb-2">{selectedMatch.winner}</div>
                                    <div className="text-sm font-mono text-[var(--tertiary-text)]">DEFEATED</div>
                                    <div className="text-2xl font-bold text-[var(--status-red)] mt-2">{selectedMatch.loser}</div>
                                </div>
                                <div className="grid grid-cols-2 gap-4 text-sm font-mono text-left">
                                    <div>MAP: <span className="text-white">{selectedMatch.map}</span></div>
                                    <div>DATE: <span className="text-white">{selectedMatch.date}</span></div>
                                    <div className="col-span-2">RESULT: <span className="text-[var(--accent-orange)]">{selectedMatch.score}</span></div>
                                </div>
                                {matchDetails && (
                                    <div className="text-left space-y-2">
                                        <div className="text-[10px] font-orbitron text-[var(--accent-orange)] uppercase tracking-widest border-b border-white/10 pb-1">Battle Telemetry Logs</div>
                                        <div className="bg-black/40 p-3 rounded font-mono text-[10px] h-40 overflow-y-auto space-y-1">
                                            {matchDetails.log_data?.map((log, i) => <div key={i} className="border-b border-white/5 pb-1"><span className="opacity-40 mr-2">[{log.timestamp}]</span>{log.text}</div>)}
                                        </div>
                                    </div>
                                )}
                            </div>
                        )}
                        {selectedClan && (
                            <div className="text-center space-y-4">
                                <div className="w-20 h-20 bg-[var(--tertiary-bg)] rounded-full mx-auto flex items-center justify-center border-2 border-[var(--primary-border)]"><span className="font-orbitron text-2xl">{selectedClan.name[0]}</span></div>
                                <h3 className="text-2xl font-black text-[var(--primary-text)]">{selectedClan.name}</h3>
                                <div className="grid grid-cols-3 gap-2 text-center py-4">
                                    <div className="bg-[var(--primary-bg)] p-2 rounded"><div className="text-[var(--accent-orange)] font-bold text-xl">{selectedClan.rank}</div><div className="text-[10px] text-[var(--tertiary-text)]">RANK</div></div>
                                    <div className="bg-[var(--primary-bg)] p-2 rounded"><div className="text-white font-bold text-xl">{selectedClan.wins}</div><div className="text-[10px] text-[var(--tertiary-text)]">WINS</div></div>
                                    <div className="bg-[var(--primary-bg)] p-2 rounded"><div className="text-white font-bold text-xl">{selectedClan.kd}</div><div className="text-[10px] text-[var(--tertiary-text)]">K/D</div></div>
                                </div>
                                <button onClick={() => onViewClan(selectedClan.id)} className="w-full bg-[var(--accent-orange)] text-white py-3 rounded font-bold font-orbitron text-sm hover:bg-[var(--accent-hover)] transition-all">VIEW FULL PROFILE</button>
                            </div>
                        )}
                    </div>
                </div>
            )}
        </div>
    );
};

// ==================================================================================
// COMPONENT: HYPE SCREEN (MOBILE FIXES APPLIED)
// ==================================================================================
const HypeScreen = () => {
    const [timeLeft, setTimeLeft] = useState('');
    const teams = warEngine.teams; 
    const [targetTime, setTargetTime] = useState(null);
    
    // --- AUDIO STATE ---
    const [isMuted, setIsMuted] = useState(false);
    const audioRef = useRef(null);

    // Helper to safely get name and roster
    const getTeamData = (teamData) => {
        if (typeof teamData === 'string') return { name: teamData, roster: [] };
        if (!teamData) return { name: 'Loading...', roster: [] };
        return { 
            name: teamData.name || 'Unknown', 
            roster: teamData.roster || [] 
        };
    };

    const teamA = getTeamData(teams.a);
    const teamB = getTeamData(teams.b);

    // --- AUDIO LOGIC ---
    useEffect(() => {
        const tracks = ['audio/WarRoom1.mp3', 'audio/WarRoom2.mp3'];
        const selectedTrack = tracks[Math.floor(Math.random() * tracks.length)];
        const audio = new Audio(selectedTrack);
        audio.volume = 0.4; 
        audio.loop = true;
        audioRef.current = audio;

        const playPromise = audio.play();
        if (playPromise !== undefined) {
            playPromise.catch(() => setIsMuted(true));
        }

        return () => {
            audio.pause();
            audio.currentTime = 0;
        };
    }, []);

    const toggleAudio = () => {
        if (audioRef.current) {
            if (isMuted) {
                audioRef.current.play();
                audioRef.current.muted = false;
            } else {
                audioRef.current.muted = true;
            }
            setIsMuted(!isMuted);
        }
    };

    // --- TIMER LOGIC ---
    useEffect(() => {
        if(warEngine.startTime) setTargetTime(new Date(warEngine.startTime));
        warEngine.on('time_update', (ts) => { if(ts) setTargetTime(new Date(ts)); });
    }, []);

    useEffect(() => {
        if (!targetTime) {
            const now = new Date();
            const bufferTime = new Date(now.getTime() + 15 * 60000);
            const minutes = bufferTime.getMinutes();
            const remainder = minutes % 15;
            const minutesToAdd = remainder === 0 ? 0 : 15 - remainder;
            bufferTime.setMinutes(minutes + minutesToAdd);
            bufferTime.setSeconds(0);
            setTargetTime(bufferTime);
        }
    }, [targetTime]);

    useEffect(() => {
        if(!targetTime) return;
        const timer = setInterval(() => {
            const now = new Date();
            const diff = targetTime - now;
            if (diff <= 0) {
                setTimeLeft("00:00:00");
            } else {
                const m = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
                const s = Math.floor((diff % (1000 * 60)) / 1000);
                setTimeLeft(`${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`);
            }
        }, 1000);
        return () => clearInterval(timer);
    }, [targetTime]);

    // Roster Table Component
    const RosterTable = ({ roster, alignRight }) => (
        <div className={`w-full bg-black/40 border border-[var(--primary-border)] rounded overflow-hidden backdrop-blur-sm shadow-2xl ${alignRight ? 'text-right' : 'text-left'}`}>
            <table className="w-full text-xs md:text-sm font-mono">
                <thead className="bg-[var(--tertiary-bg)]/90 text-[var(--tertiary-text)] uppercase tracking-wider">
                    <tr>
                        <th className={`p-2 md:p-3 ${alignRight ? 'text-right' : 'text-left'}`}>Operative</th>
                        <th className="p-2 md:p-3 text-center">PWR</th>
                        <th className="p-2 md:p-3 text-center">K/D</th>
                    </tr>
                </thead>
                <tbody className="divide-y divide-[var(--primary-border)]/50">
                    {roster.length === 0 && (
                        <tr><td colSpan="3" className="p-6 text-center text-[var(--tertiary-text)] italic opacity-50">Awaiting Uplink...</td></tr>
                    )}
                    {roster.map((member, i) => (
                        <tr key={i} className="hover:bg-white/10 transition-colors">
                            <td className={`p-2 md:p-3 font-bold text-white ${alignRight ? 'text-right' : 'text-left'}`}>
                                {member.name}
                            </td>
                            <td className="p-2 md:p-3 text-center text-[var(--accent-orange)] font-bold">{member.power}</td>
                            <td className="p-2 md:p-3 text-center text-[var(--secondary-text)]">
                                {member.kills}/{member.deaths} <span className="opacity-50 text-[10px] ml-1">({member.kdr})</span>
                            </td>
                        </tr>
                    ))}
                </tbody>
            </table>
        </div>
    );

    return (
        <div className="h-full flex flex-col items-center relative overflow-hidden scanline overflow-y-auto md:overflow-y-hidden">
            <div className="absolute inset-0 bg-[radial-gradient(circle_at_center,_var(--tertiary-bg)_0%,_var(--primary-bg)_100%)] fixed"></div>
            <div className="absolute inset-0 opacity-10 bg-[url('/images/404header.png')] bg-no-repeat bg-center scale-[2] fixed"></div>
            
            {/* MAIN CONTENT GRID */}
            <div className="z-10 w-full max-w-[95%] xl:max-w-7xl px-4 grid grid-cols-1 md:grid-cols-3 gap-8 items-start md:items-center py-4 md:py-0">
                
                {/* LEFT ROSTER (Team A) - Order 1 on Mobile */}
                <div className="flex flex-col items-center justify-center space-y-4 order-1">
                    <div className="text-center space-y-1">
                        <div className="text-2xl md:text-3xl lg:text-5xl font-black text-white font-orbitron drop-shadow-[0_0_10px_rgba(255,255,255,0.2)]">{teamA.name}</div>
                        <div className="text-[var(--accent-orange)] font-mono text-xs tracking-[0.3em] uppercase">Challenger</div>
                    </div>
                    <RosterTable roster={teamA.roster} alignRight={false} />
                </div>

                {/* CENTER (VS & Timer) - Order 2 on Mobile (Between teams) */}
                <div className="text-center space-y-6 animate-pulse flex flex-col items-center justify-center order-2 mt-4 md:mt-0">
                    <div className="text-[var(--accent-orange)] font-orbitron tracking-[0.5em] text-xs md:text-lg opacity-80">INCOMING<br/>TRANSMISSION</div>
                    
                    <div className="text-5xl md:text-6xl lg:text-8xl font-black text-[var(--accent-orange)] italic font-orbitron transform -skew-x-12">VS</div>

                    <div className="py-2 md:py-4">
                        <div className="text-[10px] font-mono text-[var(--tertiary-text)] mb-2 uppercase tracking-widest">Battle Initialization Sequence</div>
                        <div className="text-4xl md:text-5xl lg:text-7xl font-black font-orbitron text-white tabular-nums tracking-tighter drop-shadow-[0_0_15px_rgba(255,111,0,0.5)]">{timeLeft}</div>
                    </div>
                </div>

                {/* RIGHT ROSTER (Team B) - Order 3 on Mobile */}
                <div className="flex flex-col items-center justify-center space-y-4 order-3">
                    <div className="text-center space-y-1">
                        <div className="text-2xl md:text-3xl lg:text-5xl font-black text-white font-orbitron drop-shadow-[0_0_10px_rgba(255,255,255,0.2)]">{teamB.name}</div>
                        <div className="text-[var(--status-red)] font-mono text-xs tracking-[0.3em] uppercase">Defender</div>
                    </div>
                    <RosterTable roster={teamB.roster} alignRight={false} />
                </div>

            </div>

            {/* BOTTOM INFO - Visible on Mobile and Desktop now */}
            <div className="flex z-10 w-full py-8 px-4 justify-center order-4">
                <div className="max-w-2xl w-full bg-black/60 border border-[var(--primary-border)] p-6 rounded backdrop-blur-md text-left shadow-2xl relative overflow-hidden group">
                    <div className="absolute top-0 left-0 w-1 h-full bg-[var(--accent-orange)]"></div>
                    <div className="text-[var(--accent-orange)] font-bold font-orbitron text-xs mb-3 border-b border-[var(--primary-border)] pb-2 flex justify-between">
                        <span>⚠ ACCESS RESTRICTED</span>
                        <span className="opacity-50">SECURE TERMINAL</span>
                    </div>
                    <p className="text-sm text-[var(--secondary-text)] font-mono mb-4 leading-relaxed">
                        Secure uplink will be established automatically when the battle begins.
                        You will need a valid <strong className="text-white">Access Token</strong> to enter the War Room.
                    </p>
                    <div className="text-xs text-[var(--tertiary-text)] font-mono space-y-2 bg-[var(--tertiary-bg)]/30 p-3 rounded">
                        <p className="font-bold text-white uppercase tracking-wider mb-1">How to acquire tokens:</p>
                        <ul className="list-none space-y-1">
                            <li className="flex items-center gap-2"><span className="text-[var(--accent-orange)]">></span> Win them in <strong>Clan Drop Events</strong> (Check <span className="text-[var(--accent-orange)]">#rewards-room</span> in Discord).</li>
                            <li className="flex items-center gap-2"><span className="text-[var(--accent-orange)]">></span> Receive them instantly when purchasing any <strong>VIP Package</strong>.</li>
                        </ul>
                    </div>
                </div>
            </div>

            {/* AUDIO CONTROL */}
            <button 
                onClick={toggleAudio}
                className="absolute bottom-4 right-4 z-50 bg-black/60 text-white p-2 rounded-full border border-gray-600 hover:border-[var(--accent-orange)] hover:text-[var(--accent-orange)] transition-all"
                title={isMuted ? "Unmute Music" : "Mute Music"}
            >
                {isMuted ? (
                    <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6"><path strokeLinecap="round" strokeLinejoin="round" d="M17.25 9.75 19.5 12m0 0 2.25 2.25M19.5 12l2.25-2.25M19.5 12l-2.25 2.25m-10.5-6 4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.009 9.009 0 0 1 2.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75Z" /></svg>
                ) : (
                    <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="w-6 h-6"><path strokeLinecap="round" strokeLinejoin="round" d="M19.114 5.636a9 9 0 0 1 0 12.728M16.463 8.288a5.25 5.25 0 0 1 0 7.424M6.75 8.25l4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.009 9.009 0 0 1 2.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75Z" /></svg>
                )}
            </button>
        </div>
    );
};

// ==================================================================================
// COMPONENT: LOGIN SCREEN
// ==================================================================================
const LoginScreen = ({ onLogin }) => {
    const [key, setKey] = useState('');
    const [nickname, setNickname] = useState('');
    const [status, setStatus] = useState('idle');
    
    const handleSubmit = async (e) => {
        e.preventDefault();
        if (!key || !nickname) return;
        setStatus('loading');
        try {
            const res = await warEngine.authenticate(key);
            setStatus('success');
            setTimeout(() => onLogin(key, nickname, res.isAdmin), 500);
        } catch (err) {
            setStatus('error');
            setTimeout(() => setStatus('idle'), 1000);
        }
    };

    return (
        <div className="h-full flex flex-col items-center justify-center p-4 relative">
             <div className="absolute inset-0 opacity-20 pointer-events-none" style={{ backgroundImage: 'linear-gradient(var(--primary-border) 1px, transparent 1px), linear-gradient(90deg, var(--primary-border) 1px, transparent 1px)', backgroundSize: '40px 40px' }}></div>
             <div className={`relative bg-[var(--secondary-bg)] border border-[var(--primary-border)] p-8 rounded-lg shadow-2xl max-w-md w-full flex flex-col items-center gap-6 ${status === 'error' ? 'shake-anim border-[var(--status-red)]' : ''}`}>
                <div className="text-center space-y-2">
                    <h1 className="text-3xl font-black font-orbitron tracking-widest text-[var(--primary-text)]">WAR<span className="text-[var(--accent-orange)]">ROOM</span></h1>
                    <div className="text-xs font-mono text-[var(--tertiary-text)] uppercase tracking-[0.3em]">Identity Verification</div>
                </div>

                <div className="w-full bg-[var(--primary-bg)]/50 border border-[var(--primary-border)] p-3 rounded text-center">
                    <p className="text-[10px] text-[var(--secondary-text)] font-mono">
                        To access the War Room, you need a valid token.<br/>
                        <span className="text-[var(--accent-orange)]">Discord Command: </span> 
                        <code className="bg-black/50 px-1 rounded text-white">/warroom token</code>
                    </p>
                </div>

                <div className="w-full flex justify-center">
                    {status === 'loading' && <div className="text-[var(--accent-orange)] font-mono text-sm animate-pulse">VERIFYING CREDENTIALS...</div>}
                    {status === 'error' && <div className="text-[var(--status-red)] font-mono text-sm font-bold">ACCESS DENIED</div>}
                    {status === 'success' && <div className="text-[var(--status-green)] font-mono text-sm font-bold">ACCESS GRANTED</div>}
                    {status === 'idle' && <div className="text-[var(--tertiary-text)] font-mono text-sm">ENTER CREDENTIALS</div>}
                </div>
                <form onSubmit={handleSubmit} className="w-full space-y-4">
                    <input type="text" value={nickname} onChange={(e) => setNickname(e.target.value)} className="w-full bg-[var(--primary-bg)] border border-[var(--primary-border)] text-[var(--primary-text)] font-mono text-center tracking-widest py-3 rounded focus:outline-none focus:border-[var(--accent-orange)]" placeholder="CALLSIGN" autoFocus maxLength={15} />
                    <input type="text" value={key} onChange={(e) => setKey(e.target.value)} className="w-full bg-[var(--primary-bg)] border border-[var(--primary-border)] text-[var(--primary-text)] font-mono text-center tracking-widest py-3 rounded focus:outline-none focus:border-[var(--accent-orange)] uppercase" placeholder="ACCESS KEY" />
                    <button type="submit" disabled={status === 'loading' || status === 'success' || !key || !nickname} className="w-full bg-[var(--accent-orange)] hover:bg-[var(--accent-hover)] text-white font-bold font-orbitron py-3 rounded transition-all disabled:opacity-50 mt-2">
                        {status === 'loading' ? 'PROCESSING...' : 'INITIALIZE UPLINK'}
                    </button>
                </form>
             </div>
        </div>
    )
};

// ==================================================================================
// COMPONENT: LIVE WAR ROOM
// ==================================================================================
const LiveWarRoom = ({ isChatOpen, toggleChat }) => {
    const config = window.WAR_ROOM_CONFIG;
    if (!config) return null;

    const { mapSize, gridSize } = config.game;
    const [entities, setEntities] = useState([]);
    const [logs, setLogs] = useState([]);
    // Default zoom slightly further out for mobile context
    const [viewState, setViewState] = useState({ x: -20, y: -20, zoom: mapSize });
    
    const [isDragging, setIsDragging] = useState(false);
    const [dragStart, setDragStart] = useState({ x: 0, y: 0 });
    const [hoverInfo, setHoverInfo] = useState(null);
    
    const svgRef = useRef(null);
    const logContainerRef = useRef(null);

    // CAMERA TUNING
    const MIN_ZOOM = 8;                 
    const MAX_ZOOM = mapSize * 2.0;     
    const PAN_PADDING = mapSize * 0.5;  

    // Touch State Refs
    const dragWorldStartRef = useRef(null);
    const dragViewStartRef = useRef(null);
    const lastTouchDistance = useRef(null);

    useEffect(() => {
        warEngine.on('tactical_update', setEntities);
        warEngine.on('war_log', log => setLogs(prev => [...prev.slice(-49), log]));
        // TEMP TEST: show one icon entity
        setEntities([{ id: 'test1', x: 40, y: 40, type: 'TEST', status: 'OK', icon: 'icons.entities.player' }]);
    }, []);

    useEffect(() => {
        if (logContainerRef.current) logContainerRef.current.scrollTop = logContainerRef.current.scrollHeight;
    }, [logs]);

    // Helper: clamp camera so it never goes outside the map bounds
    const clampView = (x, y, zoom) => {
        const z = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom));

        const minX = -PAN_PADDING;
        const minY = -PAN_PADDING;
        const maxX = mapSize - z + PAN_PADDING;
        const maxY = mapSize - z + PAN_PADDING;

        const cx = Math.max(minX, Math.min(maxX, x));
        const cy = Math.max(minY, Math.min(maxY, y));

        return { x: cx, y: cy, zoom: z };
    };

    // SVG coordinate conversion
    const clientToWorld = (clientX, clientY) => {
        const svg = svgRef.current;
        if (!svg) return { x: 0, y: 0 };

        const pt = svg.createSVGPoint();
        pt.x = clientX;
        pt.y = clientY;

        const ctm = svg.getScreenCTM();
        if (!ctm) return { x: 0, y: 0 };

        const world = pt.matrixTransform(ctm.inverse());
        return { x: world.x, y: world.y };
    };

    // --- MOUSE EVENTS ---
    const handleWheel = (e) => {
        e.preventDefault();
        const zoomFactor = 1.08;
        const direction = e.deltaY > 0 ? 1 : -1;
        const mouseWorld = clientToWorld(e.clientX, e.clientY);

        setViewState(prev => {
            const newZoom = direction > 0 ? prev.zoom * zoomFactor : prev.zoom / zoomFactor;
            const u = (mouseWorld.x - prev.x) / prev.zoom;
            const v = (mouseWorld.y - prev.y) / prev.zoom;
            const newX = mouseWorld.x - u * newZoom;
            const newY = mouseWorld.y - v * newZoom;
            return clampView(newX, newY, newZoom);
        });
    };

    const handleMouseDown = (e) => {
        setIsDragging(true);
        dragWorldStartRef.current = clientToWorld(e.clientX, e.clientY);
        dragViewStartRef.current = { ...viewState };
        setDragStart({ x: e.clientX, y: e.clientY }); 
    };

    const handleMouseMove = (e) => {
        if (hoverInfo) setHoverInfo(prev => ({ ...prev, x: e.clientX, y: e.clientY }));
        if (!isDragging) return;

        const startWorld = dragWorldStartRef.current;
        const startView = dragViewStartRef.current;
        if (!startWorld || !startView) return;

        const nowWorld = clientToWorld(e.clientX, e.clientY);
        const dx = nowWorld.x - startWorld.x;
        const dy = nowWorld.y - startWorld.y;

        const dragSpeed = 1.0; 
        const newX = startView.x - dx * dragSpeed;
        const newY = startView.y - dy * dragSpeed;

        setViewState(prev => clampView(newX, newY, prev.zoom));
    };

    const handleMouseUp = () => {
        setIsDragging(false);
        dragWorldStartRef.current = null;
        dragViewStartRef.current = null;
    };

    // --- TOUCH EVENTS ---
    const getTouchDistance = (t1, t2) => {
        const dx = t1.clientX - t2.clientX;
        const dy = t1.clientY - t2.clientY;
        return Math.sqrt(dx * dx + dy * dy);
    };

    const handleTouchStart = (e) => {
        if (e.touches.length === 1) {
            // Single finger: Pan
            setIsDragging(true);
            dragWorldStartRef.current = clientToWorld(e.touches[0].clientX, e.touches[0].clientY);
            dragViewStartRef.current = { ...viewState };
        } else if (e.touches.length === 2) {
            // Two fingers: Zoom (stop panning)
            setIsDragging(false);
            lastTouchDistance.current = getTouchDistance(e.touches[0], e.touches[1]);
        }
    };

    const handleTouchMove = (e) => {
        if (e.touches.length === 1 && isDragging) {
            // Pan Logic
            const startWorld = dragWorldStartRef.current;
            const startView = dragViewStartRef.current;
            if (!startWorld || !startView) return;

            const nowWorld = clientToWorld(e.touches[0].clientX, e.touches[0].clientY);
            const dx = nowWorld.x - startWorld.x;
            const dy = nowWorld.y - startWorld.y;

            setViewState(prev => clampView(startView.x - dx, startView.y - dy, prev.zoom));
        } 
        else if (e.touches.length === 2) {
            // Pinch Zoom Logic
            const currentDist = getTouchDistance(e.touches[0], e.touches[1]);
            
            if (lastTouchDistance.current) {
                const ratio = lastTouchDistance.current / currentDist;
                
                // Calculate center point of the pinch
                const centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2;
                const centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2;
                const centerWorld = clientToWorld(centerX, centerY);

                setViewState(prev => {
                    const newZoom = prev.zoom * ratio;
                    
                    // Zoom towards the center point
                    const u = (centerWorld.x - prev.x) / prev.zoom;
                    const v = (centerWorld.y - prev.y) / prev.zoom;
                    const newX = centerWorld.x - u * newZoom;
                    const newY = centerWorld.y - v * newZoom;

                    return clampView(newX, newY, newZoom);
                });
            }
            lastTouchDistance.current = currentDist;
        }
    };

    const handleTouchEnd = (e) => {
        if (e.touches.length === 0) {
            setIsDragging(false);
            dragWorldStartRef.current = null;
            dragViewStartRef.current = null;
            lastTouchDistance.current = null;
        }
    };

    return (
        <div
            className="relative w-full h-full bg-gray-900 overflow-hidden cursor-grab touch-none"
            onMouseDown={handleMouseDown}
            onMouseMove={handleMouseMove}
            onMouseUp={handleMouseUp}
            onMouseLeave={handleMouseUp}
            onWheel={handleWheel}
            onTouchStart={handleTouchStart}
            onTouchMove={handleTouchMove}
            onTouchEnd={handleTouchEnd}
        >
            <svg
                ref={svgRef}
                className="w-full h-full block"
                viewBox={`${viewState.x} ${viewState.y} ${viewState.zoom} ${viewState.zoom}`}
                preserveAspectRatio="xMinYMin meet"
            >
                <AssetDefs />

                <defs>
                    <pattern id="grid" width={gridSize} height={gridSize} patternUnits="userSpaceOnUse">
                        <path d={`M ${gridSize} 0 L 0 0 0 ${gridSize}`} fill="none" stroke="var(--primary-border)" strokeWidth="0.1" />
                        <rect width="0.5" height="0.5" fill="rgba(255,255,255,0.3)" />
                    </pattern>
                </defs>

                <rect x="-1000" y="-1000" width="4000" height="4000" fill="#111" />
                <rect x="0" y="0" width={mapSize} height={mapSize} fill="url(#grid)" />
                <rect x="0" y="0" width={mapSize} height={mapSize} fill="none" stroke="var(--accent-orange)" strokeWidth="0.5" strokeDasharray="5,5" opacity="0.5" />

                <g id="map-test-assets">
                    {stamp('#wr-crate',  mapSize * 0.25, mapSize * 0.55, 8, 'wr-prop')}
                    {stamp('#wr-barrel', mapSize * 0.33, mapSize * 0.60, 8, 'wr-prop')}
                    {stamp('#wr-door',   mapSize * 0.55, mapSize * 0.55, 8, 'wr-entry wr-entry--locked', 90)}
                    {stamp('#wr-window', mapSize * 0.62, mapSize * 0.55, 8, 'wr-entry wr-entry--closed', 90)}
                </g>

                {viewState.zoom < 150 && <CoordinatesLayer visible={true} />}

                {entities.map((ent) => {
                    const iconUrl = warEngine.resolveAsset(ent.icon);

                    return (
                        <g
                            key={ent.id}
                            transform={`translate(${ent.x} ${ent.y})`}
                            className="cursor-pointer"
                            onClick={() => setHoverInfo({ data: ent, x: window.innerWidth/2, y: window.innerHeight/2 })} // Tap support
                            onMouseEnter={(e) => setHoverInfo({ data: ent, x: e.clientX, y: e.clientY })}
                            onMouseLeave={() => setHoverInfo(null)}
                        >
                            {iconUrl ? (
                                <image href={iconUrl} x={-2} y={-2} width={4} height={4} />
                            ) : (
                                <circle r={1.5} fill="var(--status-green)" stroke="black" strokeWidth="0.1" />
                            )}

                            <text
                                y={-3}
                                fontSize="1.2"
                                fill="white"
                                textAnchor="middle"
                                className="font-orbitron tracking-tighter drop-shadow-md pointer-events-none"
                            >
                                {ent.type}
                            </text>
                        </g>
                    );
                })}
            </svg>

            {hoverInfo && hoverInfo.data && (
                <div
                    className="fixed z-50 pointer-events-none bg-[var(--tertiary-bg)] border border-[var(--accent-orange)] p-3 rounded shadow-lg backdrop-blur-md min-w-[150px] transform -translate-x-1/2 -translate-y-full md:translate-x-0 md:translate-y-0"
                    style={{ left: hoverInfo.x + 15, top: hoverInfo.y + 15 }}
                >
                    <div className="text-xs font-bold text-[var(--accent-orange)] font-orbitron">{hoverInfo.data.type}</div>
                    <div className="text-xs text-white font-mono">STATUS: {hoverInfo.data.status}</div>
                </div>
            )}

            {/* 
               LOG CONTAINER:
               Changed bottom-6 to bottom-20 for mobile so it's not covered by browser bars.
            */}
            <div className="absolute bottom-20 md:bottom-6 left-4 md:left-6 w-[70vw] md:w-96 max-h-[25vh] md:max-h-[30vh] flex flex-col z-10" onWheel={(e) => e.stopPropagation()} onMouseDown={(e) => e.stopPropagation()} onTouchStart={(e) => e.stopPropagation()}>
                <div className="mb-1 text-[10px] text-[var(--tertiary-text)] font-orbitron uppercase tracking-widest pointer-events-none">Live Feed</div>
                <div
                    ref={logContainerRef}
                    className="pointer-events-auto overflow-y-auto pr-2 space-y-1 scrollbar-hide"
                    style={{ maskImage: 'linear-gradient(to bottom, transparent, black 15%)', WebkitMaskImage: 'linear-gradient(to bottom, transparent, black 15%)' }}
                >
                    {logs.map((log) => (
                        <div
                            key={log.id}
                            className="text-[10px] md:text-xs font-mono text-[var(--status-green)] bg-[var(--tertiary-bg)]/80 p-1.5 rounded border-l-2 border-[var(--status-green)] backdrop-blur-sm shadow-md"
                        >
                            <span className="opacity-50 mr-2 text-white">[{log.timestamp}]</span>
                            {log.text}
                        </div>
                    ))}
                </div>
            </div>

            {!isChatOpen && (
                <button
                    onClick={toggleChat}
                    className="absolute top-4 right-4 bg-[var(--interactive-bg)] text-white px-3 py-2 md:px-4 md:py-2 rounded border border-[var(--primary-border)] hover:border-[var(--accent-orange)] backdrop-blur transition-all z-20 shadow-xl group"
                >
                    <span className="text-[10px] md:text-xs font-bold tracking-wider font-orbitron group-hover:text-[var(--accent-orange)] transition-colors">OPEN COMMS >></span>
                </button>
            )}
        </div>
    );
};


const CommsPanel = ({ onClose }) => {
    const [messages, setMessages] = useState([]);
    const [input, setInput] = useState("");
    const endRef = useRef(null);
    useEffect(() => { warEngine.on('comm_message', msg => setMessages(prev => [...prev, msg])); }, []);
    useEffect(() => { endRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]);
    const handleSubmit = (e) => { e.preventDefault(); if(!input.trim()) return; warEngine.sendChat(input); setInput(""); };

    return (
        <div className="flex flex-col h-full w-full bg-[var(--secondary-bg)] border-l border-[var(--primary-border)]">
            <div className="h-14 bg-[var(--primary-bg)] flex items-center justify-between px-4 shrink-0 border-b border-[var(--primary-border)]">
                <div className="flex items-center gap-2">
                    <div className="w-2 h-2 rounded-full bg-[var(--status-green)] animate-pulse shadow-[0_0_8px_var(--status-green)]"></div>
                    <span className="font-bold text-[var(--primary-text)] font-orbitron uppercase tracking-widest text-xs">Secure Channel</span>
                </div>
                <button onClick={onClose} className="text-[var(--secondary-text)] hover:text-[var(--status-red)] transition-colors p-2 text-lg">✕</button>
            </div>
            <div className="flex-1 overflow-y-auto p-4 space-y-4 bg-[var(--secondary-bg)] scrollbar-hide">
                {messages.length === 0 && <div className="text-center text-[var(--tertiary-text)] text-xs font-mono mt-10 opacity-50">CHANNEL OPEN. NO TRAFFIC.</div>}
                {messages.map((msg, i) => {
                    const isMe = msg.source === 'web';
                    const isSystem = msg.source === 'system';
                    if (isSystem) {
                        return (
                            <div key={i} className="text-center my-4">
                                <span className="inline-block px-3 py-1 bg-[var(--accent-orange)]/20 border border-[var(--accent-orange)] rounded text-[var(--accent-orange)] text-xs font-mono font-bold tracking-wider">
                                    ⚠ SYSTEM: {msg.text}
                                </span>
                            </div>
                        )
                    }
                    return (
                        <div key={i} className={`flex flex-col ${isMe ? 'items-end' : 'items-start'}`}>
                            <span className={`text-[10px] font-bold mb-1 px-1 ${isMe ? 'text-[var(--accent-orange)]' : 'text-[var(--tertiary-text)]'}`}>{msg.user}</span>
                            <div className={`max-w-[85%] px-3 py-2 rounded-lg text-sm font-mono break-words shadow-sm relative ${isMe ? 'bg-[var(--interactive-bg)] border border-[var(--accent-orange)] text-white rounded-tr-none' : 'bg-[var(--tertiary-bg)] border border-[var(--primary-border)] text-[var(--secondary-text)] rounded-tl-none'}`}>{msg.text}</div>
                        </div>
                    );
                })}
                <div ref={endRef} />
            </div>
            <form onSubmit={handleSubmit} className="p-4 bg-[var(--primary-bg)] border-t border-[var(--primary-border)] shrink-0">
                <div className="relative">
                    <input className="w-full bg-[var(--secondary-bg)] text-[var(--primary-text)] text-sm rounded border border-[var(--primary-border)] py-3 pl-4 pr-10 focus:border-[var(--accent-orange)] focus:ring-1 focus:ring-[var(--accent-orange)] outline-none font-mono placeholder-[var(--disabled-text)] transition-all" placeholder="Transmit orders..." value={input} onChange={(e) => setInput(e.target.value)} />
                    <button type="submit" className="absolute right-2 top-2.5 text-[var(--accent-orange)] hover:text-[var(--accent-hover)] font-bold px-2">></button>
                </div>
            </form>
        </div>
    );
};

// ==================================================================================
// MAIN APP CONTROLLER
// ==================================================================================
const WarroomApp = () => {
    // STATE
    const [configLoaded, setConfigLoaded] = useState(false);
    const [currentPhase, setCurrentPhase] = useState('ARCHIVE'); 
    // NEW: View State (DASHBOARD or OPERATION or CLAN_PROFILE)
    const [activeView, setActiveView] = useState('DASHBOARD');
    const [selectedClanId, setSelectedClanId] = useState(null); // Track which clan profile to show
    
    const [isChatOpen, setIsChatOpen] = useState(false); // Default to closed on mobile
    const [showConsole, setShowConsole] = useState(false);
    // NEW: Admin State
    const [isAdmin, setIsAdmin] = useState(false);
    // NEW: Logged In State (Moved to Top)
    const [isLoggedIn, setIsLoggedIn] = useState(false);
    // NEW: Real Data State
    const [leaderboard, setLeaderboard] = useState([]);
    const [pastMatches, setPastMatches] = useState([]);

    useEffect(() => {
        const checkConfig = () => {
            if (window.WAR_ROOM_CONFIG) {
                // Load initial static config
                warEngine.teams = { 
                    a: window.WAR_ROOM_CONFIG.initialState.teamA, 
                    b: window.WAR_ROOM_CONFIG.initialState.teamB 
                };
                setCurrentPhase(window.WAR_ROOM_CONFIG.game.initialPhase);
                setConfigLoaded(true);

                // --- FETCH REAL DATA FROM BOT API ---
                if (window.WAR_ROOM_CONFIG.vpsUrl) {
                    fetch(`${window.WAR_ROOM_CONFIG.vpsUrl}/api/warroom/data`)
                        .then(res => res.json())
                        .then(data => {
                            if (data.leaderboard) setLeaderboard(data.leaderboard);
                            if (data.pastMatches) setPastMatches(data.pastMatches);
                        })
                        .catch(err => console.error("Failed to fetch War Room data:", err));
                }

                warEngine.on('phase_change', (newPhase) => {
                    console.log("Bot commanded phase change:", newPhase);
                    setCurrentPhase(newPhase);
                    // Auto-switch to Operation view if battle starts
                    if (newPhase !== 'ARCHIVE') {
                        setActiveView('OPERATION');
                    }
                });

                // 2. Bot updates team names
                warEngine.on('config_update', (teams) => {
                   // This is handled inside sub-components via engine.teams
                });

            } else {
                setTimeout(checkConfig, 50);
            }
        };
        checkConfig();
    }, []);

    const handleLogin = (token, nickname, adminStatus) => {
        warEngine.connect(token, nickname);
        
        // SET ADMIN STATUS
        setIsAdmin(adminStatus);
        setIsLoggedIn(true);
        setCurrentPhase('LIVE'); 
    };

    if (!configLoaded) {
        return (
            <div className="h-screen w-full flex items-center justify-center bg-black text-[#ff6f00] font-mono text-xs flex-col gap-2">
                <div className="animate-pulse">ESTABLISHING UPLINK TO VPS...</div>
            </div>
        );
    }

    // Determine what to render based on View + Phase
    let content = null;
    
    if (activeView === 'CLAN_PROFILE') {
        content = <ClanProfile clanId={selectedClanId} onBack={() => setActiveView('DASHBOARD')} />;
    } else if (activeView === 'DASHBOARD') {
        content = <ArchiveHub 
                    currentPhase={currentPhase} 
                    onEnterGatekeeper={() => setActiveView('OPERATION')} 
                    leaderboard={leaderboard} 
                    pastMatches={pastMatches} 
                    onViewClan={(id) => { setSelectedClanId(id); setActiveView('CLAN_PROFILE'); }}
                  />;
    } else {
        // OPERATION VIEW
        if (currentPhase === 'ARCHIVE') {
            content = <ArchiveHub 
                        currentPhase={currentPhase} 
                        onEnterGatekeeper={() => setActiveView('OPERATION')} 
                        leaderboard={leaderboard} 
                        pastMatches={pastMatches}
                        onViewClan={(id) => { setSelectedClanId(id); setActiveView('CLAN_PROFILE'); }}
                      />;
        } else if (currentPhase === 'HYPE') {
            content = <HypeScreen />;
        } else {
            // LIVE or LOGIN phase
            if (isLoggedIn) {
                content = (
                    <div className="flex h-full w-full relative overflow-hidden">
                        <div className="flex-1 relative h-full transition-all duration-500 ease-in-out">
                            <LiveWarRoom isChatOpen={isChatOpen} toggleChat={() => setIsChatOpen(true)} />
                        </div>
                        {/* 
                            RESPONSIVE CHAT SIDEBAR LOGIC:
                            - Mobile: Fixed overlay (inset-0). Hidden = translate-x-full. Open = translate-x-0.
                            - Desktop: Static relative. Hidden = w-0. Open = w-[400px].
                        */}
                        <div className={`
                            fixed inset-0 z-40 
                            md:static md:inset-auto md:h-full
                            bg-[var(--primary-bg)] border-l border-[var(--primary-border)] 
                            transition-all duration-300 ease-in-out flex flex-col shadow-2xl 
                            ${isChatOpen 
                                ? 'translate-x-0 opacity-100 md:w-[400px] md:translate-x-0' 
                                : 'translate-x-full opacity-0 md:w-0 md:overflow-hidden md:opacity-0'
                            } 
                        `}>
                            <div className="w-full h-full">
                                <CommsPanel onClose={() => setIsChatOpen(false)} />
                            </div>
                        </div>
                    </div>
                );
            } else {
                content = <LoginScreen onLogin={handleLogin} />;
            }
        }
    }

    return (
        <div className="flex flex-col h-screen bg-[var(--primary-bg)] text-[var(--primary-text)] overflow-hidden font-sans fade-in">
            {/* RESPONSIVE HEADER */}
            <header className="h-14 md:h-16 bg-[var(--primary-bg)]/90 backdrop-blur border-b border-[var(--primary-border)] flex items-center px-4 md:px-6 shrink-0 z-30 shadow-lg relative justify-between">
                <div className="flex items-center justify-start cursor-pointer group" onClick={() => setActiveView('DASHBOARD')}>
                    <h1 className="text-lg md:text-2xl font-black tracking-[0.2em] font-orbitron text-[var(--primary-text)] group-hover:text-[var(--accent-orange)] transition-colors">
                        WAR<span className="text-[var(--accent-orange)] group-hover:text-white transition-colors">ROOM</span>
                    </h1>
                </div>
                
                {/* NAVIGATION TABS - Smaller text on mobile */}
                <div className="flex items-center justify-center gap-2 md:gap-4">
                    <button 
                        onClick={() => setActiveView('DASHBOARD')}
                        className={`px-3 py-1 rounded font-orbitron text-[10px] md:text-xs tracking-widest transition-all ${activeView === 'DASHBOARD' || activeView === 'CLAN_PROFILE' ? 'bg-[var(--accent-orange)] text-white' : 'text-[var(--tertiary-text)] hover:text-white'}`}
                    >
                        HUB
                    </button>
                    {currentPhase !== 'ARCHIVE' && (
                        <button 
                            onClick={() => setActiveView('OPERATION')}
                            className={`px-3 py-1 rounded font-orbitron text-[10px] md:text-xs tracking-widest transition-all flex items-center gap-2 ${activeView === 'OPERATION' ? 'bg-[var(--status-red)] text-white' : 'text-[var(--status-red)] border border-[var(--status-red)] hover:bg-[var(--status-red)] hover:text-white'}`}
                        >
                            <span className="w-1.5 h-1.5 rounded-full bg-white animate-pulse"></span>
                            LIVE
                        </button>
                    )}
                </div>

                <div className="hidden md:flex items-center justify-end gap-6 text-[10px] font-mono text-[var(--tertiary-text)] uppercase tracking-wider">
                    <img src="/images/404header.png" alt="404 Servers" className="h-8 w-auto object-contain opacity-50" />
                </div>
            </header>

            <div className="flex-1 overflow-hidden relative">
                {content}
            </div>

            {/* OPERATOR CONSOLE (Locked behind Admin Check) */}
            <div className="fixed bottom-4 right-4 z-50">
                {showConsole && <OperatorConsole currentPhase={currentPhase} setPhase={setCurrentPhase} onClose={() => setShowConsole(false)} />}
                {/* ONLY SHOW BUTTON IF ADMIN */}
                {isAdmin && !showConsole && (
                    <button onClick={() => setShowConsole(true)} className="opacity-10 hover:opacity-100 bg-red-900 text-white text-[10px] px-2 py-1 rounded">
                        OP_ACCESS
                    </button>
                )}
            </div>
        </div>
    )
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<WarroomApp />);