import { Injectable } from '@angular/core';
import { LocalNotifications } from '@capacitor/local-notifications';
import { Booking } from '../models/booking.model';
import { GymClass } from '../models/gym-class.model';

@Injectable({
  providedIn: 'root'
})
export class NotificationService {

  constructor() {
    this.initialize();
  }

  private async initialize() {
    try {
      // Solicitar permisos al inicializar
      const permResult = await LocalNotifications.requestPermissions();
      console.log('Permisos de notificación:', permResult.display);
    } catch (error) {
      console.error('Error al inicializar notificaciones', error);
    }
  }

  async scheduleClassReminder(booking: Booking, gymClass: GymClass) {
    try {
      // Verificar que tenemos permisos
      const permResult = await LocalNotifications.requestPermissions();
      
      if (permResult.display !== 'granted') {
        console.log('Permisos de notificación no concedidos');
        return;
      }
      
      // Configurar el tiempo de la notificación (1 hora antes de la clase)
      const classTime = new Date(gymClass.startTime);
      const notificationTime = new Date(classTime);
      notificationTime.setHours(notificationTime.getHours() - 1);
      
      // No programar notificaciones en el pasado
      if (notificationTime <= new Date()) {
        console.log('No se programó notificación (fecha en el pasado)');
        return;
      }
      
      // Crear notificación
      await LocalNotifications.schedule({
        notifications: [
          {
            id: parseInt(booking.id), // Convertir a número
            title: `¡Recordatorio de clase: ${gymClass.name}!`,
            body: `Tu clase de ${gymClass.name} con ${gymClass.instructor} comienza en 1 hora.`,
            schedule: { at: notificationTime },
            sound: 'default',
            actionTypeId: '',
            extra: {
              bookingId: booking.id,
              classId: gymClass.id
            }
          }
        ]
      });
      
      console.log(`Notificación programada para ${notificationTime.toLocaleString()}`);
      
    } catch (error) {
      console.error('Error al programar notificación', error);
    }
  }

  async cancelNotification(bookingId: string) {
    try {
      // Cancelar la notificación asociada a la reserva
      await LocalNotifications.cancel({
        notifications: [
          { id: parseInt(bookingId) }
        ]
      });
      
      console.log(`Notificación para reserva ${bookingId} cancelada`);
    } catch (error) {
      console.error('Error al cancelar notificación', error);
    }
  }

  async checkNotificationStatus() {
    try {
      // Verificar el estado de los permisos
      const permResult = await LocalNotifications.checkPermissions();
      return permResult.display === 'granted';
    } catch (error) {
      console.error('Error al verificar permisos', error);
      return false;
    }
  }

  async getPendingNotifications() {
    try {
      // Obtener notificaciones pendientes
      const pendingList = await LocalNotifications.getPending();
      return pendingList.notifications;
    } catch (error) {
      console.error('Error al obtener notificaciones pendientes', error);
      return [];
    }
  }
}