// License: LGPL-3.0-or-later
const request = require('../../../common/super-agent-frp')
const view = require('vvvview')
const flyd = require('flyd')
const scanMerge = require('flyd/module/scanmerge')
const flatMap = require('flyd/module/flatmap')
const Im = require('immutable')
const Map = Im.Map
const fromJS = Im.fromJS

const list = require('./supporter-list.es6')

var el = document.querySelector('.js-view-supporters')
var state = Map({loading: true})
var listView = view(list.root, el, state)

// Given a query object, return an ajax stream
const request_index = query =>
	request
		.get(`/nonprofits/${app.nonprofit_id}/campaigns/${ENV.campaignID}/admin/supporters`)
		.query(query)
		.perform()

var $searchResponses = flatMap(request_index, list.$streams.searches)

const appendPage = (state, resp) => {
	var oldSupporters = state.getIn(['supporters', 'data'])
	var newData = fromJS(resp.body)
	if(oldSupporters) newData = newData.set('data', oldSupporters.concat(newData.get('data')))
	return state
		.set('supporters', newData)
		.set('moreLoading', false)
		.set('loading', false)
}

const $showMorePages = flyd.scan(
	count => count + 1
	, 1
	, list.$streams.showMore)

const $newPages = flatMap(
	  page => request_index({page: page})
	, $showMorePages)

const setResults = (state, resp) =>
	state.set('supporters', fromJS(resp.body)).set('loading', false)

var $giftLevelResponses =
	request.get(`/nonprofits/${app.nonprofit_id}/campaigns/${ENV.campaignID}/admin/campaign_gift_options`).perform()

var $state = flyd.immediate(scanMerge([
	[list.$streams.searches, state => state.set('loading', true).set('isSearching', true)],
	[list.$streams.showMore, state => state.set('moreLoading', true).set('page', state.get('page') + 1)],
	[$newPages, appendPage],
	[$searchResponses, setResults],
	[$giftLevelResponses, (state, resp) => state.set('gift_levels', fromJS(resp.body))],
], state))

window.$state =$state
window.$giftLevelResponses= $giftLevelResponses

flyd.map(listView, $state)