package main

import "k8s.io/klog"

// daemonController is the control/data interface passed on to external system
// controllers, eg. the web interface.
//
// This is a subset of daemon functions limited to a safe, explicit subset.
type daemonController interface {
	loopLoad() int64
	// snapshot returns an internally consistent copy of the daemon state.
	snapshot() *daemonState
	// rpSet enables/disables the roughing pump.
	rpSet(bool)
	// dpSet enables/disables the diffusion pump.
	dpSet(bool)
	// pumpDownPress simulates a pumpdown button press.
	pumpDownPress()
	// ventPRess simulates a vent button press.
	ventPress()
}

func (d *daemon) loopLoad() int64 {
	return d.load.Load()
}

func (d *daemon) snapshot() *daemonState {
	d.mu.RLock()
	ds := d.daemonState
	d.mu.RUnlock()
	return &ds
}

func (d *daemon) rpSet(state bool) {
	d.mu.Lock()
	defer d.mu.Unlock()
	if !state && d.dpOn {
		klog.Errorf("SAFETY: Refusing to disable roughing pump while diffusion pump is active")
		return
	}
	d.rpOn = state
}

func (d *daemon) dpSet(state bool) {
	d.mu.Lock()
	defer d.mu.Unlock()
	if state && (d.safety.failsafe || d.safety.highPressure) {
		klog.Errorf("SAFETY: Refusing to enable diffusion pump with safety alerts present")
		return
	}
	d.dpOn = state
}

func (d *daemon) pumpDownPress() {
	d.mu.Lock()
	defer d.mu.Unlock()
	d.pumpdown.trigger()
}

func (d *daemon) ventPress() {
	d.mu.Lock()
	defer d.mu.Unlock()
	d.vent.trigger()
}
