package main

import (
	"fmt"
	"math/rand"
	"time"
)

type Meritev struct {
	vrsta    string
	vrednost float32
}

// Funkcija, ki simulira delovanje senzorja.
// Vsakih nekaj milisekund pošlje novo vrednost v kanal.
func senzor(ime string, interval time.Duration, ch chan<- Meritev) {
	for {
		vrednost := float32(0.0)
		switch ime {
		case "temperatura":
			vrednost = rand.Float32()*60 - 30
		case "vlaga":
			vrednost = rand.Float32() * 100
		case "tlak":
			vrednost = rand.Float32()*150 + 900
		}
		m := Meritev{ime, vrednost}
		ch <- m
		time.Sleep(interval)
	}
}

// Funkcija, ki čaka na pritisk tipke Enter
func cakanjeTipka(konec chan<- bool) {
	fmt.Scanln()
	konec <- true
}

func izpisiMeritev(m Meritev) {
	switch m.vrsta {
	case "temperatura":
		fmt.Printf("Temperatura: %.1f °C\n", m.vrednost)
	case "vlaga":
		fmt.Printf("Vlažnost: %.1f %%\n", m.vrednost)
	case "tlak":
		fmt.Printf("Tlak: %.0f mbar\n", m.vrednost)
	}
}

func main() {

	meritve := make(chan Meritev, 3)
	konec := make(chan bool)

	intervalMeritev := 100 * time.Millisecond
	intervalNeodzivnost := 5 * time.Second

	go senzor("temperatura", intervalMeritev, meritve)
	go senzor("vlaga", intervalMeritev, meritve)
	go senzor("tlak", intervalMeritev, meritve)

	go cakanjeTipka(konec)

	neodzivnost := time.After(intervalNeodzivnost)
	for {
		select {
		case m := <-meritve:
			izpisiMeritev(m)
			neodzivnost = time.After(intervalNeodzivnost)
		case <-konec:
			return
		case <-neodzivnost:
			fmt.Println("Vremenska postaja se ne odziva.")
			return
		default:
			time.Sleep(50 * time.Millisecond)
		}
	}
}
