Source: view/viewScreens/ViewEntitiesSample.js

/** @module */

import CandidateDnViewList from '../vizCandidateDns/CandidateDnViewList.js'
import VoterViewList from '../vizVoters/VoterViewList.js'
import ViewBase from './ViewBase.js'

/**
 * Simulate many sample elections with
 *   candidates in random positions within a distribution, and
 *   voters in a distribution that will be summed over.
 * @param {Screen} screen
 * @param {Menu} menu
 * @param {Changes} changes
 * @param {ViewSettings} viewSettings
 * @constructor
 */
export default function ViewEntitiesSample(entities, screen, menu, changes, simOptions, electionOptionsMan, viewMode, viewSettings) {
    const self = this

    viewMode.viewModes.sample.attach(self)

    ViewBase.call(self, screen, changes, viewSettings)

    // Entities //
    const { candidateDnList, voterShapeList } = entities

    // eslint-disable-next-line max-len
    const candidateDnViewList = new CandidateDnViewList(viewSettings, candidateDnList, screen, simOptions, electionOptionsMan)
    const voterViewList = new VoterViewList(viewSettings, voterShapeList, screen, simOptions, electionOptionsMan)

    candidateDnViewList.attachNewG(self.dragm)
    voterViewList.attachNewG(self.dragm)

    // Main State Machine Functions //

    self.update = (simData) => {
        const { samplingResult } = simData
        // Update players. Run an election. Get result. Visualize result.
        // The election handles any changes.
        // The samplingResult communicates how to visualize the election.

        if (changes.check(['draggables', 'dimensions', 'mode'])) {
            voterViewList.updateViewXY()
            candidateDnViewList.updateViewXY()
        }

        const { pointsChanged, partyWinFraction } = samplingResult

        if (pointsChanged) {
            candidateDnViewList.setCandidateDnWins(partyWinFraction)
        }

        self.clearForeground()
        self.renderForeground()
    }

    self.clickEmpty = () => { }
    self.testVoteView = () => null

    self.renderForeground = () => {
        voterViewList.renderForeground()
        candidateDnViewList.renderForeground()
    }

    self.clearForeground = () => {
        screen.clearForeground()
    }
}