// Copyright 2014 The gocui Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"os"

	"go.wit.com/lib/widget"
	"go.wit.com/log"
)

// sets defaults and establishes communication
// to this toolkit from the wit/gui golang package
func init() {
	log.Log(INFO, "Init() of awesome-gocui")

	// init the config struct default values
	Set(&me, "default")

	pluginChan = make(chan widget.Action)

	log.Log(NOW, "Init() start pluginChan")
	go catchActionChannel()
	log.Sleep(.1) // probably not needed, but in here for now under development
	go main()
	log.Sleep(.1) // probably not needed, but in here for now under development
}

/*
recieves requests from the program to do things like:
* add new widgets
* change the text of a label
* etc..
*/
func catchActionChannel() {
	log.Log(INFO, "catchActionChannel() START")
	for {
		log.Log(INFO, "catchActionChannel() infinite for() loop restarted select on channel")
		select {
		case a := <-pluginChan:
			if me.baseGui == nil {
				// something went wrong initializing the gocui
				log.Log(ERROR, "ERROR: console did not initialize")
				continue
			}
			log.Log(INFO, "catchActionChannel()", a.WidgetId, a.ActionType, a.WidgetType, a.ProgName)
			action(&a)
		}
	}
}

func Exit() {
	// TODO: what should actually happen here?
	log.Log(NOW, "Exit() here. doing standardExit()")
	standardExit()
}

func standardExit() {
	log.Log(NOW, "standardExit() doing baseGui.Close()")
	me.baseGui.Close()
	log.Log(NOW, "standardExit() doing outf.Close()")
	outf.Close()
	// log(true, "standardExit() setOutput(os.Stdout)")
	// setOutput(os.Stdout)
	log.Log(NOW, "standardExit() send back Quit()")
	go sendBackQuit() // don't stall here in case the
	// induces a delay in case the callback channel is broken
	log.Sleep(1)
	log.Log(NOW, "standardExit() exit()")
	os.Exit(0)
}
func sendBackQuit() {
	// send 'Quit' back to the program (?)
	var a widget.Action
	a.ActionType = widget.UserQuit
	callback <- a
}

var outf *os.File

func main() {
	var err error
	log.Log(INFO, "main() start Init()")

	outf, err = os.OpenFile("/tmp/witgui.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		log.Error(err, "error opening file: %v")
		os.Exit(0)
	}
	os.Stdout = outf
	defer outf.Close()

	// setOutput(outf)
	// log("This is a test log entry")

	ferr, _ := os.OpenFile("/tmp/witgui.err", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0664)
	os.Stderr = ferr
	gocuiMain()

	log.Log(NOW, "MouseMain() closed")
	standardExit()
}
