'use client';

import { useState, useRef, useEffect } from 'react';
import { 
  X, Paperclip, ChevronDown, ChevronUp, SendHorizontal, Loader2
} from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Textarea } from '@/components/ui/textarea';
import DOMPurify from 'isomorphic-dompurify';
import { Label } from '@/components/ui/label';

// Import sub-components
import ComposeEmailHeader from './ComposeEmailHeader';
import ComposeEmailForm from './ComposeEmailForm';
import ComposeEmailFooter from './ComposeEmailFooter';
import RichEmailEditor from './RichEmailEditor';
import QuotedEmailContent from './QuotedEmailContent';

// Import ONLY from the centralized formatter
import { 
  formatReplyEmail, 
  formatForwardedEmail, 
  formatEmailAddresses,
  type EmailMessage,
  type EmailAddress
} from '@/lib/utils/email-formatter';

/**
 * CENTRAL EMAIL COMPOSER COMPONENT
 * 
 * This is the unified, centralized email composer component used throughout the application.
 * It handles new emails, replies, and forwards with proper text direction.
 * 
 * All code that needs to compose emails should import this component from:
 * @/components/email/ComposeEmail
 * 
 * It uses the centralized email formatter from @/lib/utils/email-formatter.ts
 * for consistent handling of email content and text direction.
 */

// Define interface for the modern props
interface ComposeEmailProps {
  initialEmail?: EmailMessage | null;
  type?: 'new' | 'reply' | 'reply-all' | 'forward';
  onClose: () => void;
  onSend: (emailData: {
    to: string;
    cc?: string;
    bcc?: string;
    subject: string;
    body: string;
    attachments?: Array<{
      name: string;
      content: string;
      type: string;
    }>;
  }) => Promise<void>;
}

// Add a helper to fix table widths in HTML
function fixTableWidths(html: string): string {
  if (!html) return html;
  return html.replace(/<table(?![^>]*width)/g, '<table width="100%"');
}

export default function ComposeEmail(props: ComposeEmailProps) {
  const { initialEmail, type = 'new', onClose, onSend } = props;
  
  // Email form state
  const [to, setTo] = useState<string>('');
  const [cc, setCc] = useState<string>('');
  const [bcc, setBcc] = useState<string>('');
  const [subject, setSubject] = useState<string>('');
  const [emailContent, setEmailContent] = useState<string>('');
  const [showCc, setShowCc] = useState<boolean>(false);
  const [showBcc, setShowBcc] = useState<boolean>(false);
  const [sending, setSending] = useState<boolean>(false);
  const [attachments, setAttachments] = useState<Array<{
    name: string;
    content: string;
    type: string;
  }>>([]);
  
  // Initialize the form when replying to or forwarding an email
  useEffect(() => {
    if (initialEmail && type !== 'new') {
      try {
        // Set recipients based on type
        if (type === 'reply' || type === 'reply-all') {
          // Reply goes to the original sender
          setTo(formatEmailAddresses(initialEmail.from || []));
          
          // For reply-all, include all original recipients in CC
          if (type === 'reply-all') {
            const allRecipients = [
              ...(initialEmail.to || []),
              ...(initialEmail.cc || [])
            ];
            setCc(formatEmailAddresses(allRecipients));
          }
          
          // Set subject with Re: prefix
          const subjectBase = initialEmail.subject || '(No subject)';
          const subject = subjectBase.match(/^Re:/i) ? subjectBase : `Re: ${subjectBase}`;
          setSubject(subject);
          
          // Format the reply content
          const { content } = formatReplyEmail(initialEmail, type);
          setEmailContent(content);
          
          // Show CC field if there are CC recipients
          if (initialEmail.cc && initialEmail.cc.length > 0) {
            setShowCc(true);
          }
        }
        else if (type === 'forward') {
          // Set subject with Fwd: prefix
          const subjectBase = initialEmail.subject || '(No subject)';
          const subject = subjectBase.match(/^(Fwd|FW|Forward):/i) ? subjectBase : `Fwd: ${subjectBase}`;
          setSubject(subject);
          
          // Format the forward content
          const { content } = formatForwardedEmail(initialEmail);
          setEmailContent(content);
          
          // If the original email has attachments, we should include them
          if (initialEmail.attachments && initialEmail.attachments.length > 0) {
            const formattedAttachments = initialEmail.attachments.map(att => ({
              name: att.filename || 'attachment',
              type: att.contentType || 'application/octet-stream',
              content: att.content || ''
            }));
            setAttachments(formattedAttachments);
          }
        }
      } catch (error) {
        console.error('Error initializing compose form:', error);
      }
    }
  }, [initialEmail, type]);
  
  // Handle file attachments
  const handleAttachmentAdd = async (files: FileList) => {
    const newAttachments = Array.from(files).map(file => ({
      name: file.name,
      type: file.type,
      content: URL.createObjectURL(file)
    }));
    
    setAttachments(prev => [...prev, ...newAttachments]);
  };
  
  const handleAttachmentRemove = (index: number) => {
    setAttachments(prev => prev.filter((_, i) => i !== index));
  };
  
  // Handle sending email
  const handleSend = async () => {
    if (!to) {
      alert('Please specify at least one recipient');
      return;
    }
    
    setSending(true);
    
    try {
      await onSend({
        to,
        cc: cc || undefined,
        bcc: bcc || undefined,
        subject,
        body: emailContent,
        attachments
      });
      
      // Reset form and close
      onClose();
    } catch (error) {
      console.error('Error sending email:', error);
      alert('Failed to send email. Please try again.');
    } finally {
      setSending(false);
    }
  };
  
  // Additional effect to ensure we scroll to the top and focus the editor
  useEffect(() => {
    // Focus the editor and ensure it's scrolled to the top
    const editorContainer = document.querySelector('.ql-editor') as HTMLElement;
    if (editorContainer) {
      // Set timeout to ensure DOM is fully rendered
      setTimeout(() => {
        // Focus the editor
        editorContainer.focus();
        
        // Make sure all scroll containers are at the top
        editorContainer.scrollTop = 0;
        
        // Find all possible scrollable parent containers
        const scrollContainers = [
          document.querySelector('.ql-container') as HTMLElement,
          document.querySelector('.rich-email-editor-container') as HTMLElement,
          document.querySelector('.h-full.flex.flex-col.p-6') as HTMLElement
        ];
        
        // Scroll all containers to top
        scrollContainers.forEach(container => {
          if (container) {
            container.scrollTop = 0;
          }
        });
      }, 100);
    }
  }, []);
  
  return (
    <div className="flex flex-col h-full max-h-[80vh]">
      <ComposeEmailHeader 
        type={type}
        onClose={onClose}
      />
      <div className="flex-1 overflow-y-auto p-4">
        <div className="h-full flex flex-col p-4 space-y-2 overflow-y-auto">
          {/* To Field */}
          <div className="flex-none">
            <Label htmlFor="to" className="block text-sm font-medium text-gray-700">To</Label>
            <Input
              id="to"
              value={to}
              onChange={(e) => setTo(e.target.value)}
              placeholder="recipient@example.com"
              className="w-full mt-1 bg-white border-gray-300 text-gray-900"
            />
          </div>

          {/* CC/BCC Toggle Buttons */}
          <div className="flex-none flex items-center gap-4">
            <button
              type="button"
              className="text-blue-600 hover:text-blue-700 text-sm font-medium"
              onClick={() => setShowCc(!showCc)}
            >
              {showCc ? 'Hide Cc' : 'Add Cc'}
            </button>
            <button
              type="button"
              className="text-blue-600 hover:text-blue-700 text-sm font-medium"
              onClick={() => setShowBcc(!showBcc)}
            >
              {showBcc ? 'Hide Bcc' : 'Add Bcc'}
            </button>
          </div>

          {/* CC Field */}
          {showCc && (
            <div className="flex-none">
              <Label htmlFor="cc" className="block text-sm font-medium text-gray-700">Cc</Label>
              <Input
                id="cc"
                value={cc}
                onChange={(e) => setCc(e.target.value)}
                placeholder="cc@example.com"
                className="w-full mt-1 bg-white border-gray-300 text-gray-900"
              />
            </div>
          )}

          {/* BCC Field */}
          {showBcc && (
            <div className="flex-none">
              <Label htmlFor="bcc" className="block text-sm font-medium text-gray-700">Bcc</Label>
              <Input
                id="bcc"
                value={bcc}
                onChange={(e) => setBcc(e.target.value)}
                placeholder="bcc@example.com"
                className="w-full mt-1 bg-white border-gray-300 text-gray-900"
              />
            </div>
          )}

          {/* Subject Field */}
          <div className="flex-none">
            <Label htmlFor="subject" className="block text-sm font-medium text-gray-700">Subject</Label>
            <Input
              id="subject"
              value={subject}
              onChange={(e) => setSubject(e.target.value)}
              placeholder="Enter subject"
              className="w-full mt-1 bg-white border-gray-300 text-gray-900"
            />
          </div>

          {/* Message Body */}
          <div className="flex-1 min-h-[200px] flex flex-col overflow-hidden">
            <Label htmlFor="message" className="flex-none block text-sm font-medium text-gray-700 mb-2">Message</Label>
            <div className="flex-1 border border-gray-300 rounded-md overflow-hidden">
              <RichEmailEditor
                initialContent={emailContent}
                onChange={setEmailContent}
                minHeight="200px"
                maxHeight="none"
                preserveFormatting={true}
              />
            </div>
          </div>
          
          {/* Attachments */}
          {attachments.length > 0 && (
            <div className="border rounded-md p-3 mt-4">
              <h3 className="text-sm font-medium mb-2 text-gray-700">Attachments</h3>
              <div className="space-y-2">
                {attachments.map((file, index) => (
                  <div key={index} className="flex items-center justify-between text-sm border rounded p-2">
                    <span className="truncate max-w-[200px] text-gray-800">{file.name}</span>
                    <Button 
                      variant="ghost"
                      size="sm"
                      onClick={() => handleAttachmentRemove(index)}
                      className="h-6 w-6 p-0 text-gray-500 hover:text-gray-700"
                    >
                      <X className="h-4 w-4" />
                    </Button>
                  </div>
                ))}
              </div>
            </div>
          )}
        </div>
      </div>
      {/* Modal Footer - now inside the main modal container and visually attached */}
      <div className="flex-none flex items-center justify-between px-6 py-3 border-t border-gray-200 bg-white">
        <div className="flex items-center gap-2">
          {/* File Input for Attachments */}
          <input
            type="file"
            id="file-attachment"
            className="hidden"
            multiple
            onChange={(e) => {
              if (e.target.files && e.target.files.length > 0) {
                handleAttachmentAdd(e.target.files);
              }
            }}
          />
          <label htmlFor="file-attachment">
            <Button 
              variant="outline" 
              size="icon"
              className="rounded-full bg-white hover:bg-gray-100 border-gray-300"
              onClick={(e) => {
                e.preventDefault();
                document.getElementById('file-attachment')?.click();
              }}
            >
              <Paperclip className="h-4 w-4 text-gray-600" />
            </Button>
          </label>
          {sending && <span className="text-xs text-gray-500 ml-2">Preparing attachment...</span>}
        </div>
        <div className="flex items-center gap-3">
          <Button 
            variant="ghost"
            className="text-gray-600 hover:text-gray-700 hover:bg-gray-100"
            onClick={onClose}
            disabled={sending}
          >
            Cancel
          </Button>
          <Button
            className="bg-blue-600 text-white hover:bg-blue-700"
            onClick={handleSend}
            disabled={sending}
          >
            {sending ? (
              <>
                <Loader2 className="mr-2 h-4 w-4 animate-spin" />
                Sending...
              </>
            ) : (
              <>
                <SendHorizontal className="mr-2 h-4 w-4" />
                Send
              </>
            )}
          </Button>
        </div>
      </div>
    </div>
  );
} 