import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, map } from 'rxjs';
import { Booking } from '../models/booking.model';
import { environment } from '../../environments/environment';
import { AuthService } from './auth.service';

// URL base para las imágenes
const BASE_IMAGE_URL = environment.apiUrl;

@Injectable({
  providedIn: 'root'
})
export class BookingsService {
  private apiUrl = `${environment.apiUrl}/api/bookings`;

  constructor(
    private http: HttpClient,
    private authService: AuthService
  ) { }

  getUserBookings(): Observable<Booking[]> {
    const currentUser = this.authService.getCurrentUser();
    if (!currentUser) {
      console.warn('No hay usuario autenticado para obtener reservas');
      return new Observable(observer => {
        observer.next([]);
        observer.complete();
      });
    }
    
    const userId = currentUser.id;
    console.log('Obteniendo reservas del usuario...', `${this.apiUrl}/user/${userId}`);
    return this.http.get<any[]>(`${this.apiUrl}/user/${userId}`).pipe(
      map(bookings => {
        return bookings.map(booking => {
          // El backend devuelve booking.gymclass (minúscula) pero nuestro modelo usa gymClass (capitalizada)
          const gymClass = booking.gymclass || booking.gymClass;
          
          return {
            ...booking,
            // Garantizar que tengamos los campos para compatibilidad con código existente
            classId: booking.gymClassId || booking.classId,
            className: gymClass?.name,
            // Convertir fechas si vienen del backend
            date: booking.date ? new Date(booking.date) : 
                  booking.bookingDate ? new Date(booking.bookingDate) : new Date(),
            // Normalizar el objeto gymClass (asegurarnos que use camelCase)
            gymClass: gymClass ? {
              ...gymClass,
              startTime: new Date(gymClass.startTime),
              endTime: new Date(gymClass.endTime),
              // Convertir la ruta relativa de imagen a URL completa
              imageUrl: this.getFullImageUrl(gymClass.imageUrl)
            } : undefined
          };
        });
      })
    );
  }

  addBooking(classId: string): Observable<Booking> {
    const currentUser = this.authService.getCurrentUser();
    if (!currentUser) {
      console.error('No hay usuario autenticado para crear reserva');
      return new Observable(observer => {
        observer.error(new Error('No hay usuario autenticado'));
        observer.complete();
      });
    }
    
    console.log('Agregando reserva...', this.apiUrl);
    return this.http.post<any>(this.apiUrl, {
      userId: currentUser.id,
      gymClassId: classId
    }).pipe(
      map(booking => {
        // El backend devuelve booking.gymclass (minúscula) pero nuestro modelo usa gymClass (capitalizada)
        const gymClass = booking.gymclass || booking.gymClass;
        
        return {
          ...booking,
          date: booking.date ? new Date(booking.date) : booking.bookingDate ? new Date(booking.bookingDate) : new Date(),
          gymClass: gymClass ? {
            ...gymClass,
            startTime: new Date(gymClass.startTime),
            endTime: new Date(gymClass.endTime),
            imageUrl: this.getFullImageUrl(gymClass.imageUrl)
          } : undefined
        };
      })
    );
  }

  cancelBooking(bookingId: string): Observable<Booking> {
    console.log('Cancelando reserva...', `${this.apiUrl}/${bookingId}/cancel`);
    return this.http.put<any>(`${this.apiUrl}/${bookingId}/cancel`, {}).pipe(
      map(booking => {
        // El backend devuelve booking.gymclass (minúscula) pero nuestro modelo usa gymClass (capitalizada)
        const gymClass = booking.gymclass || booking.gymClass;
        
        return {
          ...booking,
          date: booking.date ? new Date(booking.date) : booking.bookingDate ? new Date(booking.bookingDate) : new Date(),
          gymClass: gymClass ? {
            ...gymClass,
            startTime: new Date(gymClass.startTime),
            endTime: new Date(gymClass.endTime),
            imageUrl: this.getFullImageUrl(gymClass.imageUrl)
          } : undefined
        };
      })
    );
  }
  
  /**
   * Convierte una ruta de imagen relativa a URL completa
   * @param imagePath Ruta relativa de la imagen (ej: /uploads/yoga.png)
   * @returns URL completa incluyendo el dominio base
   */
  private getFullImageUrl(imagePath: string | undefined): string {
    if (!imagePath) {
      // Imagen por defecto si no hay URL
      return 'https://cdn-icons-png.flaticon.com/512/42/42829.png';
    }
    
    // Si la imagen ya es una URL completa (comienza con http/https), la devolvemos tal cual
    if (imagePath.startsWith('http://') || imagePath.startsWith('https://')) {
      return imagePath;
    }
    
    // Asegurarnos que la ruta comience con /
    const normalizedPath = imagePath.startsWith('/') ? imagePath : `/${imagePath}`;
    
    // Concatenar la URL base con la ruta de la imagen
    return `${BASE_IMAGE_URL}${normalizedPath}`;
  }
}