import { combineEpics } from 'redux-observable'
import * as uuid from 'uuid'
import { AppState } from '../../root/reducers'
import { cosmoApiEpics } from '@lml/cosmo-redux-api'
import { cosmoUiAuthEpic, getAuthHeaders } from '@lml/cosmo-ui-auth'
import { createCosmoUiEpics, CosmoUiConfig } from 'cosmoui'
import * as RxHTTP from 'redux-rx-http'
import { pusherEpics } from './pusher'
import { coreUiEpics } from '@lml/core-ui'
import { config } from '../../config'
import { authEpics } from '../../auth/epics'

const mkTraceID = () => `WEB-UI-${uuid()}`

export const mkHeaders = (state: AppState) => ({
    ...getAuthHeaders(state, 'Auth'),
    'Source': 'ui',
    'X-Trace-Id': mkTraceID(),
    'Content-Type': 'application/json',
})

export const mkHttpConfig = (state: AppState): RxHTTP.RxHttpRequestBase => ({
    json: true,
    headers: mkHeaders(state),
    baseUrl: `https://${config.API_HOST}`,
})

const rxHttpEpic = RxHTTP.createRxHttpEpic(mkHttpConfig)

const cosmoConfig: CosmoUiConfig = {
    edq: {
        token: config.EDQ_TOKEN,
        url: config.EDQ_URL,
    },
    gmaps: {
        url: config.GOOGLE_MAPS_API_URL,
        key: config.GOOGLE_MAPS_API_KEY,
    },
}

export interface EpicDependencies {
    fetch: RxHTTP.Fetch,
}

export const epicDependencies: EpicDependencies = {
    fetch,
}

export const rootEpic = combineEpics(
    // external
    cosmoApiEpics,
    createCosmoUiEpics(cosmoConfig),
    rxHttpEpic,
    cosmoUiAuthEpic,
    pusherEpics,
    coreUiEpics,
    authEpics,
)
