import { Injectable } from '@angular/core';
import {
    HttpInterceptor,
    HttpRequest,
    HttpHandler,
    HttpEvent, HttpResponse,
} from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class PropertyInterceptor implements HttpInterceptor {
    intercept(
        request: HttpRequest<any>,
        next: HttpHandler
    ): Observable<HttpEvent<any>> {
        return next.handle(request).pipe(
            map((event) => {
                if (event instanceof HttpResponse && event.body) {
                    let modifiedBody;

                    if (Array.isArray(event.body)) {
                        // Wenn es sich um ein Array von Ressourcen handelt
                        modifiedBody = this.mapDataItems(event.body);
                    } else if (event.body['hydra:member']) {
                        // Wenn es sich um eine Ressourcenkollektion handelt
                        modifiedBody = {
                            ...event.body,
                            'hydra:member': this.mapDataItems(
                                event.body['hydra:member']
                            ),
                        };
                    } else {
                        // Wenn es sich um eine einzelne Ressource handelt
                        modifiedBody = this.mapDataItem(event.body);
                    }

                    return event.clone({
                        body: modifiedBody,
                    });
                }

                return event;
            })
        );
    }

    private mapDataItems(items: any[]): any[] {
        return items.map((item) => this.mapDataItem(item));
    }

    private mapDataItem(item: any): any {
        if (item && typeof item === 'object') {
            // Wenn es ein Objekt ist, überprüfe rekursiv
            const mappedItem = { ...item };

            for (const key in mappedItem) {
                if (mappedItem.hasOwnProperty(key) && key === '@id') {
                    mappedItem['id'] = mappedItem[key];
                    delete mappedItem[key];
                } else if (Array.isArray(mappedItem[key])) {
                    // Wenn es sich um ein Array handelt, überprüfe rekursiv jedes Element
                    mappedItem[key] = this.mapDataItems(mappedItem[key]);
                } else if (mappedItem[key] && typeof mappedItem[key] === 'object') {
                    // Wenn es ein Objekt ist, überprüfe rekursiv
                    mappedItem[key] = this.mapDataItem(mappedItem[key]);
                }
            }

            return mappedItem;
        }

        return item;
    }
}
