const ACCESS = 'fm.access_token'
const REFRESH = 'fm.refresh_token'
const CLIENT_ID = 'food-market-web'
// SuperAdmin override живёт в localStorage и не сбрасывается при logout —
// иначе после login другого юзера orphan-override провоцирует "Я в режиме
// супер-админа" под обычным аккаунтом. Чистим явно при login/logout.
const ORG_OVERRIDE = 'superAdminAsOrg'
const EDIT_MODE = 'superAdminEditMode'

export interface TokenResponse {
  access_token: string
  refresh_token?: string
  expires_in: number
  token_type: string
  id_token?: string
}

export function getAccessToken(): string | null {
  return localStorage.getItem(ACCESS)
}

export function getRefreshToken(): string | null {
  return localStorage.getItem(REFRESH)
}

export function storeTokens(tokens: TokenResponse) {
  localStorage.setItem(ACCESS, tokens.access_token)
  if (tokens.refresh_token) {
    localStorage.setItem(REFRESH, tokens.refresh_token)
  }
}

export function clearTokens() {
  localStorage.removeItem(ACCESS)
  localStorage.removeItem(REFRESH)
  localStorage.removeItem(ORG_OVERRIDE)
  localStorage.removeItem(EDIT_MODE)
}

export async function login(username: string, password: string): Promise<TokenResponse> {
  // Перед login сбрасываем все клиентские флаги предыдущей сессии — иначе
  // Override и edit-mode прошлого SuperAdmin'а останутся активными для
  // новoго юзера и он окажется в "режиме супер-админа" без на то прав.
  clearTokens()
  const body = new URLSearchParams({
    grant_type: 'password',
    username,
    password,
    client_id: CLIENT_ID,
    scope: 'openid profile email roles api offline_access',
  })
  const res = await fetch('/connect/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body,
  })
  if (!res.ok) {
    const data = await res.json().catch(() => ({}))
    throw new Error(data.error_description ?? data.error ?? 'Login failed')
  }
  const tokens: TokenResponse = await res.json()
  storeTokens(tokens)
  return tokens
}

export async function refreshTokens(): Promise<string | null> {
  const rt = getRefreshToken()
  if (!rt) return null
  const body = new URLSearchParams({
    grant_type: 'refresh_token',
    refresh_token: rt,
    client_id: CLIENT_ID,
  })
  const res = await fetch('/connect/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body,
  })
  if (!res.ok) {
    clearTokens()
    return null
  }
  const tokens: TokenResponse = await res.json()
  storeTokens(tokens)
  return tokens.access_token
}

export function isAuthenticated(): boolean {
  return getAccessToken() !== null
}

export function logout() {
  clearTokens()
  window.location.href = '/login'
}
