import { format, formatDistanceToNow } from 'date-fns'
import { fr } from 'date-fns/locale'
import { zonedTimeToUtc, utcToZonedTime } from 'date-fns-tz'

// Fuseau horaire français
const FRENCH_TIMEZONE = 'Europe/Paris'

/**
 * Convertit une date UTC en date du fuseau horaire français
 */
function toFrenchTimezone(date) {
  if (!date) return null
  const dateObj = date instanceof Date ? date : new Date(date)
  return utcToZonedTime(dateObj, FRENCH_TIMEZONE)
}

/**
 * Formate une date dans le fuseau horaire français
 */
export function formatDateInFrenchTimezone(date, formatStr = 'dd MMM à HH:mm') {
  if (!date) return ''
  const frenchDate = toFrenchTimezone(date)
  return format(frenchDate, formatStr, { locale: fr })
}

/**
 * Formate une date relative dans le fuseau horaire français
 * Note: On s'assure que la date est correctement parsée comme UTC
 */
export function formatRelativeDateInFrenchTimezone(date) {
  if (!date) return ''
  
  // Convertir la date en objet Date si ce n'est pas déjà le cas
  let dateObj = date instanceof Date ? date : new Date(date)
  
  // Si la date est une string sans "Z" à la fin, elle est interprétée comme locale
  // On doit s'assurer qu'elle est traitée comme UTC
  if (typeof date === 'string' && !date.endsWith('Z') && !date.includes('+') && !date.includes('-', 10)) {
    // Si c'est une date ISO sans timezone, on l'interprète comme UTC
    dateObj = new Date(date + 'Z')
  }
  
  // Calculer la distance depuis maintenant
  return formatDistanceToNow(dateObj, { addSuffix: true, locale: fr })
}

/**
 * Formate une date complète dans le fuseau horaire français
 */
export function formatFullDateInFrenchTimezone(date) {
  return formatDateInFrenchTimezone(date, 'EEEE d MMMM yyyy à HH:mm')
}

/**
 * Formate une date courte dans le fuseau horaire français
 */
export function formatShortDateInFrenchTimezone(date) {
  return formatDateInFrenchTimezone(date, 'dd/MM/yyyy')
}

/**
 * Formate une date pour un input datetime-local dans le fuseau horaire français
 */
export function formatDateForInputInFrenchTimezone(date) {
  if (!date) return ''
  const frenchDate = toFrenchTimezone(date)
  return format(frenchDate, "yyyy-MM-dd'T'HH:mm", { locale: fr })
}

/**
 * Convertit une date du fuseau horaire français vers UTC pour l'envoyer au backend
 */
export function convertFrenchTimezoneToUTC(date) {
  if (!date) return null
  const dateObj = date instanceof Date ? date : new Date(date)
  return zonedTimeToUtc(dateObj, FRENCH_TIMEZONE)
}


