import type { Place, TimelineEvent, TripPlace } from '@/types';

/**
 * Süre string'ini dakikaya çevirir
 * Örnek: "2 saat" -> 120, "1.5 saat" -> 90, "30 dakika" -> 30
 */
export function parseDurationToMinutes(duration?: string): number {
  if (!duration) return 60; // Varsayılan 1 saat

  const lowerDuration = duration.toLowerCase();
  
  // Saat formatı
  if (lowerDuration.includes('saat') || lowerDuration.includes('hour')) {
    const match = lowerDuration.match(/(\d+\.?\d*)/);
    if (match) {
      return Math.round(parseFloat(match[1]) * 60);
    }
  }
  
  // Dakika formatı
  if (lowerDuration.includes('dakika') || lowerDuration.includes('minute') || lowerDuration.includes('min')) {
    const match = lowerDuration.match(/(\d+)/);
    if (match) {
      return parseInt(match[1], 10);
    }
  }

  return 60; // Varsayılan
}

/**
 * Saat string'ine dakika ekler
 * @param timeStr - HH:MM formatında saat
 * @param minutes - Eklenecek dakika
 * @returns Yeni saat (HH:MM formatında)
 */
export function addMinutesToTime(timeStr: string, minutes: number): string {
  const [hours, mins] = timeStr.split(':').map(Number);
  const totalMinutes = hours * 60 + mins + minutes;
  
  const newHours = Math.floor(totalMinutes / 60) % 24;
  const newMins = totalMinutes % 60;
  
  return `${String(newHours).padStart(2, '0')}:${String(newMins).padStart(2, '0')}`;
}

/**
 * Saat string'ini dakikaya çevirir
 */
export function timeToMinutes(timeStr: string): number {
  const [hours, mins] = timeStr.split(':').map(Number);
  return hours * 60 + mins;
}

/**
 * Dakikayı saat string'ine çevirir
 */
export function minutesToTime(minutes: number): string {
  const hours = Math.floor(minutes / 60);
  const mins = minutes % 60;
  return `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}`;
}

/**
 * Gün zaman çizelgesini oluşturur
 * Sabit saatli etkinlikler (balon) önce yerleştirilir, esnek etkinlikler sonra eklenir
 * 
 * @param dayPlaces - Gün içindeki yerler (order_index'e göre sıralı)
 * @returns Zaman çizelgesi olayları
 */
export function buildDayTimeline(
  dayPlaces: (TripPlace & { place?: Place })[]
): TimelineEvent[] {
  const timeline: TimelineEvent[] = [];
  
  // Sabit saatli etkinlikleri ayır
  const fixedEvents = dayPlaces.filter((tp) => tp.place?.is_time_fixed);
  const flexibleEvents = dayPlaces.filter((tp) => !tp.place?.is_time_fixed);

  // 1️⃣ Sabit saatli etkinlikleri zaman çizelgesine ekle
  for (const tp of fixedEvents) {
    if (!tp.place) continue;
    
    const startTime = tp.place.fixed_start_time?.substring(0, 5) || '05:30';
    const endTime = tp.place.fixed_end_time?.substring(0, 5) || '07:30';
    const durationMinutes = timeToMinutes(endTime) - timeToMinutes(startTime);

    timeline.push({
      id: tp.id,
      place: tp.place,
      start_time: startTime,
      end_time: endTime,
      duration_minutes: durationMinutes,
      is_fixed: true,
      order_index: tp.order_index,
    });
  }

  // 2️⃣ Esnek etkinlikleri sabit etkinliklerden sonra yerleştir
  let cursorTime = '09:00'; // Varsayılan başlangıç saati
  
  // Eğer sabit etkinlik varsa, onun bitiş saatinden sonra başla
  if (fixedEvents.length > 0) {
    const lastFixedEvent = timeline[timeline.length - 1];
    // Sabit etkinlikten sonra 30 dakika ara ver (kahvaltı, transfer vb.)
    cursorTime = addMinutesToTime(lastFixedEvent.end_time, 30);
  }

  // Esnek etkinlikleri sırayla ekle
  for (const tp of flexibleEvents) {
    if (!tp.place) continue;
    
    const durationMinutes = parseDurationToMinutes(tp.place.duration);
    const startTime = cursorTime;
    const endTime = addMinutesToTime(startTime, durationMinutes);

    timeline.push({
      id: tp.id,
      place: tp.place,
      start_time: startTime,
      end_time: endTime,
      duration_minutes: durationMinutes,
      is_fixed: false,
      order_index: tp.order_index,
    });

    // Bir sonraki etkinlik için cursor'ı güncelle (15 dakika transfer süresi ekle)
    cursorTime = addMinutesToTime(endTime, 15);
  }

  return timeline;
}

/**
 * Zaman bloğuna göre başlangıç saati önerir
 */
export function suggestStartTimeForBlock(timeBlock: 'morning' | 'afternoon' | 'evening'): string {
  switch (timeBlock) {
    case 'morning':
      return '09:00';
    case 'afternoon':
      return '13:00';
    case 'evening':
      return '18:00';
    default:
      return '09:00';
  }
}

/**
 * İki saat arasındaki farkı dakika cinsinden hesaplar
 */
export function getTimeDifferenceMinutes(startTime: string, endTime: string): number {
  return timeToMinutes(endTime) - timeToMinutes(startTime);
}

/**
 * Zaman çizelgesinin toplam süresini hesaplar
 */
export function calculateTotalDuration(timeline: TimelineEvent[]): number {
  if (timeline.length === 0) return 0;
  
  const firstEvent = timeline[0];
  const lastEvent = timeline[timeline.length - 1];
  
  return getTimeDifferenceMinutes(firstEvent.start_time, lastEvent.end_time);
}
