import { Injectable } from '@angular/core';
import { Observable, map, of, delay, tap } from 'rxjs';
import { Papa } from 'ngx-papaparse';
import { ApiClientService } from '../../shared/services/api/api-client.service';
import { Driver } from './driver.interface';
import { PaginatedResponse } from '../../shared/interfaces/paginate.interface';
import { DomainService } from '../../shared/components/base-domain/base-domain.component';


@Injectable({
    providedIn: 'root' 
  })
  export class DriversService implements DomainService<Driver> { 
    constructor(
      private apiClient: ApiClientService,
      private papa: Papa
    ) {}

    getDrivers( 
        page = 1, 
        limit = 10, 
        filters?: {[key: string]: string}
      ): Observable<PaginatedResponse<Driver>> {
        
        let url = `driver?page=${page}&limit=${limit}`;
        
        if (filters) {
          const params = new URLSearchParams();
          
          for (const [key, value] of Object.entries(filters)) {
            if (value) {
              params.append(key, value);
            }
          }
          
          url += `&${params.toString()}`;
        }
        
        return this.apiClient.get<PaginatedResponse<Driver>>(url);
    }


      /**
   * Busca um motorista específico por ID
   */
  getById(id: string | number): Observable<{ data: Driver }> {
    return this.apiClient.get<{ data: Driver }>(`driver/${id}`);
  }

    /**
     * Remove um motorista
     */
    delete(id: string | number): Observable<void> {
      return this.apiClient.delete<void>(`driver/${id}`);
    }

    // ========================================
    // 🎯 MÉTODOS ESPERADOS PELO BaseDomainComponent
    // ========================================
    /**
     * ✅ Método genérico para listar - chamado automaticamente pelo BaseDomainComponent
     */
    getEntities(page: number, pageSize: number, filters: any): Observable<{
      data: Driver[];
      totalCount: number;
      pageCount: number;
      currentPage: number;
    }> {
      return this.getDrivers(page, pageSize, filters).pipe(
        map(response => ({
          data: response.data,
          totalCount: response.totalCount,
          pageCount: response.pageCount,
          currentPage: response.currentPage
        }))
      );
    }

    /**
     * ✅ Método genérico para criar - chamado automaticamente pelo BaseDomainComponent
     */
    create(data: any): Observable<Driver> {
      return this.apiClient.post<Driver>('driver', data);
    }

    /**
     * ✅ Método genérico para atualizar - chamado automaticamente pelo BaseDomainComponent
     */
    update(id: any, data: any): Observable<Driver> {
      return this.apiClient.patch<Driver>(`driver/${id}`, data);
    }
}