import { Injectable } from '@angular/core';
import { EntitiesService } from '@iqser/common-ui';
import { DefaultColors, DefaultColorType, IDefaultColors } from '@red/domain';
import { forkJoin, Observable } from 'rxjs';
import { map, switchMap, tap } from 'rxjs/operators';
import { mapEach } from '@iqser/common-ui/lib/utils';

@Injectable({
    providedIn: 'root',
})
export class DefaultColorsService extends EntitiesService<IDefaultColors, DefaultColors> {
    protected readonly _defaultModelPath = 'color';
    protected readonly _entityClass = DefaultColors;

    getColor(dossierTemplateId: string, colorType: DefaultColorType): string {
        return this.find(dossierTemplateId)[colorType];
    }

    getColor$(dossierTemplateId: string, colorType: DefaultColorType, fallback = 'transparent'): Observable<string> {
        return this.getEntityChanged$(dossierTemplateId).pipe(
            map(c => c[colorType]),
            map(c => c || fallback),
        );
    }

    loadAll(dossierTemplateIds: string[]): Observable<DefaultColors[]> {
        return forkJoin(dossierTemplateIds.map(id => super.getFor<IDefaultColors>(id))).pipe(
            mapEach(defaultColors => new DefaultColors(defaultColors)),
            tap(defaultColors => this.setEntities(defaultColors)),
        );
    }

    update(newColor: Partial<Record<DefaultColorType, string>>, dossierTemplateId: string): Observable<DefaultColors> {
        const oldColors = this.find(dossierTemplateId);
        const body = { ...oldColors, ...newColor };
        return this._post(body, `${this._defaultModelPath}/${dossierTemplateId}`).pipe(
            switchMap(() => super.getFor<IDefaultColors>(dossierTemplateId)),
            map(defaultColors => new DefaultColors(defaultColors)),
            tap(defaultColors => this.replace(defaultColors)),
        );
    }
}
