import { Injectable, inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, map } from 'rxjs';
import { DocumentPdf, ReponseDocuments } from './models';

/**
 * Service d'accès aux documents PDF de l'utilisateur (CRUD via /api/documents).
 */
@Injectable({ providedIn: 'root' })
export class DocumentsService {
  private readonly http = inject(HttpClient);

  /** Liste les documents de l'utilisateur connecté. */
  lister(): Observable<DocumentPdf[]> {
    return this.http
      .get<ReponseDocuments>('/api/documents')
      .pipe(map((r) => r.documents));
  }

  /** Métadonnées d'un document. */
  obtenir(id: string): Observable<DocumentPdf> {
    return this.http.get<DocumentPdf>(`/api/documents/${id}`);
  }

  /** Télécharge le binaire PDF d'un document. */
  telechargerFichier(id: string): Observable<ArrayBuffer> {
    return this.http.get(`/api/documents/${id}/file`, {
      responseType: 'arraybuffer',
    });
  }

  /** Upload d'un nouveau PDF. */
  creer(fichier: Blob, nom: string): Observable<DocumentPdf> {
    const form = new FormData();
    form.append('file', fichier, nom);
    form.append('name', nom);
    return this.http.post<DocumentPdf>('/api/documents', form);
  }

  /** Met à jour le binaire et/ou le nom d'un document existant. */
  mettreAJour(
    id: string,
    fichier: Blob | null,
    nom: string | null,
  ): Observable<DocumentPdf> {
    const form = new FormData();
    if (fichier) {
      form.append('file', fichier, nom ?? 'document.pdf');
    }
    if (nom) {
      form.append('name', nom);
    }
    return this.http.put<DocumentPdf>(`/api/documents/${id}`, form);
  }

  /** Supprime un document. */
  supprimer(id: string): Observable<void> {
    return this.http.delete<void>(`/api/documents/${id}`);
  }
}
