import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'

const EXPO_PUSH_URL = 'https://exp.host/--/api/v2/push/send';

Deno.serve(async (req) => {
  const supabase = createClient(
    Deno.env.get('SUPABASE_URL') ?? '',
    Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? ''
  )

  try {
    const now = new Date();
    
    // 1. Buscar agendamentos que:
    // - Estão pendentes
    // - Ainda não enviaram lembrete (field 'reminder_sent' deve existir)
    // - O tempo para o agendamento é <= reminder_minutes
    const { data: appts, error } = await supabase
      .from('appointments')
      .select('*, profiles(fcm_token), shops(name)')
      .eq('status', 'pendente')
      .eq('reminder_sent', false)
      .not('profiles.fcm_token', 'is', null);

    if (error) throw error;

    const notifications = [];
    const appointmentsToUpdate = [];

    for (const appt of appts) {
      const apptDate = new Date(appt.date.replace(' ', 'T')); // Converte "YYYY-MM-DD HH:mm" para ISO
      const diffInMinutes = (apptDate.getTime() - now.getTime()) / (1000 * 60);
      const reminderMinutes = appt.reminder_minutes || 1440; // Default 24h

      // Se estiver dentro da janela de lembrete (por exemplo, se faltarem 10min e o lembrete for de 10min)
      // Ajustamos uma margem de segurança de 5 min para o Cron não perder a janela
      if (diffInMinutes <= reminderMinutes && diffInMinutes > -10) {
        const expoToken = appt.profiles?.fcm_token;
        if (expoToken && expoToken.startsWith('ExponentPushToken')) {
          notifications.push({
            to: expoToken,
            sound: 'default',
            title: `Lembrete: ${appt.shops?.name}`,
            body: `O seu agendamento está a aproximar-se (${appt.date.split(' ')[1]}).`,
            data: { appointmentId: appt.id },
          });
          appointmentsToUpdate.push(appt.id);
        }
      }
    }

    console.log(`Sending ${notifications.length} reminders...`);

    if (notifications.length > 0) {
      await fetch(EXPO_PUSH_URL, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Accept': 'application/json',
        },
        body: JSON.stringify(notifications),
      });

      // Marcar como enviado para não repetir
      await supabase
        .from('appointments')
        .update({ reminder_sent: true })
        .in('id', appointmentsToUpdate);
    }

    return new Response(JSON.stringify({ success: true, count: notifications.length }), {
      headers: { "Content-Type": "application/json" },
      status: 200,
    });

  } catch (err) {
    console.error('Error in send-reminder:', err);
    return new Response(JSON.stringify({ error: err.message }), {
      headers: { "Content-Type": "application/json" },
      status: 500,
    });
  }
})
