import type { UserManagerSettings } from 'oidc-client'
import { WebStorageStateStore } from 'oidc-client'

import includes from 'lodash/includes'

import { client } from 'config/clients'
import { AUTH_SERVICE } from 'config/routes'
import { ClientIds, ClientNames } from 'config/clients/types'
import { ENV, stageENV } from 'config/env'

interface Settings extends UserManagerSettings {
  client_id: ClientIds,
  lang?: string,
  nonce?: string,
  redirect_uri: string,
  response_mode: string,
  response_type: string,
  scope?: string,
  state?: string,
}

export const getClientNameByRedirectUri = () => {
  switch (client.name) {
    case ClientNames.Lff:
      return 'lff.instat'
    case ClientNames.Facr:
      return ClientNames.Facr
    case ClientNames.Instat:
      return ClientNames.Instat
    default:
      return ClientNames.Insports
  }
}

const redirectUrl = () => {
  const clientName = getClientNameByRedirectUri()
  switch (true) {
    case (process.env.NODE_ENV === 'development' || client.name === 'lff'):
      return `${window.origin}/redirect`
    case (ENV === 'staging' || ENV === 'preproduction'):
      return `https://${stageENV}.instat.tv/redirect`
    default:
      return `https://${clientName}.tv/redirect`
  }
}

export const getClientSettings = (): Settings => ({
  authority: AUTH_SERVICE,
  automaticSilentRenew: true,
  client_id: client.auth.clientId,
  filterProtocolClaims: false,
  loadUserInfo: false,
  metadataUrl: `${AUTH_SERVICE}/.well-known/openid-configuration${client.auth.metaDataUrlParams || ''}`,
  redirect_uri: redirectUrl(),
  response_mode: 'query',
  response_type: 'id_token token',
  scope: 'openid',
  silent_redirect_uri: `${window.location.origin ?? window.origin}/silent-refresh.html`,
  userStore: new WebStorageStateStore({ store: window.localStorage }),
})

const disableCheckNewDeviceClients = ['lff', 'facr']

export const noCheckNewDevise = includes(disableCheckNewDeviceClients, client.name)
