'use client';

import { useState, useEffect } from 'react';
import { adminApi } from '@/lib/api';
import { useAuthStore } from '@/store/authStore';
import { useRouter } from 'next/navigation';
import { formatDate } from '@/lib/utils';
import { motion } from 'framer-motion';
import {
  Shield, Users, UserCheck, UserX, Activity, BarChart3,
  MessageSquare, FolderKanban, FileText, Image, Video,
  Clock, CheckCircle, XCircle, AlertTriangle, Trash2,
  ArrowUp, Download, Loader2
} from 'lucide-react';
import toast from 'react-hot-toast';

export default function AdminPage() {
  const { user } = useAuthStore();
  const router = useRouter();
  const [stats, setStats] = useState<any>(null);
  const [pendingUsers, setPendingUsers] = useState<any[]>([]);
  const [activityLogs, setActivityLogs] = useState<any[]>([]);
  const [activeTab, setActiveTab] = useState('dashboard');
  const [loading, setLoading] = useState(true);
  const [analytics, setAnalytics] = useState<any>(null);

  const isOwner = user?.role === 'OWNER';
  const isAdmin = user?.role === 'OWNER' || user?.role === 'ADMIN';

  useEffect(() => {
    if (!isAdmin) { router.push('/workspace'); return; }
    loadDashboard();
    loadPendingUsers();
    loadActivityLogs();
  }, []);

  const loadDashboard = async () => {
    try {
      const { data } = await adminApi.getDashboard();
      setStats(data.stats);
    } catch {} finally { setLoading(false); }
  };

  const loadPendingUsers = async () => {
    try {
      const { data } = await adminApi.getPendingUsers();
      setPendingUsers(data);
    } catch {}
  };

  const loadActivityLogs = async () => {
    try {
      const { data } = await adminApi.getActivityLogs();
      setActivityLogs(data);
    } catch {}
  };

  const loadAnalytics = async () => {
    try {
      const { data } = await adminApi.getAnalytics();
      setAnalytics(data);
    } catch {}
  };

  const approveUser = async (id: string) => {
    try {
      await adminApi.approveUser(id);
      toast.success('User approved');
      loadPendingUsers();
      loadDashboard();
    } catch {}
  };

  const rejectUser = async (id: string) => {
    try {
      await adminApi.rejectUser(id);
      toast.success('User rejected');
      loadPendingUsers();
      loadDashboard();
    } catch {}
  };

  const suspendUser = async (id: string) => {
    if (!confirm('Suspend this user?')) return;
    try {
      await adminApi.suspendUser(id);
      toast.success('User suspended');
      loadPendingUsers();
      loadDashboard();
    } catch {}
  };

  const deleteUser = async (id: string) => {
    if (!confirm('Permanently delete this user? This cannot be undone.')) return;
    try {
      await adminApi.deleteUser(id);
      toast.success('User permanently deleted');
      loadPendingUsers();
      loadDashboard();
    } catch {}
  };

  const promoteToAdmin = async (id: string) => {
    try {
      await adminApi.promoteToAdmin(id);
      toast.success('User promoted to admin');
      loadPendingUsers();
    } catch {}
  };

  const demoteAdmin = async (id: string) => {
    try {
      await adminApi.demoteAdmin(id);
      toast.success('Admin demoted to member');
      loadPendingUsers();
    } catch {}
  };

  if (loading) {
    return (
      <div className="h-full flex items-center justify-center">
        <Loader2 className="w-6 h-6 text-primary-500 animate-spin" />
      </div>
    );
  }

  const tabs = [
    { id: 'dashboard', label: 'Dashboard', icon: BarChart3 },
    { id: 'users', label: 'Users', icon: Users },
    { id: 'activity', label: 'Activity Logs', icon: Activity },
    { id: 'analytics', label: 'Analytics', icon: BarChart3 },
  ];

  const statCards = [
    { label: 'Total Users', value: stats?.totalUsers || 0, icon: Users, color: 'text-blue-400', bg: 'bg-blue-500/10' },
    { label: 'Online Now', value: stats?.onlineUsers || 0, icon: UserCheck, color: 'text-green-400', bg: 'bg-green-500/10' },
    { label: 'Pending', value: stats?.pendingUsers || 0, icon: Clock, color: 'text-yellow-400', bg: 'bg-yellow-500/10' },
    { label: 'Suspended', value: stats?.suspendedUsers || 0, icon: UserX, color: 'text-red-400', bg: 'bg-red-500/10' },
    { label: 'Channels', value: stats?.totalChannels || 0, icon: MessageSquare, color: 'text-purple-400', bg: 'bg-purple-500/10' },
    { label: 'Categories', value: stats?.totalCategories || 0, icon: FolderKanban, color: 'text-indigo-400', bg: 'bg-indigo-500/10' },
    { label: 'Files', value: stats?.totalFiles || 0, icon: FileText, color: 'text-cyan-400', bg: 'bg-cyan-500/10' },
    { label: 'Messages', value: stats?.totalMessages || 0, icon: MessageSquare, color: 'text-primary-400', bg: 'bg-primary-500/10' },
  ];

  return (
    <div className="h-full flex flex-col p-6 overflow-y-auto scrollbar-thin">
      <div className="mb-6">
        <h1 className="text-2xl font-bold flex items-center gap-3">
          <Shield className="w-6 h-6 text-primary-400" />
          Admin Panel
        </h1>
        <p className="text-sm text-vault-muted">Manage your workspace, users, and settings</p>
      </div>

      {/* Tabs */}
      <div className="flex gap-1 mb-6 glass-darker p-1 rounded-xl w-fit">
        {tabs.map(tab => (
          <button
            key={tab.id}
            onClick={() => { setActiveTab(tab.id); if (tab.id === 'analytics') loadAnalytics(); }}
            className={`flex items-center gap-2 px-4 py-2 rounded-lg text-xs font-medium transition-all ${
              activeTab === tab.id ? 'bg-primary-500/20 text-primary-400' : 'text-vault-muted hover:text-vault-text'
            }`}
          >
            <tab.icon className="w-4 h-4" />
            {tab.label}
          </button>
        ))}
      </div>

      {/* Dashboard Tab */}
      {activeTab === 'dashboard' && (
        <div>
          <div className="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
            {statCards.map((card, i) => (
              <motion.div
                key={card.label}
                initial={{ opacity: 0, y: 20 }}
                animate={{ opacity: 1, y: 0 }}
                transition={{ delay: i * 0.05 }}
                className="glass-card p-4"
              >
                <div className="flex items-center justify-between mb-3">
                  <div className={`w-10 h-10 rounded-xl ${card.bg} flex items-center justify-center`}>
                    <card.icon className={`w-5 h-5 ${card.color}`} />
                  </div>
                </div>
                <p className="text-2xl font-bold">{card.value}</p>
                <p className="text-xs text-vault-muted mt-1">{card.label}</p>
              </motion.div>
            ))}
          </div>

          {/* Pending approvals */}
          {pendingUsers.length > 0 && (
            <div className="glass-card p-4 mb-6">
              <h3 className="text-sm font-semibold mb-4 flex items-center gap-2">
                <Clock className="w-4 h-4 text-yellow-500" />
                Pending Approvals ({pendingUsers.length})
              </h3>
              <div className="space-y-2">
                {pendingUsers.map(pu => (
                  <div key={pu.id} className="flex items-center justify-between p-3 rounded-lg bg-vault-surface/30">
                    <div className="flex items-center gap-3">
                      <div className="w-8 h-8 rounded-full bg-gradient-to-br from-yellow-500 to-orange-600 flex items-center justify-center text-white text-xs font-medium">
                        {pu.displayName?.[0] || pu.username?.[0]}
                      </div>
                      <div>
                        <p className="text-sm font-medium">{pu.displayName || pu.username}</p>
                        <p className="text-[10px] text-vault-muted">{pu.email}</p>
                      </div>
                    </div>
                    <div className="flex items-center gap-1">
                      <button onClick={() => approveUser(pu.id)} className="p-1.5 rounded-lg text-green-400 hover:bg-green-500/10 transition-colors" title="Approve">
                        <CheckCircle className="w-4 h-4" />
                      </button>
                      <button onClick={() => rejectUser(pu.id)} className="p-1.5 rounded-lg text-red-400 hover:bg-red-500/10 transition-colors" title="Reject">
                        <XCircle className="w-4 h-4" />
                      </button>
                      {isOwner && (
                        <button onClick={() => deleteUser(pu.id)} className="p-1.5 rounded-lg text-red-400 hover:bg-red-500/10 transition-colors" title="Delete permanently">
                          <Trash2 className="w-4 h-4" />
                        </button>
                      )}
                    </div>
                  </div>
                ))}
              </div>
            </div>
          )}
        </div>
      )}

      {/* Users Tab */}
      {activeTab === 'users' && (
        <div>
          <div className="flex items-center justify-between mb-4">
            <h3 className="text-sm font-semibold">All Users</h3>
          </div>
          {pendingUsers.length > 0 && (
            <div className="glass-card p-4 mb-4">
              <h4 className="text-xs font-semibold text-yellow-500 mb-3">Pending Approvals</h4>
              <div className="space-y-2">
                {pendingUsers.map(pu => (
                  <div key={pu.id} className="flex items-center justify-between p-3 rounded-lg bg-vault-surface/30">
                    <div className="flex items-center gap-3">
                      <div className="w-8 h-8 rounded-full bg-gradient-to-br from-yellow-500 to-orange-600 flex items-center justify-center text-white text-xs font-medium">
                        {pu.displayName?.[0] || pu.username?.[0]}
                      </div>
                      <div>
                        <p className="text-sm font-medium">{pu.displayName || pu.username}</p>
                        <p className="text-[10px] text-vault-muted">{pu.email}</p>
                      </div>
                    </div>
                    <div className="flex items-center gap-1">
                      <button onClick={() => approveUser(pu.id)} className="btn-primary text-xs px-3 py-1">Approve</button>
                      <button onClick={() => rejectUser(pu.id)} className="btn-danger text-xs px-3 py-1">Reject</button>
                      {isOwner && (
                        <button onClick={() => deleteUser(pu.id)} className="btn-danger text-xs px-3 py-1">Delete</button>
                      )}
                    </div>
                  </div>
                ))}
              </div>
            </div>
          )}
          <p className="text-xs text-vault-muted">Manage users via the approval panel above.</p>
        </div>
      )}

      {/* Activity Logs Tab */}
      {activeTab === 'activity' && (
        <div>
          <h3 className="text-sm font-semibold mb-4">Activity Logs</h3>
          <div className="space-y-1">
            {activityLogs.map((log: any) => (
              <div key={log.id} className="flex items-center gap-3 px-3 py-2 rounded-lg text-xs hover:bg-vault-surface/20 transition-colors">
                <div className="w-6 h-6 rounded-full bg-vault-surface flex items-center justify-center text-[10px]">
                  {log.user?.displayName?.[0] || log.user?.username?.[0] || '?'}
                </div>
                <span className="font-medium text-vault-text">{log.user?.displayName || log.user?.username}</span>
                <span className="text-vault-muted">{log.action}</span>
                {log.details && <span className="text-vault-muted/50">{log.details}</span>}
                <span className="ml-auto text-vault-muted/30">{formatDate(log.createdAt)}</span>
              </div>
            ))}
          </div>
        </div>
      )}

      {/* Analytics Tab */}
      {activeTab === 'analytics' && (
        <div>
          <h3 className="text-sm font-semibold mb-4">Analytics</h3>
          <div className="glass-card p-6 text-center">
            <BarChart3 className="w-12 h-12 text-vault-muted mx-auto mb-3 opacity-30" />
            <p className="text-vault-muted">Analytics dashboard with charts coming soon</p>
            <p className="text-xs text-vault-muted/50 mt-2">
              {stats?.totalUsers} users • {stats?.totalMessages} messages • {stats?.totalFiles} files
            </p>
          </div>
        </div>
      )}
    </div>
  );
}
