import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, map } from 'rxjs';
import { GymClass } from '../models/gym-class.model';
import { environment } from '../../environments/environment';

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

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

  constructor(private http: HttpClient) { }

  getClasses(): Observable<GymClass[]> {
    console.log('Obteniendo clases...', this.apiUrl);
    return this.http.get<any[]>(this.apiUrl).pipe(
      map(classes => {
        return classes.map(gymClass => {
          return {
            ...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)
          };
        });
      })
    );
  }

  getClassById(id: string | undefined): Observable<GymClass | null> {
    // Si el ID es undefined o null, retornamos null inmediatamente sin hacer la petición API
    if (!id) {
      console.warn('Se intentó obtener una clase con ID undefined o null');
      return new Observable<null>(observer => {
        observer.next(null);
        observer.complete();
      });
    }
    
    return this.http.get<any>(`${this.apiUrl}/${id}`).pipe(
      map(gymClass => {
        if (!gymClass) return null;
        return {
          ...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)
        };
      })
    );
  }

  updateClassBookings(classId: string, change: number): Observable<boolean> {
    // En este caso, no necesitamos implementar esta función directamente
    // ya que el backend se encargará de actualizar los contadores cuando
    // se creen o cancelen reservas.
    return new Observable<boolean>(observer => {
      observer.next(true);
      observer.complete();
    });
  }
  
  /**
   * 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}`;
  }
}