import { HttpEvent, HttpHandlerFn, HttpRequest, HttpResponse } from '@angular/common/http'
import { AnyObject } from '@core/types'
import { DateUtils } from '@core/utils'
import { Observable } from 'rxjs'
import { map } from 'rxjs/operators'

export function jsonDateInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> {
	return next(req).pipe(
		map((event) => {
			if (event instanceof HttpResponse && event.body) {
				convert(event.body)
			}

			return event
		}),
	)
}

function convert(body: AnyObject): void {
	if (typeof body !== 'object') return body

	for (const key of Object.keys(body)) {
		const value = body[key]
		if (!value) continue

		if (DateUtils.isIsoDateString(value)) {
			body[key] = new Date(value)
		} else if (typeof value === 'object') {
			convert(value)
		}
	}
}
