import { BaseApiService } from '@/services/api/base';
import { httpClient } from '@/services/http/client';
import { formatDate } from '@/lib/helper';
import { BaseApiResponse } from '@/types/api/api-general';
import { LogisticPurchasePerSupplierReport } from '@/types/api/report/logistic-stock';

export class LogisticApiService extends BaseApiService<
  LogisticPurchasePerSupplierReport,
  unknown,
  unknown
> {
  constructor(basePath: string) {
    super(basePath);
  }

  private buildPurchaseSupplierParams(
    area_id?: string,
    supplier_id?: string,
    product_id?: string,
    product_category_id?: string,
    start_date?: string,
    end_date?: string,
    sort_by?: string,
    filter_by?: string
  ): URLSearchParams {
    const params = new URLSearchParams();
    if (area_id) params.set('area_id', area_id);
    if (supplier_id) params.set('supplier_id', supplier_id);
    if (product_id) params.set('product_id', product_id);
    if (product_category_id)
      params.set('product_category_id', product_category_id);
    if (filter_by === 'received_date' && start_date)
      params.set('received_date', start_date);
    if (filter_by === 'po_date' && start_date)
      params.set('po_date', start_date);
    if (start_date) params.set('start_date', start_date);
    if (end_date) params.set('end_date', end_date);
    if (sort_by) params.set('sort_by', sort_by);
    if (filter_by) params.set('filter_by', filter_by);
    return params;
  }

  async exportToExcelSupplierPerSheet(
    area_id?: string,
    supplier_id?: string,
    product_id?: string,
    product_category_id?: string,
    start_date?: string,
    end_date?: string,
    sort_by?: string,
    filter_by?: string
  ) {
    const params = this.buildPurchaseSupplierParams(
      area_id,
      supplier_id,
      product_id,
      product_category_id,
      start_date,
      end_date,
      sort_by,
      filter_by
    );
    params.set('export', 'excel');
    params.set('page', '1');
    params.set('limit', '99999999999');

    const res = await httpClient<Blob>(
      `${this.basePath.replace(/\/$/, '')}/purchase-supplier?${params.toString()}`,
      { method: 'GET', responseType: 'blob' }
    );

    const url = window.URL.createObjectURL(new Blob([res]));
    const link = document.createElement('a');
    link.href = url;
    link.setAttribute(
      'download',
      `laporan-pembelian-per-supplier-per-sheet-${formatDate(Date.now(), 'DD-MM-YYYY')}.xlsx`
    );
    document.body.appendChild(link);
    link.click();
    link.remove();
  }

  async exportToExcelGeneral(
    area_id?: string,
    supplier_id?: string,
    product_id?: string,
    product_category_id?: string,
    start_date?: string,
    end_date?: string,
    sort_by?: string,
    filter_by?: string
  ) {
    const params = this.buildPurchaseSupplierParams(
      area_id,
      supplier_id,
      product_id,
      product_category_id,
      start_date,
      end_date,
      sort_by,
      filter_by
    );
    params.set('export', 'excel-all');
    params.set('page', '1');
    params.set('limit', '99999999999');

    const res = await httpClient<Blob>(
      `${this.basePath.replace(/\/$/, '')}/purchase-supplier?${params.toString()}`,
      { method: 'GET', responseType: 'blob' }
    );

    const url = window.URL.createObjectURL(new Blob([res]));
    const link = document.createElement('a');
    link.href = url;
    link.setAttribute(
      'download',
      `laporan-pembelian-per-supplier-general-${formatDate(Date.now(), 'DD-MM-YYYY')}.xlsx`
    );
    document.body.appendChild(link);
    link.click();
    link.remove();
  }

  async getLogisticPurchasePerSupplierReport(
    area_id?: string,
    supplier_id?: string,
    product_id?: string,
    product_category_id?: string,
    received_date?: string,
    po_date?: string,
    start_date?: string,
    end_date?: string,
    sort_by?: string,
    filter_by?: string,
    page?: number,
    limit?: number
  ): Promise<BaseApiResponse<LogisticPurchasePerSupplierReport> | undefined> {
    return await this.customRequest<
      BaseApiResponse<LogisticPurchasePerSupplierReport>
    >(`purchase-supplier`, {
      method: 'GET',
      params: {
        area_id: area_id,
        supplier_id: supplier_id,
        product_id: product_id,
        product_category_id: product_category_id,
        received_date: received_date,
        po_date: po_date,
        start_date: start_date,
        end_date: end_date,
        sort_by: sort_by,
        filter_by: filter_by,
        page: page,
        limit: limit,
      },
    });
  }
}

export const LogisticApi = new LogisticApiService('reports');

// export const LogisticApi = new LogisticApiService(
//   'http://localhost:4010/api/reports/logistics'
// );
