import { HttpInterceptorFn } from '@angular/common/http'; import { inject } from '@angular/core'; import { LocationService } from '../services/location.service'; import { LanguageService } from '../services/language.service'; import { AuthService } from '../services/auth.service'; import { environment } from '../../environments/environment'; /** Map internal language codes to API header values */ const LANG_HEADER_MAP: Record = { 'ru': 'RU', 'en': 'EN', 'hy': 'AM', }; /** Map region IDs to API header values */ const REGION_HEADER_MAP: Record = { 'moscow': 'Moscow', 'spb': 'ST. Petersburg', 'yerevan': 'Yerevan', }; const SESSION_STORAGE_KEY = 'web_session_id'; /** Generate a 32-char hex string (GUID without dashes) */ function generateSessionId(): string { const bytes = new Uint8Array(16); crypto.getRandomValues(bytes); return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join(''); } /** Get or create a persistent anonymous session ID */ function getAnonymousSessionId(): string { let id = localStorage.getItem(SESSION_STORAGE_KEY); if (!id || id.length !== 32) { id = generateSessionId(); localStorage.setItem(SESSION_STORAGE_KEY, id); } return id; } export const apiHeadersInterceptor: HttpInterceptorFn = (req, next) => { if (!req.url.startsWith(environment.apiUrl)) { return next(req); } const locationService = inject(LocationService); const languageService = inject(LanguageService); const authService = inject(AuthService); const regionId = locationService.regionId(); const lang = languageService.currentLanguage(); const currency = languageService.currentCurrency(); const session = authService.session(); let headers = req.headers; if (regionId) { headers = headers.set('X-Region', REGION_HEADER_MAP[regionId] ?? regionId); } if (lang) { headers = headers.set('X-Language', LANG_HEADER_MAP[lang] ?? lang.toUpperCase()); } headers = headers.set('Currency', currency || 'RUB'); headers = headers.set('WebSessionID', session?.sessionId || getAnonymousSessionId()); return next(req.clone({ headers })); };