import { HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http'
import { inject } from '@angular/core'
import { HotToastService } from '@ngxpert/hot-toast'
import { AnyObject } from '@core/types'
import { Observable, of, throwError } from 'rxjs'
import { catchError } from 'rxjs/operators'
import { AuthService } from '../services'

export function authInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> {
	const toast = inject(HotToastService)
	const authService = inject(AuthService)

	const headers: AnyObject = {}
	const token = authService.token
	if (token) {
		headers['Authorization'] = `Bearer ${token}`
	}

	const tenantId = authService.tenantId
	if (tenantId) {
		headers['x-tenant-id'] = tenantId
	}

	req = req.clone({ setHeaders: headers })
	return next(req).pipe(
		catchError((error) => {
			if (error instanceof HttpErrorResponse) {
				if (error.status === 401 && !req.url.includes('/auth/login')) {
					toast.error('Session has been expired. Please login again')
					authService.logout()
					return of()
				} else if (error.status == 503) {
					toast.error('Service unavailable. Please try again in some time')
					return of()
				}
				return throwError(() => error.error)
			}
			return throwError(() => error)
		}),
	)
}
