import { Injectable } from '@angular/core';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';

// ==== MODELOS ====

export interface Paciente {
  tipo_documento: string;
  numero_documento: string;
  nombre_completo: string;
  genero: string | null;
  edad: number | null;
  fecha_nacimiento: string; // 'YYYY-MM-DD'
  celular?: string | null;  
  correo?: string | null;   
}

export interface Cita {
  id_cita: number;
  numero_documento: string;
  especialidad: string;
  fecha_cita: string;        // 'YYYY-MM-DD'
  hora_cita: string | null;  // 'HH:mm:ss' o null
  tipo_cita: string | null;
  modalidad: string | null;  // PRESENCIAL / TELEMEDICINA / null
  asistio: boolean | null;
  observaciones: string | null;
}

export interface Especialidad {
  id_especialidad: number;
  nombre: string;
}

export interface NuevaCita {
  numero_documento: string;
  id_especialidad: number;
  fecha_cita: string;       // 'YYYY-MM-DD'
  hora_cita: string;        // 'HH:mm'
  modalidad: string;        // PRESENCIAL / TELEMEDICINA
  tipo_cita?: string | null;
  observaciones?: string | null;
}

// ==== SERVICIO ====

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

  private apiUrl = 'http://localhost:2800/api';

  constructor(private http: HttpClient) {}

  listarPacientes(): Observable<Paciente[]> {
    return this.http.get<Paciente[]>(`${this.apiUrl}/pacientes`);
  }

  buscarPorDocumento(doc: string): Observable<Paciente[]> {
    const params = new HttpParams()
      .set('tipo', 'documento')
      .set('termino', doc.trim());
    return this.http.get<Paciente[]>(`${this.apiUrl}/pacientes`, { params });
  }

  buscarPorNombre(nombre: string): Observable<Paciente[]> {
    const params = new HttpParams()
      .set('tipo', 'nombre')
      .set('termino', nombre.trim());
    return this.http.get<Paciente[]>(`${this.apiUrl}/pacientes`, { params });
  }

  obtenerCitasPaciente(numeroDocumento: string): Observable<Cita[]> {
    return this.http.get<Cita[]>(`${this.apiUrl}/pacientes/${numeroDocumento}/citas`);
  }

  obtenerEspecialidades(): Observable<Especialidad[]> {
    return this.http.get<Especialidad[]>(`${this.apiUrl}/especialidades`);
  }

  crearCita(datos: NuevaCita): Observable<Cita> {
    return this.http.post<Cita>(`${this.apiUrl}/citas`, datos);
  }

  actualizarAsistenciaCita(id_cita: number, asistio: boolean): Observable<Cita> {
    return this.http.patch<Cita>(
      `${this.apiUrl}/citas/${id_cita}/asistencia`,
      { asistio }
    );
  }
}
