package door

import (
	"log"
	"strings"
	"sync/atomic"
	"syscall"
)

// https://go101.org/article/channel-closing.html

func Writer(d *Door) {
	var handle int = d.Config.Comm_handle
	log.Println("Writer")
	defer d.wg.Done()
	for {
		select {
		case <-d.closeChannel:
			close(d.writerChannel)
			log.Println("~Writer")
			return
		default:
		}

		select {
		case <-d.closeChannel:
			close(d.writerChannel)
			log.Println("~Writer")
			return
		case output, ok := <-d.writerChannel:
			if !ok {
				log.Println("closeChannel")
				if !d.Disconnect() {
					// d.Disconnected = true
					atomic.StoreInt32(&d.Disconnected, 1)
					// if !ok, the channel is already closed...
					// close(d.writerChannel)
				}
				log.Println("~Writer")
				return

				//				d.closeChannel <- true
				//				continue
			} else {
				// log.Println("output")
				/* Handle cases where we're updating a portion of the screen.
				When we SavePos, also save/restore the last color set.
				*/
				if strings.HasSuffix(output, RestorePos) {
					output += Color(d.LastColor...)

				} else {
					d.UpdateLastColor(output, &d.LastColor)
				}
				// log.Println("write output")
				buffer := []byte(output)
				n, err := syscall.Write(handle, buffer)
				if (err != nil) || (n != len(buffer)) {
					log.Println("closeChannel")
					if !d.Disconnect() {
						// d.Disconnected = true
						atomic.StoreInt32(&d.Disconnected, 1)
						close(d.writerChannel)
					}
					log.Println("~Writer")
					return
				}
			}
		}
	}
}

/*
func Writer(handle int, writerChannel *chan string) {
	for output := range *writerChannel {
		buffer := []byte(output)
		n, err := syscall.Write(handle, buffer)
		if (err != nil) || (n != len(buffer)) {
			close(*writerChannel)
			break
		}
	}
}
*/