import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Observable } from "rxjs";
import { map } from "rxjs/operators";

import { GearResp, GearReq } from "../models/gear";

import { BaseService } from "./base.service";
import { CacheApiKey } from "../models/cache-api-key.enum";

@Injectable()
export class GearService extends BaseService {
    constructor(private http: HttpClient) {
        super();
    }

    public getListOfGears(): Observable<Array<GearResp>> {
        let callToApi = this.http.get<Array<GearResp>>(`${this.apiUrl}/Gear`, {
            headers: this.headers,
        });
        return this.serviceCacheApi.get<Array<GearResp>>(
            CacheApiKey.Gear,
            callToApi,
        );
    }

    public addGear(
        name: string,
        manufacturer: string,
        minSize: number,
        maxSize: number,
        aad: string,
        mainCanopy: string,
        reserveCanopy: string,
        equipment: string,
    ) {
        const bodyNewGear: GearReq = {
            id: 0,
            name: name,
            manufacturer: manufacturer,
            minSize: minSize,
            maxSize: maxSize,
            aad: aad,
            mainCanopy: mainCanopy,
            reserveCanopy: reserveCanopy,
            equipment: equipment,
        };

        this.serviceCacheApi.delete(CacheApiKey.Gear);
        return this.http.post(`${this.apiUrl}/Gear`, bodyNewGear, {
            headers: this.headers,
        });
    }

    public getById(id: number): Observable<GearResp> {
        return this.serviceCacheApi
            .getByKey<Array<GearResp>>(CacheApiKey.Gear)
            .pipe(
                map((data) => {
                    return data.find((f) => f.id === id);
                }),
            );
    }

    public getFromCache(): Observable<Array<GearResp>> {
        return this.serviceCacheApi.getByKey<Array<GearResp>>(CacheApiKey.Gear);
    }
}
