'use client';

import React, { useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import { useSession } from 'next-auth/react';
import { 
  Mail, Loader2, AlertCircle, 
  MoreVertical, Settings, Plus as PlusIcon, Trash2, Edit, 
  Inbox, Send, Star, Trash, Plus, ChevronLeft, ChevronRight, 
  Search, ChevronDown, Folder, ChevronUp, Reply, Forward, ReplyAll, 
  MoreHorizontal, FolderOpen, X, Paperclip, MessageSquare, Copy, EyeOff, 
  AlertOctagon, Archive, RefreshCw, Menu
} from 'lucide-react';
import { Dialog, DialogContent, DialogTitle } from '@/components/ui/dialog';
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
import {
  AlertDialog,
  AlertDialogAction,
  AlertDialogCancel,
  AlertDialogContent,
  AlertDialogDescription,
  AlertDialogFooter,
  AlertDialogHeader,
  AlertDialogTitle,
} from "@/components/ui/alert-dialog";
import { ScrollArea } from '@/components/ui/scroll-area';
import { Avatar, AvatarFallback } from '@/components/ui/avatar';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs';
import { Checkbox } from '@/components/ui/checkbox';
import { Label } from '@/components/ui/label';
import { toast } from '@/components/ui/use-toast';
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '@/components/ui/dropdown-menu';

// Import components
import EmailSidebar from '@/components/email/EmailSidebar';
import EmailList from '@/components/email/EmailList';
import EmailSidebarContent from '@/components/email/EmailSidebarContent';
import EmailDetailView from '@/components/email/EmailDetailView';
import ComposeEmail from '@/components/email/ComposeEmail';
import { DeleteConfirmDialog } from '@/components/email/EmailDialogs';

// Import the custom hook
import { useCourrier, EmailData } from '@/hooks/use-courrier';

// Import the prefetching function
import { prefetchFolderEmails } from '@/lib/services/prefetch-service';

// Simplified version for this component
function SimplifiedLoadingFix() {
  // In production, don't render anything
  if (process.env.NODE_ENV === 'production') {
    return null;
  }
  
  // Simple debugging component
  return (
    <div className="fixed bottom-4 right-4 z-50 p-2 bg-white/80 shadow rounded-lg text-xs">
      Debug: Email app loaded
    </div>
  );
}

interface Account {
  id: string;
  name: string;
  email: string;
  color: string;
  folders: string[];
}

interface EmailWithFlags {
  id: string;
  read?: boolean;
  flags?: {
    seen?: boolean;
  };
}

interface EmailMessage {
  id: string;
  from: { name: string; address: string }[];
  to: { name: string; address: string }[];
  subject: string;
  date: Date;
  flags: {
    seen: boolean;
    flagged: boolean;
    answered: boolean;
    draft: boolean;
    deleted: boolean;
  };
  size: number;
  hasAttachments: boolean;
  folder: string;
  contentFetched: boolean;
  accountId: string;
  content: {
    text: string;
    html: string;
  };
}

interface AccountData {
  email: string;
  password: string;
  host: string;
  port: number;
  secure: boolean;
  display_name: string;
  smtp_host?: string;
  smtp_port?: number;
  smtp_secure?: boolean;
}

// Define a color palette for account circles
const colorPalette = [
  'bg-blue-500',
  'bg-green-500',
  'bg-red-500',
  'bg-yellow-500',
  'bg-purple-500',
  'bg-pink-500',
  'bg-indigo-500',
  'bg-teal-500',
  'bg-orange-500',
  'bg-cyan-500',
];

// Helper function for consistent logging
const logEmailOp = (operation: string, details: string, data?: any) => {
  const timestamp = new Date().toISOString().split('T')[1].substring(0, 12);
  console.log(`[${timestamp}][EMAIL-APP][${operation}] ${details}`);
  if (data) {
    console.log(`[${timestamp}][EMAIL-APP][DATA]`, data);
  }
};

export default function CourrierPage() {
  const router = useRouter();
  const { data: session } = useSession();
  
  // Get all the email functionality from the hook
  const {
    emails = [],
    selectedEmail,
    selectedEmailIds,
    currentFolder,
    mailboxes,
    isLoading,
    isSending,
    error,
    searchQuery,
    page,
    totalPages,
    loadEmails,
    handleEmailSelect,
    markEmailAsRead,
    toggleStarred,
    sendEmail,
    deleteEmails,
    toggleEmailSelection,
    toggleSelectAll,
    changeFolder,
    searchEmails,
    formatEmailForAction,
    setPage,
    setEmails,
  } = useCourrier();

  // UI state
  const [showComposeModal, setShowComposeModal] = useState(false);
  const [composeType, setComposeType] = useState<'new' | 'reply' | 'reply-all' | 'forward'>('new');
  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
  const [showLoginNeeded, setShowLoginNeeded] = useState(false);
  const [sidebarOpen, setSidebarOpen] = useState(true);
  const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);
  const [accountsDropdownOpen, setAccountsDropdownOpen] = useState(true);
  const [currentView, setCurrentView] = useState('INBOX');
  const [unreadCount, setUnreadCount] = useState(0);
  const [loading, setLoading] = useState(false);
  const [prefetchStarted, setPrefetchStarted] = useState(false);
  const [showFolders, setShowFolders] = useState(false);
  const [showAddAccountForm, setShowAddAccountForm] = useState(false);
  
  // Email accounts for the sidebar
  const [accounts, setAccounts] = useState<Account[]>([
    { id: 'loading-account', name: 'Loading...', email: '', color: 'bg-blue-500', folders: [] }
  ]);
  const [selectedAccount, setSelectedAccount] = useState<Account | null>(null);
  
  // Track selected folder per account
  const [selectedFolders, setSelectedFolders] = useState<Record<string, string>>({});
  
  // Add state for modals/dialogs
  const [showEditModal, setShowEditModal] = useState(false);
  const [showDeleteDialog, setShowDeleteDialog] = useState(false);
  const [accountToEdit, setAccountToEdit] = useState<Account | null>(null);
  const [accountToDelete, setAccountToDelete] = useState<Account | null>(null);
  const [newPassword, setNewPassword] = useState('');
  const [editLoading, setEditLoading] = useState(false);
  const [deleteLoading, setDeleteLoading] = useState(false);
  
  // Add a type definition for the unreadCount structure to match what EmailSidebar expects
  const [unreadCountMap, setUnreadCountMap] = useState<Record<string, Record<string, number>>>({});
  
  // Calculate unread count for each account and folder
  useEffect(() => {
    // Create a map to store unread counts per account and folder
    const accountFolderUnreadCounts: Record<string, Record<string, number>> = {};
    
    // Initialize counts for all accounts and folders
    accounts.forEach(account => {
      if (account.id !== 'loading-account') {
        accountFolderUnreadCounts[account.id.toString()] = {};
        account.folders.forEach(folder => {
          accountFolderUnreadCounts[account.id.toString()][folder] = 0;
        });
      }
    });
    
    // Count unread emails for each account and folder
    (emails || []).forEach(email => {
      // Check if email is unread based on flags
      const isUnread = email.flags && !email.flags.seen;
      
      // Count unread emails for the specific account and folder
      if (isUnread && email.accountId && email.folder) {
        if (!accountFolderUnreadCounts[email.accountId]) {
          accountFolderUnreadCounts[email.accountId] = {};
        }
        if (!accountFolderUnreadCounts[email.accountId][email.folder]) {
          accountFolderUnreadCounts[email.accountId][email.folder] = 0;
        }
        accountFolderUnreadCounts[email.accountId][email.folder]++;
      }
    });
    
    // Update the unreadCountMap state
    setUnreadCountMap(accountFolderUnreadCounts);
    
    // Update the unread count for the selected account and folder
    if (selectedAccount && selectedAccount.id !== 'loading-account') {
      const folderCounts = accountFolderUnreadCounts[selectedAccount.id.toString()];
      if (folderCounts) {
        setUnreadCount(folderCounts[currentFolder] || 0);
      } else {
        setUnreadCount(0);
      }
    } else {
      // For 'loading-account', sum up all unread counts for the current folder
      let totalUnread = 0;
      Object.values(accountFolderUnreadCounts).forEach((folderCounts) => {
        totalUnread += folderCounts[currentFolder] || 0;
      });
      setUnreadCount(totalUnread);
    }
    
    // Log the counts for debugging
    console.log('Unread counts per account and folder:', 
      Object.fromEntries(
        Object.entries(accountFolderUnreadCounts)
      )
    );
  }, [emails, selectedAccount, currentFolder, accounts]);
  
  // Ensure accounts section is never empty
  useEffect(() => {
    // If accounts array becomes empty (bug), restore default accounts
    if (!accounts || accounts.length === 0) {
      console.warn('Accounts array is empty, restoring defaults');
      setAccounts([
        { id: 'loading-account', name: 'Loading...', email: '', color: 'bg-blue-500', folders: mailboxes }
      ]);
    }
  }, [accounts, mailboxes]);
  
  // Handle initial loading and folder prefetching
  useEffect(() => {
    // Only run if we have a selected account and current folder
    if (selectedAccount && currentFolder && !isLoading) {
      logEmailOp('PREFETCH', `Prefetching emails for folder: ${currentFolder}`);
      
      // Ensure the UI is updated to reflect current selections
      if (selectedAccount.id !== 'loading-account') {
        // Show the current folder as selected
        setSelectedFolders(prev => {
          if (prev[selectedAccount.id] === currentFolder) {
            // Already selected, no need to update
            return prev;
          }
          
          logEmailOp('FOLDER-SELECT', `Updating selected folder for ${selectedAccount.id} to ${currentFolder}`);
          return {
            ...prev,
            [selectedAccount.id]: currentFolder
          };
        });
      }
    }
  }, [selectedAccount, currentFolder, isLoading]);
  
  // Initialize session and start prefetching
  useEffect(() => {
    // Flag to prevent multiple initialization attempts
    let isMounted = true;
    let retryCount = 0;
    const MAX_RETRIES = 3;
    const RETRY_DELAY = 1000; // 1 second

    const initSession = async () => {
      try {
        if (!isMounted) return;
        logEmailOp('SESSION', 'Initializing email session');
        setLoading(true);
        
        // First check if Redis is ready before making API calls
        const redisStatus = await fetch('/api/redis/status')
          .then(res => res.json())
          .catch(() => ({ ready: false }));
        
        if (!isMounted) return;
        
        // Call the session API to check email credentials and start prefetching
        logEmailOp('SESSION', 'Fetching session data from API');
        const response = await fetch('/api/courrier/session', {
          credentials: 'include', // Ensure cookies are sent
          headers: {
            'Content-Type': 'application/json',
          }
        });
        
        // Handle 401 Unauthorized with retry logic
        if (response.status === 401) {
          if (retryCount < MAX_RETRIES) {
            retryCount++;
            console.log(`Session request failed (attempt ${retryCount}/${MAX_RETRIES}), retrying in ${RETRY_DELAY}ms...`);
            await new Promise(resolve => setTimeout(resolve, RETRY_DELAY));
            return initSession();
          } else {
            console.error('Max retries reached for session request');
            // Instead of throwing, redirect to login
            return;
          }
        }

        if (!response.ok) {
          throw new Error(`Session request failed with status ${response.status}`);
        }

        const data = await response.json();
        
        // Log the raw API response to inspect structure
        console.log('[DEBUG] Raw session API response:', JSON.stringify(data, null, 2));

        // Add detailed logging to inspect the accounts and folders structure
        console.log('=== SESSION API RESPONSE DETAILED INSPECTION ===');
        console.log('Session authenticated:', data.authenticated);
        console.log('Has email credentials:', data.hasEmailCredentials);
        console.log('Primary email:', data.email);
        console.log('Redis status:', data.redisStatus);

        // Log mailboxes structure - what the frontend used previously
        console.log('=== MAILBOXES STRUCTURE (OLD API FORMAT) ===');
        console.log('Global mailboxes exists:', !!data.mailboxes);
        console.log('Global mailboxes is array:', Array.isArray(data.mailboxes));
        console.log('Global mailboxes:', data.mailboxes);

        // Log allAccounts structure - the new per-account folders approach
        console.log('=== ALL ACCOUNTS STRUCTURE (NEW API FORMAT) ===');
        console.log('allAccounts exists:', !!data.allAccounts);
        console.log('allAccounts is array:', Array.isArray(data.allAccounts));
        console.log('allAccounts length:', data.allAccounts?.length || 0);

        // Inspect each account's structure
        if (data.authenticated) {
          if (data.hasEmailCredentials) {
            console.log('Session initialized, prefetch status:', data.prefetchStarted ? 'running' : 'not started');
            setPrefetchStarted(Boolean(data.prefetchStarted));
            
            let updatedAccounts: Account[] = [];
            
            // Check if we have multiple accounts returned
            if (data.allAccounts && Array.isArray(data.allAccounts) && data.allAccounts.length > 0) {
              console.log('[DEBUG] Multiple accounts found:', data.allAccounts.length);
              
              // Add all accounts from the API response
              data.allAccounts.forEach((account: any) => {
                console.log('[DEBUG] Processing account:', {
                  id: account.id,
                  email: account.email,
                  folders: account.folders
                });
                
                // Use exact folders from IMAP without any mapping
                const accountFolders = (account.folders && Array.isArray(account.folders)) 
                  ? account.folders 
                  : [];
                
                // Keep the account prefix in folder names
                const validFolders = accountFolders.map((folder: string) => {
                  // If folder doesn't have account prefix, add it
                  if (!folder.includes(':')) {
                    return `${account.id}:${folder}`;
                  }
                  return folder;
                });
                
                updatedAccounts.push({
                  id: account.id,
                  name: account.display_name || account.email,
                  email: account.email,
                  color: colorPalette[(updatedAccounts.length - 1) % colorPalette.length],
                  folders: validFolders
                });
                console.log(`[DEBUG] Added account with folders:`, {
                  id: account.id,
                  email: account.email,
                  folders: validFolders
                });
              });
            } else {
              // Fallback to single account if allAccounts is not available
              console.log(`[DEBUG] Fallback to single account: ${data.email}`);
              
              // Use exact folders from IMAP if available
              const folderList = (data.mailboxes && data.mailboxes.length > 0) ? 
                data.mailboxes : [];
              
              updatedAccounts.push({
                id: 'default-account',
                name: data.displayName || data.email,
                email: data.email,
                color: colorPalette[(updatedAccounts.length - 1) % colorPalette.length],
                folders: folderList
              });
            }
            
            // Update accounts state
            setAccounts(updatedAccounts);
            console.log('[DEBUG] Updated accounts:', updatedAccounts);

            // Auto-select the first account if available
            if (updatedAccounts.length > 0) {
              // Get first real account (index 0)
              const firstAccount = updatedAccounts[0];
              console.log('Auto-selecting first account:', firstAccount);
              
              // Trigger account selection
              setTimeout(() => {
                // Use the same account selection flow we use when user clicks
                if (firstAccount) {
                  // This will handle showing folders and loading emails
                  handleAccountSelect(firstAccount);
                }
              }, 200);
            }
          } else {
            // User is authenticated but doesn't have email credentials
            setShowLoginNeeded(true);
          }
        }
        
        // Preload first page of emails for faster initial rendering
        if (session?.user?.id) {
          await loadEmails();
          
          // If the user hasn't opened this page recently, trigger a background refresh
          if (data.lastVisit && Date.now() - data.lastVisit > 5 * 60 * 1000) {
            // It's been more than 5 minutes, refresh in background
            try {
              const refreshResponse = await fetch('/api/courrier/refresh', { 
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ folder: currentFolder })
              });
              console.log('Background refresh triggered');
            } catch (error) {
              console.error('Failed to trigger background refresh', error);
            }
          }
        }
      } catch (error) {
        console.error('Error initializing session:', error);
      } finally {
        if (isMounted) {
          setLoading(false);
        }
      }
    };
    
    if (session?.user?.id) {
      initSession();
    }
    
    return () => {
      isMounted = false;
    };
  }, [session?.user?.id, loadEmails]);
  
  // Helper to get folder icons
  const getFolderIcon = (folder: string) => {
    const folderLower = folder.toLowerCase();
    
    if (folderLower.includes('inbox')) {
      return <Inbox className="h-4 w-4 text-gray-500" />;
    } else if (folderLower.includes('sent')) {
      return <Send className="h-4 w-4 text-gray-500" />;
    } else if (folderLower.includes('trash')) {
      return <Trash className="h-4 w-4 text-gray-500" />;
    } else if (folderLower.includes('archive')) {
      return <Archive className="h-4 w-4 text-gray-500" />;
    } else if (folderLower.includes('draft')) {
      return <Edit className="h-4 w-4 text-gray-500" />;
    } else if (folderLower.includes('spam') || folderLower.includes('junk')) {
      return <AlertOctagon className="h-4 w-4 text-gray-500" />;
    } else {
      return <Folder className="h-4 w-4 text-gray-500" />;
    }
  };
  
  // Helper to format folder names
  const formatFolderName = (folder: string) => {
    return folder.charAt(0).toUpperCase() + folder.slice(1).toLowerCase();
  };
  
  // Check for more emails
  const hasMoreEmails = page < totalPages;

  // Handle loading more emails on scroll
  const handleLoadMore = () => {
    if (hasMoreEmails && !isLoading) {
      // Increment the page
      const nextPage = page + 1;
      setPage(nextPage);
      
      // Also prefetch additional pages to make scrolling smoother
      if (session?.user?.id) {
        // Prefetch next 2 pages beyond the current next page
        prefetchFolderEmails(
          session.user.id, 
          currentFolder, 
          2, 
          nextPage + 1, 
          selectedAccount?.id
        ).catch(err => {
          console.error(`Error prefetching additional pages for ${currentFolder}:`, err);
        });
      }
      
      // Note: loadEmails will be called automatically due to the page dependency in useEffect
    }
  };

  // Handle bulk actions
  const handleBulkAction = async (action: 'delete' | 'mark-read' | 'mark-unread' | 'archive') => {
    if (selectedEmailIds.length === 0) return;
    
    switch (action) {
      case 'delete':
        setShowDeleteConfirm(true);
        break;
        
      case 'mark-read':
        // Mark all selected emails as read
        for (const emailId of selectedEmailIds) {
          await markEmailAsRead(emailId, true);
        }
        break;
        
      case 'mark-unread':
        // Mark all selected emails as unread
        for (const emailId of selectedEmailIds) {
          await markEmailAsRead(emailId, false);
        }
        break;
        
      case 'archive':
        // Archive functionality would be implemented here
        break;
    }
  };

  // Handle email actions
  const handleReply = () => {
    if (!selectedEmail) return;
    setComposeType('reply');
    setShowComposeModal(true);
  };
  
  const handleReplyAll = () => {
    if (!selectedEmail) return;
    setComposeType('reply-all');
    setShowComposeModal(true);
  };
  
  const handleForward = () => {
    if (!selectedEmail) return;
    setComposeType('forward');
    setShowComposeModal(true);
  };
  
  const handleComposeNew = () => {
    setComposeType('new');
    setShowComposeModal(true);
  };
  
  // Update handleMailboxChange to ensure consistent folder naming and prevent race conditions
  const handleMailboxChange = (folder: string, accountId?: string) => {
    // Enhanced logging to trace the flow
    logEmailOp('MAILBOX-CHANGE', `Starting mailbox change to folder=${folder}, accountId=${accountId || 'undefined'}`);
    
    if (!accountId || accountId === 'loading-account') {
      logEmailOp('MAILBOX-CHANGE', 'No valid accountId provided, using default flow', { folder });
      changeFolder(folder);
      return;
    }

    // Set loading state immediately
    setLoading(true);
    
    // Clear emails during transition
    setEmails([]);
    
    const account = accounts.find(a => a.id.toString() === accountId.toString());
    if (!account) {
      logEmailOp('MAILBOX-CHANGE', `ERROR: Account not found: ${accountId}`);
      toast({
        title: "Account not found",
        description: `The account ${accountId} could not be found.`,
        variant: "destructive",
      });
      setLoading(false);
      return;
    }
    
    logEmailOp('MAILBOX-CHANGE', `Found account: ${account.email}`, { 
      folderCount: account.folders?.length || 0,
      folder: folder
    });

    // Extract the base folder name if it already has an account prefix
    let baseFolder = folder;
    let folderAccountId = null;
    
    if (folder.includes(':')) {
      const parts = folder.split(':');
      folderAccountId = parts[0];
      baseFolder = parts[1];
      
      logEmailOp('MAILBOX-CHANGE', `Parsed folder: accountId=${folderAccountId}, baseFolder=${baseFolder}`);
      
      // CRITICAL FIX: If the folder has an account prefix that doesn't match the requested account,
      // log a warning and ALWAYS use the requested accountId
      if (folderAccountId !== accountId.toString()) {
        logEmailOp('MAILBOX-CHANGE', `WARNING: Folder prefix mismatch - FIXING`, {
          folderAccount: folderAccountId,
          requestedAccount: accountId,
          originalFolder: folder,
          baseFolder: baseFolder
        });
        // Force the correct account ID to be used
        folderAccountId = accountId.toString();
      }
    }
    
    // ALWAYS create a consistent folder name with REQUESTED account prefix
    const prefixedFolder = `${accountId}:${baseFolder}`;
    logEmailOp('MAILBOX-CHANGE', `Normalized folder name: ${prefixedFolder}`);
    
    // CRITICAL FIX: Lock in the selected folder BEFORE changing it in the system
    // This prevents any race conditions where the folder gets reset to INBOX
    setSelectedFolders(prev => {
      const updated = {
        ...prev,
        [accountId]: prefixedFolder
      };
      logEmailOp('MAILBOX-CHANGE', `Updated selected folders map`, updated);
      return updated;
    });
    
    // Call changeFolder with the prefixed folder name and explicit accountId
    // This ensures that both the folder name and accountId parameter are consistent
    changeFolder(prefixedFolder, accountId)
      .then(() => {
        logEmailOp('MAILBOX-CHANGE', `Successfully changed to folder ${prefixedFolder}`);
      })
      .catch(error => {
        logEmailOp('MAILBOX-CHANGE', `ERROR: Failed to change to folder ${prefixedFolder}`, { error });
        toast({
          title: "Error changing folders",
          description: `Failed to change to folder ${baseFolder}. ${error instanceof Error ? error.message : String(error)}`,
          variant: "destructive",
        });
      })
      .finally(() => {
        setLoading(false);
      });
  };

  // Update the folder button rendering to show selected state based on account
  const renderFolderButton = (folder: string, accountId: string) => {
    // Get the account prefix from the folder name
    const folderAccountId = folder.includes(':') ? folder.split(':')[0] : accountId;
    
    // Only show folders that belong to this account
    if (folderAccountId !== accountId) return null;
    
    const isSelected = selectedFolders[accountId] === folder;
    const account = accounts.find(a => a.id === accountId);
    
    // Get the base folder name for display
    const baseFolder = folder.includes(':') ? folder.split(':')[1] : folder;
    
    return (
      <Button
        key={folder}
        variant="ghost"
        className={`w-full justify-start text-xs py-1 h-7 ${isSelected ? 'bg-gray-100' : ''}`}
        onClick={() => handleMailboxChange(folder, accountId)}
      >
        <div className="flex items-center w-full">
          {getFolderIcon(baseFolder)}
          <span className="ml-2 truncate text-gray-700">{formatFolderName(baseFolder)}</span>
          {baseFolder === 'INBOX' && unreadCount > 0 && (
            <span className="ml-auto bg-blue-500 text-white text-[10px] px-1.5 rounded-full">
              {unreadCount}
            </span>
          )}
        </div>
      </Button>
    );
  };

  // Handle sending email
  const handleSendEmail = async (emailData: EmailData) => {
    try {
      const result = await sendEmail(emailData);
      if (!result.success) {
        throw new Error(result.error);
      }
      return result;
    } catch (error) {
      // Handle any errors
      throw error;
    }
  };

  // Handle delete confirmation
  const handleDeleteConfirm = async () => {
    await deleteEmails(selectedEmailIds);
    setShowDeleteConfirm(false);
  };
  
  // Check login on mount
  useEffect(() => {
    // Check if the user is logged in after a short delay
    const timer = setTimeout(() => {
      if (error?.includes('Not authenticated') || error?.includes('No email credentials found')) {
        setShowLoginNeeded(true);
      }
    }, 2000);
    
    return () => clearTimeout(timer);
  }, [error]);

  // Go to login page
  const handleGoToLogin = () => {
    router.push('/courrier/login');
  };

  // Extra debugging for folder rendering
  useEffect(() => {
    if (selectedAccount && showFolders) {
      console.log('Folder rendering debug:',
        'account:', selectedAccount.id,
        'folders:', selectedAccount.folders?.length || 0,
        'showFolders:', showFolders
      );
    }
  }, [selectedAccount, showFolders]);

  const handleAccountSelect = (account: Account) => {
    // Enhanced logging to trace the flow
    logEmailOp('ACCOUNT-SELECT', `Selecting account: ${account.email} (id: ${account.id})`, {
      folderCount: account.folders?.length || 0
    });
    
    // First set loading state to provide visual feedback
    setLoading(true);
    
    // Clear current emails to avoid confusion during transition
    setEmails([]);
    
    // Update selected account
    setSelectedAccount(account);
    logEmailOp('ACCOUNT-SELECT', `Selected account set to: ${account.email}`);
    
    // SIMPLIFIED APPROACH: Instead of trying to find an existing INBOX folder,
    // just create a properly formatted one with the current account ID
    const inboxFolder = `${account.id}:INBOX`;
    logEmailOp('ACCOUNT-SELECT', `Using standardized INBOX folder: ${inboxFolder}`);
    
    // Update the selected folders map with the proper account ID and folder
    setSelectedFolders(prev => {
      const updated = {
        ...prev,
        [account.id]: inboxFolder
      };
      logEmailOp('ACCOUNT-SELECT', `Updated selected folders map`, updated);
      return updated;
    });
    
    // First, show the folders for better UX
    setShowFolders(true);
    
    // Use a slight delay to ensure state updates have propagated before changing folder
    setTimeout(() => {
      logEmailOp('ACCOUNT-SELECT', `Triggering folder change to: ${inboxFolder} for account ${account.id}`);
      
      // Use handleMailboxChange which properly passes the account ID with the folder
      handleMailboxChange(inboxFolder, account.id);
      setLoading(false);
    }, 100);
  };

  const handleAddAccount = async (accountData: AccountData) => {
    // ... account creation logic ...
    // setAccounts(prev => [...prev, newAccount]);
    // setVisibleFolders(prev => ({
    //   ...prev,
    //   [newAccount.id]: newAccount.folders
    // }));
  };

  return (
    <>
      <SimplifiedLoadingFix />
      
      {/* Main layout */}
      <main className="w-full h-screen bg-black">
        <div className="w-full h-full px-4 pt-12 pb-4">
          <div className="flex h-full bg-carnet-bg">
            {/* Use EmailSidebar component instead of inline sidebar */}
            <EmailSidebar
              accounts={accounts}
              selectedAccount={selectedAccount}
              selectedFolders={selectedFolders}
              currentFolder={currentFolder}
              loading={loading}
              unreadCount={unreadCountMap}
              showAddAccountForm={showAddAccountForm}
              onFolderChange={handleMailboxChange}
              onRefresh={() => {
                setLoading(true);
                setPage(1);
                loadEmails().finally(() => setLoading(false));
              }}
              onComposeNew={handleComposeNew}
              onAccountSelect={handleAccountSelect as any}
              onShowAddAccountForm={setShowAddAccountForm}
              onAddAccount={async (formData) => {
                setLoading(true);
                
                // Pull values from form with proper type handling
                const formValues = {
                  email: formData.get('email')?.toString() || '',
                  password: formData.get('password')?.toString() || '',
                  host: formData.get('host')?.toString() || '',
                  port: parseInt(formData.get('port')?.toString() || '993'),
                  secure: formData.get('secure') === 'on',
                  display_name: formData.get('display_name')?.toString() || '',
                  smtp_host: formData.get('smtp_host')?.toString() || '',
                  smtp_port: formData.get('smtp_port')?.toString() ? 
                    parseInt(formData.get('smtp_port')?.toString() || '587') : undefined,
                  smtp_secure: formData.get('smtp_secure') === 'on'
                };
                
                // If display_name is empty, use email
                if (!formValues.display_name) {
                  formValues.display_name = formValues.email;
                }
                
                try {
                  // First test the connection
                  const testResponse = await fetch('/api/courrier/test-connection', {
                    method: 'POST',
                    headers: {
                      'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({
                      email: formValues.email,
                      password: formValues.password,
                      host: formValues.host,
                      port: formValues.port,
                      secure: formValues.secure
                    })
                  });
                  
                  const testResult = await testResponse.json();
                  
                  if (!testResponse.ok) {
                    throw new Error(testResult.error || 'Connection test failed');
                  }
                  
                  console.log('Connection test successful:', testResult);
                  
                  // Only declare realAccounts once before using for color assignment
                  const realAccounts = accounts.filter(a => a.id !== 'loading-account');
                  const saveResponse = await fetch('/api/courrier/account', {
                    method: 'POST',
                    headers: {
                      'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(formValues)
                  });
                  const saveResult = await saveResponse.json();
                  if (!saveResponse.ok) {
                    throw new Error(saveResult.error || 'Failed to add account');
                  }
                  const realAccount = saveResult.account;
                  realAccount.color = colorPalette[realAccounts.length % colorPalette.length];
                  realAccount.folders = testResult.details.sampleFolders || ['INBOX', 'Sent', 'Drafts', 'Trash'];
                  setAccounts(prev => [...prev, realAccount]);
                  setShowAddAccountForm(false);
                  toast({
                    title: "Account added successfully",
                    description: `Your email account ${formValues.email} has been added.`,
                    duration: 5000
                  });
                } catch (error) {
                  console.error('Error adding account:', error);
                  toast({
                    title: "Failed to add account",
                    description: error instanceof Error ? error.message : 'Unknown error',
                    variant: "destructive",
                    duration: 5000
                  });
                } finally {
                  setLoading(false);
                }
              }}
              onEditAccount={(account) => {
                setAccountToEdit(account as any);
                setShowEditModal(true);
              }}
              onDeleteAccount={(account) => {
                setAccountToDelete(account as any); 
                setShowDeleteDialog(true);
              }}
              onSelectEmail={(emailId, accountId, folder) => { 
                if (typeof emailId === 'string') {
                  handleEmailSelect(emailId, accountId || '', folder || currentFolder); 
                }
              }}
              {...({} as any)}
            />

            {/* Panel 2: Email List - Always visible */}
            <div className="w-80 flex flex-col border-r border-gray-100 overflow-hidden">
              {/* Header without search bar or profile */}
              <div className="p-2 border-b border-gray-100 bg-white flex items-center justify-between">
                <Button 
                  variant="ghost" 
                  size="icon"
                  className="md:hidden h-9 w-9"
                  onClick={() => setMobileSidebarOpen(!mobileSidebarOpen)}
                >
                  <Menu className="h-5 w-5 text-gray-500" />
                </Button>
                
                <div className="flex-1">
                  <div className="flex items-center">
                    {getFolderIcon(currentFolder)}
                    {/* Extract base folder and show email as prefix */}
                    <span className="ml-2 font-medium text-gray-700">
                      {selectedAccount?.email ? `${selectedAccount.email}: ` : ''}
                      {formatFolderName(currentFolder.includes(':') ? currentFolder.split(':')[1] : currentFolder)}
                    </span>
                  </div>
                </div>
                
                <div className="flex items-center">
                  {selectedEmailIds.length > 0 && (
                    <div className="flex items-center space-x-1">
                      <Button
                        variant="ghost"
                        size="icon"
                        className="h-8 w-8"
                        onClick={() => handleBulkAction('mark-read')}
                      >
                        <MessageSquare className="h-4 w-4 text-gray-500" />
                      </Button>
                      <Button
                        variant="ghost"
                        size="icon"
                        className="h-8 w-8"
                        onClick={() => handleBulkAction('delete')}
                      >
                        <Trash className="h-4 w-4 text-gray-500" />
                      </Button>
                      <Button
                        variant="ghost"
                        size="icon"
                        className="h-8 w-8"
                        onClick={() => handleBulkAction('archive')}
                      >
                        <Archive className="h-4 w-4 text-gray-500" />
                      </Button>
                    </div>
                  )}
                </div>
              </div>
              
              {/* Email List - Always visible */}
              <div className="flex-1 overflow-hidden bg-white">
                {isLoading ? (
                  <div className="h-full flex items-center justify-center">
                    <div className="flex flex-col items-center">
                      <Loader2 className="h-8 w-8 text-blue-500 animate-spin mb-2" />
                      <p className="text-sm text-gray-500">Loading emails...</p>
                    </div>
                  </div>
                ) : error ? (
                  <div className="h-full flex items-center justify-center">
                    <div className="max-w-md p-4">
                      <Alert variant="destructive">
                        <AlertCircle className="h-4 w-4" />
                        <AlertTitle>Error</AlertTitle>
                        <AlertDescription>
                          {error}
                        </AlertDescription>
                      </Alert>
                    </div>
                  </div>
                ) : (
                  <div className="h-full overflow-hidden flex flex-col">
                    {/* Email List */}
                    <div className="flex-1 overflow-y-auto">
                      {emails.length === 0 ? (
                        <div className="h-full flex items-center justify-center">
                          <div className="text-center p-6">
                            <Inbox className="h-12 w-12 text-gray-300 mx-auto mb-4" />
                            <h3 className="text-lg font-medium text-gray-700">No emails found</h3>
                            <p className="text-sm text-gray-500 mt-1">
                              {searchQuery 
                                ? `No results found for "${searchQuery}"`
                                : `Your ${currentFolder.toLowerCase()} is empty`}
                            </p>
                          </div>
                        </div>
                      ) : (
                        <EmailList 
                          emails={emails} 
                          selectedEmailIds={selectedEmailIds}
                          selectedEmail={selectedEmail}
                          onSelectEmail={(emailId) => handleEmailSelect(emailId, selectedAccount?.id || '', currentFolder)}
                          onToggleSelect={toggleEmailSelection}
                          onToggleSelectAll={toggleSelectAll}
                          onToggleStarred={toggleStarred}
                          onLoadMore={handleLoadMore}
                          hasMoreEmails={page < totalPages}
                          currentFolder={currentFolder}
                          isLoading={isLoading}
                          totalEmails={emails.length}
                          onBulkAction={handleBulkAction}
                        />
                      )}
                    </div>
                  </div>
                )}
              </div>
            </div>

            {/* Panel 3: Email Detail - Always visible */}
            <div className="flex-1 flex flex-col overflow-hidden">
              {/* Content for Panel 3 based on state but always visible */}
              <div className="flex-1 overflow-hidden bg-white">
                {selectedEmail ? (
                  <EmailDetailView 
                    email={selectedEmail as any}
                    onBack={() => {
                      handleEmailSelect('', '', '');
                      // Ensure sidebar stays visible
                      setSidebarOpen(true);
                    }}
                    onReply={handleReply}
                    onReplyAll={handleReplyAll}
                    onForward={handleForward}
                    onToggleStar={() => toggleStarred(selectedEmail.id)}
                  />
                ) : (
                  <div className="h-full flex items-center justify-center">
                    <div className="text-center text-muted-foreground">
                      <p>Select an email to view or</p>
                      <button 
                        className="text-primary mt-2 hover:underline"
                        onClick={() => {
                          setComposeType('new');
                          setShowComposeModal(true);
                        }}
                      >
                        Compose a new message
                      </button>
                    </div>
                  </div>
                )}
              </div>
            </div>
          </div>
        </div>
      </main>

      {/* Modals and Dialogs */}
      <DeleteConfirmDialog 
        show={showDeleteConfirm}
        selectedCount={selectedEmailIds.length}
        onConfirm={handleDeleteConfirm}
        onCancel={() => setShowDeleteConfirm(false)}
      />

      {/* Compose Email Dialog */}
      <Dialog open={showComposeModal} onOpenChange={(open) => !open && setShowComposeModal(false)}>
        <DialogContent className="sm:max-w-[800px] p-0 h-[80vh]">
          <DialogTitle asChild>
            <span className="sr-only">New Message</span>
          </DialogTitle>
          <ComposeEmail 
            type={composeType}
            initialEmail={composeType !== 'new' ? (selectedEmail as any) : undefined}
            onSend={async (emailData) => {
              try {
                const result = await sendEmail(emailData);
                return;
              } catch (error) {
                console.error('Error sending email:', error);
                throw error;
              }
            }}
            onClose={() => setShowComposeModal(false)}
          />
        </DialogContent>
      </Dialog>

      {/* Edit Password Modal */}
      <Dialog open={showEditModal} onOpenChange={open => { if (!open) setShowEditModal(false); }}>
        <DialogContent className="sm:max-w-[400px]">
          <DialogTitle>Edit Account Password</DialogTitle>
          <form onSubmit={async e => {
            e.preventDefault();
            if (!accountToEdit) return;
            setEditLoading(true);
            try {
              const res = await fetch('/api/courrier/account', {
                method: 'PATCH',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ accountId: accountToEdit.id, newPassword }),
              });
              const data = await res.json();
              if (!res.ok) throw new Error(data.error || 'Failed to update password');
              toast({ title: 'Password updated', description: 'Password changed successfully.' });
              setShowEditModal(false);
              setNewPassword('');
              window.location.reload();
            } catch (err) {
              toast({ title: 'Error', description: err instanceof Error ? err.message : 'Failed to update password', variant: 'destructive' });
            } finally {
              setEditLoading(false);
            }
          }}>
            <div className="mb-2">
              <Label htmlFor="new-password">New Password</Label>
              <Input id="new-password" type="password" value={newPassword} onChange={e => setNewPassword(e.target.value)} required className="mt-1" />
            </div>
            <div className="flex justify-end gap-2 mt-4">
              <Button type="button" variant="outline" onClick={() => setShowEditModal(false)}>Cancel</Button>
              <Button type="submit" disabled={editLoading}>{editLoading ? <Loader2 className="h-4 w-4 animate-spin" /> : 'Save'}</Button>
            </div>
          </form>
        </DialogContent>
      </Dialog>

      {/* Delete Account Dialog */}
      <AlertDialog open={showDeleteDialog} onOpenChange={open => { if (!open) setShowDeleteDialog(false); }}>
        <AlertDialogContent>
          <AlertDialogHeader>
            <AlertDialogTitle>Delete Account</AlertDialogTitle>
            <AlertDialogDescription>
              Are you sure you want to delete this account? This action cannot be undone.
            </AlertDialogDescription>
          </AlertDialogHeader>
          <AlertDialogFooter>
            <AlertDialogCancel onClick={() => setShowDeleteDialog(false)}>Cancel</AlertDialogCancel>
            <AlertDialogAction asChild>
              <Button variant="destructive" disabled={deleteLoading} onClick={async () => {
                if (!accountToDelete) return;
                setDeleteLoading(true);
                try {
                  const res = await fetch(`/api/courrier/account?accountId=${accountToDelete.id}`, { method: 'DELETE' });
                  const data = await res.json();
                  if (!res.ok) throw new Error(data.error || 'Failed to delete account');
                  toast({ title: 'Account deleted', description: 'The account was deleted successfully.' });
                  setShowDeleteDialog(false);
                  window.location.reload();
                } catch (err) {
                  toast({ title: 'Error', description: err instanceof Error ? err.message : 'Failed to delete account', variant: 'destructive' });
                } finally {
                  setDeleteLoading(false);
                }
              }}>Delete</Button>
            </AlertDialogAction>
          </AlertDialogFooter>
        </AlertDialogContent>
      </AlertDialog>
    </>
  );
}