'use client';

import { useEffect, useState, useMemo, useCallback, useRef } from 'react';
import { useRouter } from 'next/navigation';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Button } from '@/components/ui/button';
import { Label } from '@/components/ui/label';
import { Textarea } from '@/components/ui/textarea';
import { Checkbox } from '@/components/ui/checkbox';
import {
  AlertDialog,
  AlertDialogAction,
  AlertDialogCancel,
  AlertDialogContent,
  AlertDialogDescription,
  AlertDialogFooter,
  AlertDialogHeader,
  AlertDialogTitle,
} from "@/components/ui/alert-dialog";
import { Avatar, AvatarFallback } from '@/components/ui/avatar';
import { 
  MoreVertical, Settings, Plus as PlusIcon, Trash2, Edit, Mail, 
  Inbox, Send, Star, Trash, Plus, ChevronLeft, ChevronRight, 
  Search, ChevronDown, Folder, ChevronUp, Reply, Forward, ReplyAll, 
  MoreHorizontal, FolderOpen, X, Paperclip, MessageSquare, Copy, EyeOff, 
  AlertOctagon, Archive, RefreshCw
} from 'lucide-react';
import { ScrollArea } from '@/components/ui/scroll-area';
import { useSession } from 'next-auth/react';
import DOMPurify from 'isomorphic-dompurify';
import ComposeEmail from '@/components/ComposeEmail';
import { decodeEmail, cleanHtml } from '@/lib/mail-parser-wrapper';
import { Attachment as MailParserAttachment } from 'mailparser';

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

export interface Email {
  id: string;
  from: string;
  fromName?: string;
  to: string;
  subject: string;
  content: string;
  body?: string;  // For backward compatibility
  textContent?: string;
  rawContent?: string;  // Raw email content for fallback display
  date: string;
  read: boolean;
  starred: boolean;
  attachments?: { name: string; url: string }[];
  folder: string;
  cc?: string;
}

interface Attachment {
  name: string;
  type: string;
  content: string;
  encoding: string;
}

interface ParsedEmailContent {
  headers: string;
  body: string;
  html?: string;
  text?: string;
  attachments?: Array<{
    filename: string;
    content: string;
    contentType: string;
  }>;
}

interface ParsedEmailMetadata {
  subject: string;
  from: string;
  to: string;
  date: string;
  contentType: string;
  text: string | null;
  html: string | null;
  raw: {
    headers: string;
    body: string;
  };
}

function splitEmailHeadersAndBody(emailBody: string): { headers: string; body: string } {
  const [headers, ...bodyParts] = emailBody.split('\r\n\r\n');
  return {
    headers: headers || '',
    body: bodyParts.join('\r\n\r\n')
  };
}

function EmailContent({ email }: { email: Email }) {
  // Improved debugging with more details
  console.log("EmailContent rendering with EMAIL OBJECT:", email);
  console.log("Content details:", {
    hasContent: Boolean(email.content),
    contentLength: email.content?.length || 0,
    contentType: typeof email.content,
    hasTextContent: Boolean(email.textContent),
    textContentLength: email.textContent?.length || 0,
    textContentType: typeof email.textContent,
    hasRawContent: Boolean(email.rawContent),
    rawContentLength: email.rawContent?.length || 0,
    hasBody: Boolean(email.body),
    bodyLength: email.body?.length || 0
  });

  // Use state to track if we've rendered content
  const [renderedContent, setRenderedContent] = useState<boolean>(false);
  
  // Special handling for potential nested content structure
  const content = typeof email.content === 'object' 
    ? JSON.stringify(email.content) 
    : email.content;
    
  const textContent = typeof email.textContent === 'object'
    ? JSON.stringify(email.textContent)
    : email.textContent;
    
  const rawContent = typeof email.rawContent === 'object'
    ? JSON.stringify(email.rawContent)
    : email.rawContent;
    
  const body = typeof email.body === 'object'
    ? JSON.stringify(email.body)
    : email.body;
  
  // Use a more defensive approach with content
  const hasContent = content !== undefined && content !== null && content.trim() !== '';
  const hasTextContent = textContent !== undefined && textContent !== null && textContent.trim() !== '';
  const hasRawContent = rawContent !== undefined && rawContent !== null && rawContent.trim() !== '';
  const hasBody = body !== undefined && body !== null && body.trim() !== '';
  
  // If textContent is available, render it directly
  if (hasTextContent && !renderedContent) {
    setRenderedContent(true);
    return (
      <div className="email-content whitespace-pre-wrap">
        {textContent}
      </div>
    );
  }
  
  // If html content is available, render it directly
  if (hasContent && !renderedContent) {
    setRenderedContent(true);
    return (
      <div 
        className="email-content prose prose-sm max-w-none dark:prose-invert"
        dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(content) }}
      />
    );
  }
  
  // Try body field (backward compatibility)
  if (hasBody && !renderedContent) {
    setRenderedContent(true);
    return (
      <div 
        className="email-content prose prose-sm max-w-none dark:prose-invert"
        dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(body) }}
      />
    );
  }
  
  // Fallback to raw content if available
  if (hasRawContent && !renderedContent) {
    setRenderedContent(true);
    return (
      <div className="email-content whitespace-pre-wrap text-sm bg-gray-50 p-3 rounded">
        {rawContent}
      </div>
    );
  }
  
  // Last resort - show a better error message with debugging info
  return (
    <div className="text-gray-500">
      <p>No content available</p>
      <div className="mt-2 p-2 bg-red-50 text-red-700 text-xs rounded">
        <p>Content flags:</p>
        <p>- Has content: {hasContent ? 'Yes' : 'No'} (type: {typeof email.content})</p>
        <p>- Has text content: {hasTextContent ? 'Yes' : 'No'} (type: {typeof email.textContent})</p>
        <p>- Has raw content: {hasRawContent ? 'Yes' : 'No'} (type: {typeof email.rawContent})</p>
        <p>- Has body: {hasBody ? 'Yes' : 'No'} (type: {typeof email.body})</p>
      </div>
    </div>
  );
}

function renderEmailContent(email: Email) {
  if (!email) return <div className="text-gray-500">No email selected</div>;
  
  return <EmailContent email={email} />;
}

function renderAttachments(attachments: MailParserAttachment[]) {
  if (!attachments.length) return null;

  return (
    <div className="mt-4 border-t border-gray-200 pt-4">
      <h3 className="text-sm font-medium text-gray-900 mb-2">Attachments</h3>
      <div className="space-y-2">
        {attachments.map((attachment, index) => (
          <div key={index} className="flex items-center gap-2 p-2 bg-gray-50 rounded">
            <Paperclip className="h-4 w-4 text-gray-400" />
            <span className="text-sm text-gray-600">{attachment.filename || 'unnamed_attachment'}</span>
            <span className="text-xs text-gray-400">
              {attachment.size ? `(${Math.round(attachment.size / 1024)} KB)` : ''}
            </span>
          </div>
        ))}
      </div>
    </div>
  );
}

// Define the exact folder names from IMAP
type MailFolder = string;

// Map IMAP folders to sidebar items with icons
const getFolderIcon = (folder: string) => {
  switch (folder.toLowerCase()) {
    case 'inbox':
      return Inbox;
    case 'sent':
      return Send;
    case 'drafts':
      return Edit;
    case 'trash':
      return Trash;
    case 'spam':
      return AlertOctagon;
    case 'archive':
    case 'archives':
      return Archive;
    default:
      return Folder;
  }
};

// Initial sidebar items - only INBOX
const initialSidebarItems = [
  {
    view: 'INBOX' as MailFolder,
    label: 'Inbox',
    icon: Inbox,
    folder: 'INBOX'
  }
];

function formatDate(date: Date | null): string {
  if (!date) return '';
  return new Intl.DateTimeFormat('fr-FR', {
    day: '2-digit',
    month: '2-digit',
    year: 'numeric',
    hour: '2-digit',
    minute: '2-digit'
  }).format(date);
}

function ReplyContent({ email, type }: { email: Email; type: 'reply' | 'reply-all' | 'forward' }) {
  const [content, setContent] = useState<string>('');
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    let mounted = true;

    async function loadReplyContent() {
      try {
        if (!email.content) {
          if (mounted) setContent('');
          return;
        }

        const decoded = await decodeEmail(email.content);
        
        if (mounted) {
          let formattedContent = '';
          
          if (type === 'forward') {
            formattedContent = `
              <div class="forwarded-message">
                <p>---------- Forwarded message ---------</p>
                <p>From: ${decoded.from || ''}</p>
                <p>Date: ${formatDate(decoded.date ? new Date(decoded.date) : null)}</p>
                <p>Subject: ${decoded.subject || ''}</p>
                <p>To: ${decoded.to || ''}</p>
                <br>
                ${decoded.html || `<pre>${decoded.text || ''}</pre>`}
              </div>
            `;
          } else {
            formattedContent = `
              <div class="quoted-message">
                <p>On ${formatDate(decoded.date ? new Date(decoded.date) : null)}, ${decoded.from || ''} wrote:</p>
                <blockquote>
                  ${decoded.html || `<pre>${decoded.text || ''}</pre>`}
                </blockquote>
              </div>
            `;
          }

          setContent(formattedContent);
          setError(null);
        }
      } catch (err) {
        console.error('Error generating reply body:', err);
        if (mounted) {
          setError('Error generating reply content. Please try again.');
          setContent('');
        }
      }
    }

    loadReplyContent();

    return () => {
      mounted = false;
    };
  }, [email.content, type]);

  if (error) {
    return <div className="text-red-500">{error}</div>;
  }

  return <div dangerouslySetInnerHTML={{ __html: content }} />;
}

// Update the getReplyBody function to use the new component
function getReplyBody(email: Email, type: 'reply' | 'reply-all' | 'forward' = 'reply') {
  return <ReplyContent email={email} type={type} />;
}

function EmailPreview({ email }: { email: Email }) {
  const [preview, setPreview] = useState<string>('');
  const [error, setError] = useState<string | null>(null);
  const [isLoading, setIsLoading] = useState(false);

  useEffect(() => {
    let mounted = true;

    async function loadPreview() {
      if (!email?.content) {
        if (mounted) setPreview('No content available');
        return;
      }

      setIsLoading(true);
      try {
        const decoded = await decodeEmail(email.content);
        if (mounted) {
          if (decoded.text) {
            setPreview(decoded.text.substring(0, 150) + '...');
          } else if (decoded.html) {
            const cleanText = decoded.html.replace(/<[^>]*>/g, ' ').trim();
            setPreview(cleanText.substring(0, 150) + '...');
          } else {
            setPreview('No preview available');
          }
          setError(null);
        }
      } catch (err) {
        console.error('Error generating email preview:', err);
        if (mounted) {
          setError('Error generating preview');
          setPreview('');
        }
      } finally {
        if (mounted) setIsLoading(false);
      }
    }

    loadPreview();

    return () => {
      mounted = false;
    };
  }, [email?.content]);

  if (isLoading) {
    return <span className="text-gray-400">Loading preview...</span>;
  }

  if (error) {
    return <span className="text-red-500 text-xs">{error}</span>;
  }

  return <span className="text-xs text-gray-500 line-clamp-2">{preview}</span>;
}

// Update the generateEmailPreview function to use the new component
function generateEmailPreview(email: Email) {
  return <EmailPreview email={email} />;
}

export default function CourrierPage() {
  const router = useRouter();
  const { data: session } = useSession();
  const [loading, setLoading] = useState(true);
  const [accounts, setAccounts] = useState<Account[]>([
    { id: 0, name: 'All', email: '', color: 'bg-gray-500' },
    { id: 1, name: 'Mail', email: 'alma@governance-labs.org', color: 'bg-blue-500' }
  ]);
  const [selectedAccount, setSelectedAccount] = useState<Account | null>(null);
  const [currentView, setCurrentView] = useState<MailFolder>('INBOX');
  const [showCompose, setShowCompose] = useState(false);
  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
  const [selectedEmails, setSelectedEmails] = useState<string[]>([]);
  const [showBulkActions, setShowBulkActions] = useState(false);
  const [showBcc, setShowBcc] = useState(false);
  const [emails, setEmails] = useState<Email[]>([]);
  const [error, setError] = useState<string | null>(null);
  const [composeSubject, setComposeSubject] = useState('');
  const [composeTo, setComposeTo] = useState('');
  const [composeCc, setComposeCc] = useState('');
  const [composeBcc, setComposeBcc] = useState('');
  const [composeBody, setComposeBody] = useState('');
  const [selectedEmail, setSelectedEmail] = useState<Email | null>(null);
  const [sidebarOpen, setSidebarOpen] = useState(true);
  const [foldersOpen, setFoldersOpen] = useState(true);
  const [showSettings, setShowSettings] = useState(false);
  const [searchQuery, setSearchQuery] = useState('');
  const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);
  const [composeOpen, setComposeOpen] = useState(false);
  const [accountsDropdownOpen, setAccountsDropdownOpen] = useState(false);
  const [foldersDropdownOpen, setFoldersDropdownOpen] = useState(false);
  const [showAccountActions, setShowAccountActions] = useState<number | null>(null);
  const [showEmailActions, setShowEmailActions] = useState(false);
  const [deleteType, setDeleteType] = useState<'email' | 'emails' | 'account'>('email');
  const [itemToDelete, setItemToDelete] = useState<number | null>(null);
  const [showCc, setShowCc] = useState(false);
  const [contentLoading, setContentLoading] = useState(false);
  const [attachments, setAttachments] = useState<Attachment[]>([]);
  const [folders, setFolders] = useState<string[]>([]);
  const [unreadCount, setUnreadCount] = useState(0);
  const [availableFolders, setAvailableFolders] = useState<string[]>([]);
  const [sidebarItems, setSidebarItems] = useState(initialSidebarItems);
  const [page, setPage] = useState(1);
  const [hasMore, setHasMore] = useState(true);
  const [isLoadingMore, setIsLoadingMore] = useState(false);
  const [isLoadingInitial, setIsLoadingInitial] = useState(true);
  const [isLoadingSearch, setIsLoadingSearch] = useState(false);
  const [isLoadingCompose, setIsLoadingCompose] = useState(false);
  const [isLoadingReply, setIsLoadingReply] = useState(false);
  const [isLoadingForward, setIsLoadingForward] = useState(false);
  const [isLoadingDelete, setIsLoadingDelete] = useState(false);
  const [isLoadingMove, setIsLoadingMove] = useState(false);
  const [isLoadingStar, setIsLoadingStar] = useState(false);
  const [isLoadingUnstar, setIsLoadingUnstar] = useState(false);
  const [isLoadingMarkRead, setIsLoadingMarkRead] = useState(false);
  const [isLoadingMarkUnread, setIsLoadingMarkUnread] = useState(false);
  const [isLoadingRefresh, setIsLoadingRefresh] = useState(false);
  const emailsPerPage = 20;
  const [isSearching, setIsSearching] = useState(false);
  const [searchResults, setSearchResults] = useState<Email[]>([]);
  const [showSearchResults, setShowSearchResults] = useState(false);
  const [isComposing, setIsComposing] = useState(false);
  const [composeEmail, setComposeEmail] = useState({
    to: '',
    subject: '',
    body: '',
  });
  const [isSending, setIsSending] = useState(false);
  const [isReplying, setIsReplying] = useState(false);
  const [isForwarding, setIsForwarding] = useState(false);
  const [replyToEmail, setReplyToEmail] = useState<Email | null>(null);
  const [forwardEmail, setForwardEmail] = useState<Email | null>(null);
  const [replyBody, setReplyBody] = useState('');
  const [forwardBody, setForwardBody] = useState('');
  const [replyAttachments, setReplyAttachments] = useState<File[]>([]);
  const [forwardAttachments, setForwardAttachments] = useState<File[]>([]);
  const [isSendingReply, setIsSendingReply] = useState(false);
  const [isSendingForward, setIsSendingForward] = useState(false);
  const [isDeleting, setIsDeleting] = useState(false);
  const [isMoving, setIsMoving] = useState(false);
  const [isStarring, setIsStarring] = useState(false);
  const [isUnstarring, setIsUnstarring] = useState(false);
  const [isMarkingRead, setIsMarkingRead] = useState(false);
  const [isMarkingUnread, setIsMarkingUnread] = useState(false);
  const [isRefreshing, setIsRefreshing] = useState(false);
  const composeBodyRef = useRef<HTMLDivElement>(null);
  const [originalEmail, setOriginalEmail] = useState<{
    content: string;
    type: 'reply' | 'reply-all' | 'forward';
  } | null>(null);
  const [selectEmailLoading, setSelectEmailLoading] = useState(false);

  // Debug logging for email distribution
  useEffect(() => {
    const emailsByFolder = emails.reduce((acc, email) => {
      acc[email.folder] = (acc[email.folder] || 0) + 1;
      return acc;
    }, {} as Record<string, number>);
    
    console.log('Emails by folder:', emailsByFolder);
    console.log('Current view:', currentView);
  }, [emails, currentView]);

  // Move getSelectedEmail inside the component
  const getSelectedEmail = () => {
    return emails.find(email => email.id === selectedEmail?.id);
  };

  // Check for stored credentials
  useEffect(() => {
    const checkCredentials = async () => {
      try {
        console.log('Checking for stored credentials...');
        const response = await fetch('/api/courrier');
        if (!response.ok) {
          const errorData = await response.json();
          console.log('API response error:', errorData);
          if (errorData.error === 'No stored credentials found') {
            console.log('No credentials found, redirecting to login...');
            router.push('/courrier/login');
            return;
          }
          throw new Error(errorData.error || 'Failed to check credentials');
        }
        console.log('Credentials verified, loading emails...');
        setLoading(false);
        loadEmails();
      } catch (err) {
        console.error('Error checking credentials:', err);
        setError(err instanceof Error ? err.message : 'Failed to check credentials');
        setLoading(false);
      }
    };

    checkCredentials();
  }, [router]);

  // Update the loadEmails function
  const loadEmails = async (isLoadMore = false) => {
    try {
      if (isLoadMore) {
        setIsLoadingMore(true);
      } else {
        setLoading(true);
      }
      setError(null);
      
      const response = await fetch(`/api/courrier?folder=${encodeURIComponent(currentView)}&page=${page}&limit=${emailsPerPage}`);
      if (!response.ok) {
        throw new Error('Failed to load emails');
      }
      
      const data = await response.json();
      
      // Get available folders from the API response
      if (data.folders) {
        setAvailableFolders(data.folders);
      }
      
      // Process emails keeping exact folder names and sort by date
      const processedEmails = (data.emails || [])
        .map((email: any) => ({
          id: Number(email.id),
          accountId: 1,
          from: email.from || '',
          fromName: email.fromName || email.from?.split('@')[0] || '',
          to: email.to || '',
          subject: email.subject || '(No subject)',
          body: email.body || '',
          date: email.date || new Date().toISOString(),
          read: email.read || false,
          starred: email.starred || false,
          folder: email.folder || currentView,
          cc: email.cc,
          bcc: email.bcc,
          flags: email.flags || [],
          raw: email.body || ''
        }));

      // Sort emails by date, ensuring most recent first
      const sortedEmails = processedEmails.sort((a: Email, b: Email) => {
        const dateA = new Date(a.date).getTime();
        const dateB = new Date(b.date).getTime();
        return dateB - dateA; // Most recent first
      });

      // Only update unread count if we're in the Inbox folder
      if (currentView === 'INBOX') {
        const unreadInboxEmails = sortedEmails.filter(
          (email: Email) => !email.read && email.folder === 'INBOX'
        ).length;
        setUnreadCount(unreadInboxEmails);
      }
      
      if (isLoadMore) {
        // When loading more, merge with existing emails and re-sort
        setEmails(prev => {
          const combined = [...prev, ...sortedEmails];
          return combined.sort((a: Email, b: Email) => {
            const dateA = new Date(a.date).getTime();
            const dateB = new Date(b.date).getTime();
            return dateB - dateA; // Most recent first
          });
        });
        setPage(prev => prev + 1);
      } else {
        // For initial load or refresh, just use the sorted emails
        setEmails(sortedEmails);
        setPage(1);
      }

      // Update hasMore based on API response
      setHasMore(data.hasMore || false);
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Failed to load emails');
    } finally {
      setLoading(false);
      setIsLoadingMore(false);
    }
  };

  // Add an effect to reload emails when the view changes
  useEffect(() => {
    setPage(1); // Reset page when view changes
    setHasMore(true);
    loadEmails();
  }, [currentView]);

  // Get account color
  const getAccountColor = (accountId: number) => {
    const account = accounts.find(acc => acc.id === accountId);
    return account ? account.color : 'bg-gray-500';
  };

  // Update handleEmailSelect to set selectedEmail correctly and improve error handling
  const handleEmailSelect = async (emailId: string) => {
    try {
      // Set a provisional selected email immediately for better UX
      const initialEmail = emails.find((e) => e.id === emailId) || null;
      setSelectedEmail(initialEmail);
      setSelectEmailLoading(true);

      console.log(`Fetching email ${emailId} from folder ${currentView}`);
      const response = await fetch(`/api/courrier/${emailId}?folder=${currentView}`);
      
      if (!response.ok) {
        console.error(`Error fetching email: ${response.status} ${response.statusText}`);
        setSelectEmailLoading(false);
        return;
      }
      
      // Get the raw JSON string first to log it exactly as received
      const rawJsonText = await response.text();
      console.log("Raw API response text:", rawJsonText);
      
      // Then parse it
      let fullEmail;
      try {
        fullEmail = JSON.parse(rawJsonText);
        console.log("Parsed JSON API response:", fullEmail);
      } catch (jsonError) {
        console.error("Error parsing JSON response:", jsonError);
        setSelectEmailLoading(false);
        return;
      }
      
      // Create a clean, processed version of the email ensuring all necessary fields exist
      const processedEmail = {
        ...fullEmail,
        id: fullEmail.id || emailId,
        content: typeof fullEmail.content === 'string' ? fullEmail.content : '',
        textContent: typeof fullEmail.textContent === 'string' ? fullEmail.textContent : '',
        rawContent: typeof fullEmail.rawContent === 'string' ? fullEmail.rawContent : '',
        body: typeof fullEmail.body === 'string' ? fullEmail.body : '',
        from: fullEmail.from || initialEmail?.from || '',
        fromName: fullEmail.fromName || initialEmail?.fromName || '',
        to: fullEmail.to || initialEmail?.to || '',
        subject: fullEmail.subject || initialEmail?.subject || '(No subject)',
        date: fullEmail.date || initialEmail?.date || new Date().toISOString(),
        read: fullEmail.read !== undefined ? fullEmail.read : true,
        folder: fullEmail.folder || currentView
      };
      
      console.log("Processed email for UI:", {
        ...processedEmail,
        contentLength: processedEmail.content.length,
        textContentLength: processedEmail.textContent.length,
        rawContentLength: processedEmail.rawContent.length
      });
      
      // Set the selected email with complete information
      setSelectedEmail(processedEmail);
      
      // Update the email in the list to mark it as read
      setEmails((prevEmails) =>
        prevEmails.map((email) =>
          email.id === emailId ? { ...email, read: true } : email
        )
      );
      
      // Try to mark the email as read in the background
      try {
        const markReadResponse = await fetch(`/api/mail/mark-read?id=${emailId}&folder=${currentView}`, {
          method: "POST",
        });
        
        if (!markReadResponse.ok) {
          console.error(`Error marking email as read: ${markReadResponse.status} ${markReadResponse.statusText}`);
        }
      } catch (markReadError) {
        console.error("Error calling mark-read API:", markReadError);
      }
      
      setSelectEmailLoading(false);
    } catch (error) {
      console.error("Error in handleEmailSelect:", error);
      setSelectEmailLoading(false);
    }
  };

  // Add these improved handlers
  const handleEmailCheckbox = (e: React.ChangeEvent<HTMLInputElement>, emailId: number) => {
    e.stopPropagation();
    if (e.target.checked) {
      setSelectedEmails([...selectedEmails, emailId.toString()]);
    } else {
      setSelectedEmails(selectedEmails.filter(id => id !== emailId.toString()));
    }
  };

  // Handles marking an individual email as read/unread
  const handleMarkAsRead = (emailId: string, isRead: boolean) => {
    setEmails(emails.map(email =>
      email.id.toString() === emailId ? { ...email, read: isRead } : email
    ));
  };

  // Handles bulk actions for selected emails
  const handleBulkAction = async (action: 'delete' | 'mark-read' | 'mark-unread' | 'archive') => {
    if (action === 'delete') {
      setDeleteType('emails');
      setShowDeleteConfirm(true);
      return;
    }

    try {
      const response = await fetch('/api/courrier/bulk-actions', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          emailIds: selectedEmails,
          action: action
        }),
      });

      if (!response.ok) {
        throw new Error('Failed to perform bulk action');
      }

      // Update local state based on the action
      setEmails(emails.map(email => {
        if (selectedEmails.includes(email.id.toString())) {
          switch (action) {
            case 'mark-read':
              return { ...email, read: true };
            case 'mark-unread':
              return { ...email, read: false };
            case 'archive':
              return { ...email, folder: 'Archive' };
            default:
              return email;
          }
        }
        return email;
      }));

      // Clear selection after successful action
      setSelectedEmails([]);
    } catch (error) {
      console.error('Error performing bulk action:', error);
      alert('Failed to perform bulk action. Please try again.');
    }
  };

  // Add handleDeleteConfirm function
  const handleDeleteConfirm = async () => {
    try {
      const response = await fetch('/api/courrier/bulk-actions', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          emailIds: selectedEmails,
          action: 'delete'
        }),
      });

      if (!response.ok) {
        throw new Error('Failed to delete emails');
      }

      // Remove deleted emails from state
      setEmails(emails.filter(email => !selectedEmails.includes(email.id.toString())));
      setSelectedEmails([]);
    } catch (error) {
      console.error('Error deleting emails:', error);
      alert('Failed to delete emails. Please try again.');
    } finally {
      setShowDeleteConfirm(false);
    }
  };

  // Add infinite scroll handler
  const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {
    const target = e.currentTarget;
    if (
      target.scrollHeight - target.scrollTop === target.clientHeight &&
      !isLoadingMore &&
      hasMore
    ) {
      setPage(prev => prev + 1);
      loadEmails(true);
    }
  }, [isLoadingMore, hasMore]);

  // Sort emails by date (most recent first)
  const sortedEmails = useMemo(() => {
    return [...emails].sort((a, b) => {
      return new Date(b.date).getTime() - new Date(a.date).getTime();
    });
  }, [emails]);

  const toggleSelectAll = () => {
    if (selectedEmails.length === emails.length) {
      setSelectedEmails([]);
    } else {
      setSelectedEmails(emails.map(email => email.id.toString()));
    }
  };

  // Update filtered emails to use sortedEmails
  const filteredEmails = useMemo(() => {
    if (!searchQuery) return sortedEmails;
    
    const query = searchQuery.toLowerCase();
    return sortedEmails.filter(email => 
      email.subject.toLowerCase().includes(query) ||
      email.from.toLowerCase().includes(query) ||
      email.to.toLowerCase().includes(query) ||
      email.content.toLowerCase().includes(query)
    );
  }, [sortedEmails, searchQuery]);

  // Update the email list to use filtered emails
  const renderEmailList = () => (
    <div className="w-[320px] bg-white/95 backdrop-blur-sm border-r border-gray-100 flex flex-col">
      {renderEmailListHeader()}
      {renderBulkActionsToolbar()}
      
      <div 
        className="flex-1 overflow-y-auto"
        onScroll={handleScroll}
      >
        {loading ? (
          <div className="flex items-center justify-center h-64">
            <div className="animate-spin rounded-full h-8 w-8 border-t-2 border-b-2 border-blue-500"></div>
          </div>
        ) : filteredEmails.length === 0 ? (
          <div className="flex flex-col items-center justify-center h-64">
            <Mail className="h-8 w-8 text-gray-400 mb-2" />
            <p className="text-gray-500 text-sm">
              {searchQuery ? 'No emails match your search' : 'No emails in this folder'}
            </p>
          </div>
        ) : (
          <div className="divide-y divide-gray-100">
            {filteredEmails.map((email) => renderEmailListItem(email))}
            {isLoadingMore && (
              <div className="flex items-center justify-center p-4">
                <div className="animate-spin rounded-full h-4 w-4 border-t-2 border-b-2 border-blue-500"></div>
              </div>
            )}
          </div>
        )}
      </div>
    </div>
  );

  // Update the email count in the header to show filtered count
  const renderEmailListHeader = () => (
    <div className="border-b border-gray-100">
      <div className="px-4 py-3">
        <div className="relative">
          <Search className="absolute left-2 top-2 h-4 w-4 text-gray-400" />
          <Input
            type="search"
            placeholder="Search in folder..."
            className="pl-8 h-8 bg-gray-50"
            value={searchQuery}
            onChange={(e) => setSearchQuery(e.target.value)}
          />
        </div>
      </div>
      <div className="flex items-center justify-between px-4 h-10">
        <div className="flex items-center gap-2">
          <Checkbox
            checked={filteredEmails.length > 0 && selectedEmails.length === filteredEmails.length}
            onCheckedChange={toggleSelectAll}
            className="mt-0.5"
          />
          <h2 className="text-base font-semibold text-gray-900">
            {currentView.charAt(0).toUpperCase() + currentView.slice(1).toLowerCase()}
          </h2>
        </div>
        <span className="text-sm text-gray-600">
          {searchQuery ? `${filteredEmails.length} of ${emails.length} emails` : `${emails.length} emails`}
        </span>
      </div>
    </div>
  );

  // Update the bulk actions toolbar to include confirmation dialog
  const renderBulkActionsToolbar = () => {
    if (selectedEmails.length === 0) return null;

    return (
      <div className="bg-white border-b border-gray-100 px-4 py-2">
        <div className="flex items-center gap-2 mb-2">
          <span className="text-sm text-gray-600">
            {selectedEmails.length} selected
          </span>
        </div>
        <div className="flex items-center gap-1.5">
          <Button
            variant="ghost"
            size="sm"
            className="text-gray-600 hover:text-gray-900 h-8 px-2"
            onClick={() => {
              const allSelectedRead = selectedEmails.every(id => 
                emails.find(email => email.id.toString() === id)?.read
              );
              handleBulkAction(allSelectedRead ? 'mark-unread' : 'mark-read');
            }}
          >
            <EyeOff className="h-4 w-4 mr-1" />
            <span className="text-sm">
              {selectedEmails.every(id => 
                emails.find(email => email.id.toString() === id)?.read
              ) ? 'Unread' : 'Read'}
            </span>
          </Button>
          <Button
            variant="ghost"
            size="sm"
            className="text-gray-600 hover:text-gray-900 h-8 px-2"
            onClick={() => handleBulkAction('archive')}
          >
            <Archive className="h-4 w-4 mr-1" />
            <span className="text-sm">Archive</span>
          </Button>
          <Button
            variant="ghost"
            size="sm"
            className="text-red-600 hover:text-red-700 h-8 px-2"
            onClick={() => handleBulkAction('delete')}
          >
            <Trash2 className="h-4 w-4 mr-1" />
            <span className="text-sm">Delete</span>
          </Button>
        </div>
      </div>
    );
  };

  // Keep only one renderEmailListWrapper function that includes both panels
  const renderEmailListWrapper = () => (
    <div className="flex-1 flex overflow-hidden">
      {/* Email list panel */}
      {renderEmailList()}

      {/* Preview panel - will automatically take remaining space */}
      <div className="flex-1 bg-white/95 backdrop-blur-sm flex flex-col">
        {selectedEmail ? (
          <>
            {/* Email actions header */}
            <div className="flex-none px-4 py-3 border-b border-gray-100">
              <div className="flex items-center gap-4">
                <div className="flex items-center gap-2 min-w-0 flex-1">
                  <Button
                    variant="ghost"
                    size="icon"
                    onClick={() => setSelectedEmail(null)}
                    className="md:hidden flex-shrink-0"
                  >
                    <ChevronLeft className="h-5 w-5" />
                  </Button>
                  <div className="min-w-0 max-w-[500px]">
                    <h2 className="text-lg font-semibold text-gray-900 truncate">
                      {selectedEmail.subject}
                    </h2>
                  </div>
                </div>
                <div className="flex items-center gap-1 flex-shrink-0 ml-auto">
                  <div className="flex items-center border-l border-gray-200 pl-4">
                    <Button
                      variant="ghost"
                      size="icon"
                      className="text-gray-400 hover:text-gray-900 h-9 w-9"
                      onClick={() => handleReply('reply')}
                    >
                      <Reply className="h-4 w-4" />
                    </Button>
                    <Button
                      variant="ghost"
                      size="icon"
                      className="text-gray-400 hover:text-gray-900 h-9 w-9"
                      onClick={() => handleReply('reply-all')}
                    >
                      <ReplyAll className="h-4 w-4" />
                    </Button>
                    <Button
                      variant="ghost"
                      size="icon"
                      className="text-gray-400 hover:text-gray-900 h-9 w-9"
                      onClick={() => handleReply('forward')}
                    >
                      <Forward className="h-4 w-4" />
                    </Button>
                    <Button
                      variant="ghost"
                      size="icon"
                      className="text-gray-400 hover:text-gray-900 h-9 w-9"
                      onClick={(e) => toggleStarred(selectedEmail.id, e)}
                    >
                      <Star className={`h-4 w-4 ${selectedEmail.starred ? 'fill-yellow-400 text-yellow-400' : ''}`} />
                    </Button>
                    <Button
                      variant="ghost"
                      size="icon"
                      className="text-gray-400 hover:text-gray-900 h-9 w-9"
                      onClick={() => {/* Add to folder logic */}}
                    >
                      <FolderOpen className="h-4 w-4" />
                    </Button>
                  </div>
                </div>
              </div>
            </div>

            {/* Scrollable content area */}
            <ScrollArea className="flex-1 p-6">
              <div className="flex items-center gap-4 mb-6">
                <Avatar className="h-10 w-10">
                  <AvatarFallback>
                    {selectedEmail.fromName?.charAt(0) || selectedEmail.from.charAt(0)}
                  </AvatarFallback>
                </Avatar>
                <div className="flex-1">
                  <p className="font-medium text-gray-900">
                    {selectedEmail.fromName} <span className="text-gray-500">&lt;{selectedEmail.from}&gt;</span>
                  </p>
                  <p className="text-sm text-gray-500">
                    to {selectedEmail.to}
                  </p>
                  {selectedEmail.cc && (
                    <p className="text-sm text-gray-500">
                      cc {selectedEmail.cc}
                    </p>
                  )}
                </div>
                <div className="text-sm text-gray-500 whitespace-nowrap">
                  {formatDate(new Date(selectedEmail.date))}
                </div>
              </div>

              {/* Email status message */}
              <p className="text-xs text-blue-600 mb-4">
                Viewing message from: {selectedEmail.from} • {new Date(selectedEmail.date).toLocaleString()}
              </p>

              {/* Direct content display for debugging */}
              <div className="mb-4 p-3 border border-blue-100 rounded-md bg-blue-50">
                <div className="flex justify-between items-center mb-2">
                  <h4 className="text-xs font-medium text-blue-800">Direct Content Preview</h4>
                </div>
                <div className="text-xs overflow-auto max-h-[300px]">
                  <strong>Content:</strong> {selectedEmail.content 
                    ? <div className="mt-1 p-1 bg-white/80 rounded overflow-auto max-h-[100px]">
                        <p>Type: {typeof selectedEmail.content}</p>
                        <p>Value: {typeof selectedEmail.content === 'object' 
                          ? JSON.stringify(selectedEmail.content) 
                          : selectedEmail.content.substring(0, 500)}...</p>
                      </div> 
                    : 'Empty'}<br/>
                  <strong>Text Content:</strong> {selectedEmail.textContent 
                    ? <div className="mt-1 p-1 bg-white/80 rounded overflow-auto max-h-[100px]">
                        <p>Type: {typeof selectedEmail.textContent}</p>
                        <p>Value: {typeof selectedEmail.textContent === 'object' 
                          ? JSON.stringify(selectedEmail.textContent) 
                          : selectedEmail.textContent.substring(0, 500)}...</p>
                      </div> 
                    : 'Empty'}<br/>
                  <strong>Raw Content:</strong> {selectedEmail.rawContent 
                    ? <div className="mt-1 p-1 bg-white/80 rounded overflow-auto max-h-[100px]">
                        <p>Type: {typeof selectedEmail.rawContent}</p>
                        <p>Value: {typeof selectedEmail.rawContent === 'object' 
                          ? JSON.stringify(selectedEmail.rawContent) 
                          : selectedEmail.rawContent.substring(0, 500)}...</p>
                      </div> 
                    : 'Empty'}<br/>
                </div>
              </div>

              <div className="prose max-w-none">
                {/* Go back to using the original renderEmailContent function */}
                {renderEmailContent(selectedEmail)}
              </div>
            </ScrollArea>
          </>
        ) : (
          <div className="flex flex-col items-center justify-center h-full">
            <Mail className="h-12 w-12 text-gray-400 mb-4" />
            <p className="text-gray-500">Select an email to view its contents</p>
          </div>
        )}
      </div>
    </div>
  );

  // Update sidebar items when available folders change
  useEffect(() => {
    if (availableFolders.length > 0) {
      const newItems = [
        ...initialSidebarItems,
        ...availableFolders
          .filter(folder => !['INBOX'].includes(folder)) // Exclude folders already in initial items
          .map(folder => ({
            view: folder as MailFolder,
            label: folder.charAt(0).toUpperCase() + folder.slice(1).toLowerCase(),
            icon: getFolderIcon(folder),
            folder: folder
          }))
      ];
      setSidebarItems(newItems);
    }
  }, [availableFolders]);

  // Update the email list item to match header checkbox alignment
  const renderEmailListItem = (email: Email) => (
    <div
      key={email.id}
      className={`p-3 hover:bg-gray-50/50 transition-colors cursor-pointer flex items-start gap-3 ${
        selectedEmail?.id === email.id ? 'bg-gray-50/80' : ''
      }`}
      onClick={() => handleEmailSelect(email.id)}
    >
      <div className="flex-none pt-1">
        <Checkbox
          checked={selectedEmails.includes(email.id)}
          onCheckedChange={(checked) => toggleEmailSelection(email.id)}
          onClick={(e) => e.stopPropagation()}
          className="mt-0.5"
        />
      </div>
      <div className="flex-1 min-w-0">
        <div className="flex items-center justify-between gap-2 mb-1">
          <div className="flex items-center gap-2 min-w-0">
            <span className={`text-sm truncate ${!email.read ? 'font-semibold text-gray-900' : 'text-gray-600'}`}>
              {email.fromName || email.from}
            </span>
            {!email.read && (
              <span className="w-1.5 h-1.5 bg-blue-600 rounded-full flex-shrink-0"></span>
            )}
          </div>
          <span className="text-xs text-gray-500 whitespace-nowrap">
            {formatDate(new Date(email.date))}
          </span>
        </div>
        <h3 className={`text-sm truncate mb-0.5 ${!email.read ? 'text-gray-900' : 'text-gray-600'}`}>
          {email.subject || '(No subject)'}
        </h3>
        <EmailPreview email={email} />
      </div>
      <div className="flex-none flex items-center gap-1">
        {email.starred && (
          <Star className="h-4 w-4 text-yellow-400 fill-yellow-400" />
        )}
        {email.attachments && email.attachments.length > 0 && (
          <Paperclip className="h-4 w-4 text-gray-400" />
        )}
      </div>
    </div>
  );

  const handleMailboxChange = async (newMailbox: string) => {
    setCurrentView(newMailbox);
    setSelectedEmails([]);
    setSearchQuery('');
    setEmails([]);
    setLoading(true);
    setError(null);
    setHasMore(true);
    setPage(1);

    try {
      // Optimize the request by adding a timeout
      const controller = new AbortController();
      const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout

      const response = await fetch(`/api/courrier?folder=${encodeURIComponent(newMailbox)}&page=1&limit=${emailsPerPage}`, {
        signal: controller.signal
      });

      clearTimeout(timeoutId);

      if (!response.ok) {
        throw new Error('Failed to fetch emails');
      }

      const data = await response.json();
      
      // Process emails more efficiently
      const processedEmails = data.emails.map((email: any) => ({
        id: Number(email.id),
        accountId: 1,
        from: email.from || '',
        fromName: email.from?.split('@')[0] || '',
        to: email.to || '',
        subject: email.subject || '(No subject)',
        body: email.body || '',
        date: email.date || new Date().toISOString(),
        read: email.read || false,
        starred: email.starred || false,
        folder: email.folder || newMailbox,
        cc: email.cc,
        bcc: email.bcc,
        flags: email.flags || [],
        raw: email.body || ''
      }));

      setEmails(processedEmails);
      setHasMore(processedEmails.length === emailsPerPage);

      // Only update unread count if we're in the Inbox folder
      if (newMailbox === 'INBOX') {
        const unreadInboxEmails = processedEmails.filter(
          (email: Email) => !email.read && email.folder === 'INBOX'
        ).length;
        setUnreadCount(unreadInboxEmails);
      }
    } catch (error) {
      console.error('Error fetching emails:', error);
      setError(error instanceof Error ? error.message : 'Failed to fetch emails');
    } finally {
      setLoading(false);
    }
  };

  // Add back the renderSidebarNav function
  const renderSidebarNav = () => (
    <nav className="p-3">
      <ul className="space-y-0.5 px-2">
        {sidebarItems.map((item) => (
          <li key={item.view}>
            <Button 
              variant={currentView === item.view ? 'secondary' : 'ghost'}
              className={`w-full justify-start py-2 ${
                currentView === item.view ? 'bg-gray-100 text-gray-900' : 'text-gray-600 hover:text-gray-900'
              }`}
              onClick={() => {
                setCurrentView(item.view);
                setSelectedEmail(null);
              }}
            >
              <div className="flex items-center justify-between w-full">
                <div className="flex items-center">
                  <item.icon className="h-4 w-4 mr-2" />
                  <span>{item.label}</span>
                </div>
                {item.view === 'INBOX' && unreadCount > 0 && (
                  <span className="ml-auto bg-blue-600 text-white text-xs px-2 py-0.5 rounded-full">
                    {unreadCount}
                  </span>
                )}
              </div>
            </Button>
          </li>
        ))}
      </ul>
    </nav>
  );

  // Update handleReply to include body property for backward compatibility
  const handleReply = async (type: 'reply' | 'reply-all' | 'forward') => {
    if (!selectedEmail) return;
    
    try {
      const getReplyTo = () => {
        if (type === 'forward') return '';
        return selectedEmail.from;
      };

      const getReplyCc = () => {
        if (type !== 'reply-all') return '';
        return selectedEmail.cc || '';
      };

      const getReplySubject = () => {
        const subject = selectedEmail.subject || '';
        if (type === 'forward') {
          return subject.startsWith('Fwd:') ? subject : `Fwd: ${subject}`;
        }
        return subject.startsWith('Re:') ? subject : `Re: ${subject}`;
      };

      // Add body property for backward compatibility
      const emailWithBody = {
        ...selectedEmail,
        body: selectedEmail.content // Add body property that maps to content
      };

      // Set the appropriate flags
      setIsReplying(type === 'reply' || type === 'reply-all');
      setIsForwarding(type === 'forward');

      // Update the compose form
      setComposeTo(getReplyTo());
      setComposeCc(getReplyCc());
      setComposeSubject(getReplySubject());
      setComposeBcc('');
      setShowCompose(true);
      setShowCc(type === 'reply-all');
      setShowBcc(false);
      setAttachments([]);

      // Pass the email with both content and body properties
      setReplyToEmail(emailWithBody);
      setForwardEmail(type === 'forward' ? emailWithBody : null);

    } catch (error) {
      console.error('Error preparing reply:', error);
    }
  };

  // Update toggleStarred to use string IDs
  const toggleStarred = async (emailId: string, e?: React.MouseEvent) => {
    if (e) {
      e.stopPropagation();
    }

    const email = emails.find(e => e.id === emailId);
    if (!email) return;

    try {
      const response = await fetch('/api/courrier/toggle-star', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ emailId, starred: !email.starred }),
      });

      if (!response.ok) {
        throw new Error('Failed to toggle star');
      }

      // Update email in state
      setEmails(emails.map(e => 
        e.id === emailId ? { ...e, starred: !e.starred } : e
      ));
    } catch (error) {
      console.error('Error toggling star:', error);
    }
  };

  // Add back the handleSend function
  const handleSend = async () => {
    if (!composeTo) {
      alert('Please specify at least one recipient');
      return;
    }

    try {
      const response = await fetch('/api/courrier/send', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          to: composeTo,
          cc: composeCc,
          bcc: composeBcc,
          subject: composeSubject,
          body: composeBody,
          attachments: attachments,
        }),
      });

      const data = await response.json();

      if (!response.ok) {
        if (data.error === 'Attachment size limit exceeded') {
          alert(`Error: ${data.error}\nThe following files are too large:\n${data.details.oversizedFiles.join('\n')}`);
        } else {
          alert(`Error sending email: ${data.error}`);
        }
        return;
      }

      // Clear compose form and close modal
      setComposeTo('');
      setComposeCc('');
      setComposeBcc('');
      setComposeSubject('');
      setComposeBody('');
      setAttachments([]);
      setShowCompose(false);
    } catch (error) {
      console.error('Error sending email:', error);
      alert('Failed to send email. Please try again.');
    }
  };

  // Add back the renderDeleteConfirmDialog function
  const renderDeleteConfirmDialog = () => (
    <AlertDialog open={showDeleteConfirm} onOpenChange={setShowDeleteConfirm}>
      <AlertDialogContent>
        <AlertDialogHeader>
          <AlertDialogTitle>Delete Emails</AlertDialogTitle>
          <AlertDialogDescription>
            Are you sure you want to delete {selectedEmails.length} selected email{selectedEmails.length > 1 ? 's' : ''}? This action cannot be undone.
          </AlertDialogDescription>
        </AlertDialogHeader>
        <AlertDialogFooter>
          <AlertDialogCancel>Cancel</AlertDialogCancel>
          <AlertDialogAction onClick={handleDeleteConfirm}>Delete</AlertDialogAction>
        </AlertDialogFooter>
      </AlertDialogContent>
    </AlertDialog>
  );

  const toggleEmailSelection = (emailId: string) => {
    setSelectedEmails((prev) =>
      prev.includes(emailId)
        ? prev.filter((id) => id !== emailId)
        : [...prev, emailId]
    );
  };

  const searchEmails = (query: string) => {
    setSearchQuery(query.trim());
  };

  const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    const query = e.target.value;
    setSearchQuery(query);
  };

  const renderEmailPreview = (email: Email) => {
    if (!email) return null;
    return (
      <div className="p-4">
        <h2 className="text-lg font-semibold mb-2">{email.subject}</h2>
        <div className="text-sm text-gray-600">
          {renderEmailContent(email)}
        </div>
      </div>
    );
  };

  if (error) {
    return (
      <div className="flex h-[calc(100vh-theme(spacing.12))] items-center justify-center bg-gray-100 mt-12">
        <div className="text-center max-w-md mx-auto px-4">
          <Mail className="h-12 w-12 mb-4 text-red-400 mx-auto" />
          <p className="text-red-500 mb-4">{error}</p>
          <Button 
            variant="outline"
            onClick={() => window.location.reload()}
            className="mx-auto"
          >
            Try Again
          </Button>
        </div>
      </div>
    );
  }

  return (
    <>
      {/* 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">
            {/* Sidebar */}
            <div className={`${sidebarOpen ? 'w-60' : 'w-16'} bg-white/95 backdrop-blur-sm border-r border-gray-100 flex flex-col transition-all duration-300 ease-in-out
                          ${mobileSidebarOpen ? 'fixed inset-y-0 left-0 z-40' : 'hidden'} md:block`}>
              {/* Courrier Title */}
              <div className="p-3 border-b border-gray-100">
                <div className="flex items-center gap-2">
                  <Mail className="h-6 w-6 text-gray-600" />
                  <span className="text-xl font-semibold text-gray-900">COURRIER</span>
                </div>
              </div>

              {/* Compose button and refresh button */}
              <div className="p-2 border-b border-gray-100 flex items-center gap-2">
                <Button 
                  className="flex-1 bg-blue-600 text-white rounded-lg hover:bg-blue-700 flex items-center justify-center transition-all py-1.5 text-sm"
                  onClick={() => {
                    setShowCompose(true);
                    setComposeTo('');
                    setComposeCc('');
                    setComposeBcc('');
                    setComposeSubject('');
                    setComposeBody('');
                    setShowCc(false);
                    setShowBcc(false);
                  }}
                >
                  <div className="flex items-center gap-2">
                    <PlusIcon className="h-3.5 w-3.5" />
                    <span>Compose</span>
                  </div>
                </Button>
                <Button
                  variant="ghost"
                  size="icon"
                  onClick={() => handleMailboxChange('INBOX')}
                  className="text-gray-600 hover:text-gray-900 hover:bg-gray-100"
                >
                  <RefreshCw className="h-4 w-4" />
                </Button>
              </div>

              {/* Accounts Section */}
              <div className="p-3 border-b border-gray-100">
                <Button 
                  variant="ghost"
                  className="w-full justify-between mb-2 text-sm font-medium text-gray-500"
                  onClick={() => setAccountsDropdownOpen(!accountsDropdownOpen)}
                >
                  <span>Accounts</span>
                  {accountsDropdownOpen ? <ChevronUp className="h-4 w-4" /> : <ChevronDown className="h-4 w-4" />}
                </Button>
                
                {accountsDropdownOpen && (
                  <div className="space-y-1 pl-2">
                    {accounts.map(account => (
                      <div key={account.id} className="relative group">
                        <Button
                          variant="ghost"
                          className="w-full justify-between px-2 py-1.5 text-sm group"
                          onClick={() => setSelectedAccount(account)}
                        >
                          <div className="flex flex-col items-start">
                            <div className="flex items-center gap-2">
                              <div className={`w-2.5 h-2.5 rounded-full ${account.color}`}></div>
                              <span className="font-medium">{account.name}</span>
                            </div>
                            <span className="text-xs text-gray-500 ml-4">{account.email}</span>
                          </div>
                        </Button>
                      </div>
                    ))}
                  </div>
                )}
              </div>

              {/* Navigation */}
              {renderSidebarNav()}
            </div>

            {/* Main content area */}
            <div className="flex-1 flex overflow-hidden">
              {/* Email list panel */}
              {renderEmailListWrapper()}
            </div>
          </div>
        </div>
      </main>

      {/* Compose Email Modal */}
      <ComposeEmail
        showCompose={showCompose}
        setShowCompose={setShowCompose}
        composeTo={composeTo}
        setComposeTo={setComposeTo}
        composeCc={composeCc}
        setComposeCc={setComposeCc}
        composeBcc={composeBcc}
        setComposeBcc={setComposeBcc}
        composeSubject={composeSubject}
        setComposeSubject={setComposeSubject}
        composeBody={composeBody}
        setComposeBody={setComposeBody}
        showCc={showCc}
        setShowCc={setShowCc}
        showBcc={showBcc}
        setShowBcc={setShowBcc}
        attachments={attachments}
        setAttachments={setAttachments}
        handleSend={handleSend}
        replyTo={isReplying ? selectedEmail : null}
        forwardFrom={isForwarding ? selectedEmail : null}
        onSend={(email) => {
          console.log('Email sent:', email);
          setShowCompose(false);
          setIsReplying(false);
          setIsForwarding(false);
        }}
        onCancel={() => {
          setShowCompose(false);
          setComposeTo('');
          setComposeCc('');
          setComposeBcc('');
          setComposeSubject('');
          setComposeBody('');
          setShowCc(false);
          setShowBcc(false);
          setAttachments([]);
          setIsReplying(false);
          setIsForwarding(false);
        }}
      />
      {renderDeleteConfirmDialog()}
    </>
  );
}