import { Injectable, inject, signal } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { catchError, map, tap } from 'rxjs/operators';

export interface IaParsedBooking {
  title?: string;
  date?: string; // YYYY-MM-DD
  startTime?: string; // HH:mm
  endTime?: string; // HH:mm
  attendees?: number;
  resourceType?: 'room' | 'desk' | 'asset';
  resourceName?: string;
  hasProjector?: boolean;
  notes?: string;
}

@Injectable({
  providedIn: 'root'
})
export class IaParserService {
  private http = inject(HttpClient);
  private apiUrl = 'api/ai/parse-booking';

  // Signals para gestionar el estado reactivamente (Angular 18)
  isLoading = signal<boolean>(false);
  lastParsedResult = signal<IaParsedBooking | null>(null);

  /**
   * Envía el prompt de lenguaje natural al backend o genera un mock en caso de fallo de red.
   */
  parseNaturalLanguage(prompt: string): Observable<IaParsedBooking> {
    this.isLoading.set(true);
    return ((this.http.post<IaParsedBooking>(this.apiUrl, { prompt }) as any).pipe(
      tap((result: any) => {
        this.lastParsedResult.set(result);
        this.isLoading.set(false);
      }),
      catchError((error: any) => {
        console.warn('Conexión con el servidor backend IA simulada debido al entorno de desarrollo:', error.message);
        // Fallback a un NLP simulado con alta fidelidad para el MVP
        const mockResult = this.generateMockResponse(prompt);
        this.lastParsedResult.set(mockResult);
        this.isLoading.set(false);
        return of(mockResult);
      })
    ) as any);
  }

  /**
   * Parser simulado de lenguaje natural basado en heurísticas de palabras clave.
   */
  private generateMockResponse(prompt: string): IaParsedBooking {
    const p = prompt.toLowerCase();
    const result: IaParsedBooking = {};

    // Determinar el tipo de recurso
    if (p.includes('sala') || p.includes('reunión') || p.includes('juntas') || p.includes('boardroom')) {
      result.resourceType = 'room';
      result.resourceName = p.includes('alpha') ? 'Sala Alpha' : p.includes('beta') ? 'Sala Beta' : 'Sala Ejecutiva';
    } else if (p.includes('escritorio') || p.includes('oficina') || p.includes('mesa') || p.includes('desk')) {
      result.resourceType = 'desk';
      result.resourceName = 'Escritorio Standby 04';
    } else {
      result.resourceType = 'asset';
      result.resourceName = p.includes('proyector') ? 'Proyector Epson 4K' : p.includes('laptop') ? 'MacBook Pro M3' : 'Pizarra Inteligente';
    }

    if (p.includes('proyector')) {
      result.hasProjector = true;
    }

    // Extraer número de asistentes / personas
    const peopleMatch = p.match(/(\d+)\s*(personas|invitados|asistentes|miembros)/);
    if (peopleMatch) {
      result.attendees = parseInt(peopleMatch[1], 10);
    } else {
      result.attendees = p.includes('grupo') ? 8 : 1;
    }

    // Extraer fecha
    const targetDate = new Date();
    if (p.includes('mañana')) {
      targetDate.setDate(targetDate.getDate() + 1);
    } else if (p.includes('pasado mañana')) {
      targetDate.setDate(targetDate.getDate() + 2);
    } else if (p.includes('hoy')) {
      // mantiene hoy
    } else {
      // Si menciona un día de la semana (ej. lunes, martes)
      const daysOfWeek = ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'];
      const foundDay = daysOfWeek.findIndex(day => p.includes(day));
      if (foundDay !== -1) {
        const currentDay = targetDate.getDay();
        let distance = foundDay - currentDay;
        if (distance <= 0) distance += 7;
        targetDate.setDate(targetDate.getDate() + distance);
      }
    }
    result.date = targetDate.toISOString().split('T')[0];

    // Extraer horarios aproximados
    if (p.includes('tarde') || p.includes('pm')) {
      result.startTime = '15:00';
      result.endTime = '16:30';
    } else if (p.includes('mañana') && !p.includes('mañana por')) {
      result.startTime = '09:30';
      result.endTime = '11:00';
    } else if (p.includes('noche')) {
      result.startTime = '19:00';
      result.endTime = '20:30';
    } else {
      result.startTime = '11:00';
      result.endTime = '12:00';
    }

    result.title = `Reserva de ${result.resourceType === 'room' ? 'Sala' : result.resourceType === 'desk' ? 'Escritorio' : 'Activo'}`;
    result.notes = `Sugerencia de reserva generada inteligentemente por el Asistente IA App.`;

    return result;
  }
}
