import { Injectable } from '@angular/core';
import { GenericService } from '@iqser/common-ui';
import { IPlaceholdersResponse, IReportTemplate } from '@red/domain';
import { firstValueFrom, Observable, of } from 'rxjs';
import { HttpResponse } from '@angular/common/http';
import { catchError, map } from 'rxjs/operators';
import { HeadersConfiguration } from '@iqser/common-ui/lib/utils';

@Injectable({
    providedIn: 'root',
})
export class ReportTemplateService extends GenericService<unknown> {
    protected readonly _defaultModelPath = 'templateUpload';

    uploadTemplateForm(dossierTemplateId: string, multiFileReport?: boolean, file?: Blob) {
        const formParams = new FormData();

        if (multiFileReport !== undefined) {
            formParams.append('multiFileReport', <any>multiFileReport);
        }
        if (file !== undefined) {
            formParams.append('file', <any>file);
        }

        return this._http.post(`/${this._serviceName}/${this._defaultModelPath}/${dossierTemplateId}`, formParams, {
            observe: 'body',
        });
    }

    delete(dossierTemplateId: string, templateId: string) {
        return super.delete({}, `${this._defaultModelPath}/${dossierTemplateId}/${templateId}`);
    }

    getAvailableReportTemplates(dossierTemplateId: string) {
        const request = this.getAll<IReportTemplate[]>(`${this._defaultModelPath}/${dossierTemplateId}`);
        return firstValueFrom(request.pipe(map(templates => this._sortAvailableReportTypes(templates))));
    }

    getAvailablePlaceholders(dossierTemplateId: string) {
        return this._getOne<IPlaceholdersResponse>([dossierTemplateId], 'placeholders');
    }

    getTemplatesByPlaceholder(dossierTemplateId: string, attributeId: string) {
        return this._post<IReportTemplate[]>({ value: attributeId }, `templates/${dossierTemplateId}`).pipe(catchError(() => of([])));
    }

    downloadReportTemplate(dossierTemplateId: string, templateId: string, observe: 'response'): Observable<HttpResponse<Blob>>;
    downloadReportTemplate(dossierTemplateId: string, templateId: string, observe: 'body'): Observable<Blob>;
    downloadReportTemplate(dossierTemplateId: string, templateId: string, observe: 'body' | 'response' = 'body') {
        return this._http.request('get', `/${this._serviceName}/${this._defaultModelPath}/${dossierTemplateId}/${templateId}`, {
            responseType: 'blob',
            observe: observe,
            headers: HeadersConfiguration.getHeaders({ contentType: false }),
        });
    }

    private _sortAvailableReportTypes(values): IReportTemplate[] {
        return values.sort((a, b) => (a.fileName > b.fileName ? 1 : b.fileName > a.fileName ? -1 : 0));
    }
}
