import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';

/**
 * PDF Export Utility
 * Client-side PDF generation: html → canvas → pdf
 */

interface TripData {
  title: string;
  destination: string;
  start_date: string;
  end_date: string;
  days: Array<{
    date: string;
    places: Array<{
      name: string;
      type: string;
      duration: string;
      startTime?: string;
      endTime?: string;
      timeBlock: 'morning' | 'afternoon' | 'evening';
      latitude?: number;
      longitude?: number;
    }>;
  }>;
}

/**
 * Google Maps Static API URL oluşturur
 * Polyline ile rota çizer
 */
export function generateStaticMapUrl(
  places: Array<{ latitude?: number; longitude?: number; name?: string }>,
  width = 800,
  height = 400
): string {
  if (!places || places.length === 0) {
    return '';
  }

  const validPlaces = places.filter(p => p.latitude && p.longitude);
  if (validPlaces.length === 0) {
    return '';
  }

  const apiKey = import.meta.env.VITE_GOOGLE_MAPS_API_KEY;
  if (!apiKey) {
    console.warn('Google Maps API key not found');
    return '';
  }

  const baseUrl = 'https://maps.googleapis.com/maps/api/staticmap';
  const params = new URLSearchParams({
    size: `${width}x${height}`,
    maptype: 'roadmap',
    key: apiKey,
  });

  // Marker'ları ekle (A, B, C, ...)
  validPlaces.forEach((place, index) => {
    const label = String.fromCharCode(65 + index); // A, B, C, ...
    params.append('markers', `color:red|label:${label}|${place.latitude},${place.longitude}`);
  });

  // Polyline ekle (rota çizgisi)
  if (validPlaces.length > 1) {
    const path = validPlaces
      .map(p => `${p.latitude},${p.longitude}`)
      .join('|');
    params.append('path', `color:0x0000ff|weight:3|${path}`);
  }

  return `${baseUrl}?${params.toString()}`;
}

/**
 * Zaman bloğu etiketini döndürür
 */
export function getTimeBlockLabel(block: 'morning' | 'afternoon' | 'evening'): string {
  const labels = {
    morning: '🌅 Sabah',
    afternoon: '☀️ Öğle',
    evening: '🌆 Akşam',
  };
  return labels[block] || block;
}

/**
 * Tarihi formatlar (örn: "12 Mayıs 2026")
 */
export function formatDate(dateString: string): string {
  try {
    const date = new Date(dateString);
    const months = [
      'Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran',
      'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'
    ];
    return `${date.getDate()} ${months[date.getMonth()]} ${date.getFullYear()}`;
  } catch {
    return dateString;
  }
}

/**
 * HTML element'i PDF'e dönüştürür
 * @param elementId - PDF'e dönüştürülecek HTML element'in ID'si
 * @param filename - İndirilecek PDF dosyasının adı
 */
export async function exportToPDF(elementId: string, filename: string): Promise<void> {
  try {
    const element = document.getElementById(elementId);
    if (!element) {
      throw new Error(`Element with id "${elementId}" not found`);
    }

    // HTML'i canvas'a dönüştür
    const canvas = await html2canvas(element, {
      scale: 2, // Yüksek kalite için
      useCORS: true, // Cross-origin image'lar için
      logging: false,
      backgroundColor: '#ffffff',
    });

    // Canvas'ı PDF'e dönüştür
    const imgData = canvas.toDataURL('image/png');
    const pdf = new jsPDF({
      orientation: 'portrait',
      unit: 'mm',
      format: 'a4',
    });

    const pdfWidth = pdf.internal.pageSize.getWidth();
    const pdfHeight = pdf.internal.pageSize.getHeight();
    const imgWidth = canvas.width;
    const imgHeight = canvas.height;
    const ratio = Math.min(pdfWidth / imgWidth, pdfHeight / imgHeight);
    const imgX = (pdfWidth - imgWidth * ratio) / 2;
    const imgY = 0;

    pdf.addImage(imgData, 'PNG', imgX, imgY, imgWidth * ratio, imgHeight * ratio);
    pdf.save(filename);
  } catch (error) {
    console.error('PDF export error:', error);
    throw error;
  }
}

/**
 * Çoklu sayfa PDF oluşturur
 * Her gün için ayrı sayfa
 */
export async function exportMultiPagePDF(
  tripData: TripData,
  filename: string
): Promise<void> {
  try {
    const pdf = new jsPDF({
      orientation: 'portrait',
      unit: 'mm',
      format: 'a4',
    });

    const pageWidth = pdf.internal.pageSize.getWidth();
    const pageHeight = pdf.internal.pageSize.getHeight();
    let isFirstPage = true;

    // Kapak sayfası
    if (!isFirstPage) pdf.addPage();
    pdf.setFontSize(24);
    pdf.text(tripData.title, pageWidth / 2, 40, { align: 'center' });
    pdf.setFontSize(16);
    pdf.text(tripData.destination, pageWidth / 2, 60, { align: 'center' });
    pdf.setFontSize(12);
    pdf.text(
      `${formatDate(tripData.start_date)} - ${formatDate(tripData.end_date)}`,
      pageWidth / 2,
      80,
      { align: 'center' }
    );
    isFirstPage = false;

    // Her gün için sayfa
    for (let dayIndex = 0; dayIndex < tripData.days.length; dayIndex++) {
      const day = tripData.days[dayIndex];
      
      if (!isFirstPage) pdf.addPage();
      isFirstPage = false;

      // Gün başlığı
      pdf.setFontSize(18);
      pdf.text(`Gün ${dayIndex + 1} - ${formatDate(day.date)}`, 20, 20);

      let yPosition = 35;

      // Zaman bloklarına göre grupla
      const timeBlocks = {
        morning: day.places.filter(p => p.timeBlock === 'morning'),
        afternoon: day.places.filter(p => p.timeBlock === 'afternoon'),
        evening: day.places.filter(p => p.timeBlock === 'evening'),
      };

      // Her zaman bloğu için
      for (const [block, places] of Object.entries(timeBlocks)) {
        if (places.length === 0) continue;

        pdf.setFontSize(14);
        pdf.text(
          getTimeBlockLabel(block as 'morning' | 'afternoon' | 'evening'),
          20,
          yPosition
        );
        yPosition += 8;

        // Her yer için
        places.forEach((place, index) => {
          pdf.setFontSize(11);
          const timeRange = place.startTime && place.endTime
            ? ` (${place.startTime} - ${place.endTime})`
            : '';
          pdf.text(
            `${index + 1}. ${place.name}${timeRange}`,
            25,
            yPosition
          );
          yPosition += 6;

          pdf.setFontSize(9);
          pdf.text(`${place.type} • ${place.duration}`, 30, yPosition);
          yPosition += 8;

          // Sayfa sonu kontrolü
          if (yPosition > pageHeight - 30) {
            pdf.addPage();
            yPosition = 20;
          }
        });

        yPosition += 5;
      }

      // Harita görseli ekle
      const mapUrl = generateStaticMapUrl(day.places, 600, 300);
      if (mapUrl) {
        try {
          // Yeni sayfa ekle (harita için)
          pdf.addPage();
          pdf.setFontSize(14);
          pdf.text('Harita', 20, 20);
          
          // Harita görselini yükle ve ekle
          const img = await loadImage(mapUrl);
          const imgWidth = 170; // A4 genişliğine uygun
          const imgHeight = (img.height / img.width) * imgWidth;
          pdf.addImage(img, 'PNG', 20, 30, imgWidth, imgHeight);
        } catch (error) {
          console.warn('Map image could not be loaded:', error);
          // Placeholder metin ekle
          pdf.setFontSize(10);
          pdf.text('Harita yüklenemedi', 20, 40);
        }
      }
    }

    pdf.save(filename);
  } catch (error) {
    console.error('Multi-page PDF export error:', error);
    throw error;
  }
}

/**
 * Image URL'den image objesi yükler
 */
function loadImage(url: string): Promise<HTMLImageElement> {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.crossOrigin = 'anonymous';
    img.onload = () => resolve(img);
    img.onerror = reject;
    img.src = url;
  });
}
