package door

import (
	"fmt"
	"log"
	"strings"
	"syscall"
)

func Writer(d *Door) {
	var handle syscall.Handle = syscall.Handle(d.WRITEFD) // Config.Comm_handle)
	// handle syscall.Handle, writerChannel *chan string
	log.Println("Writer")
	defer d.wg.Done()
	var Closed bool = false

	for output := range d.writerChannel {
		// 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")
					d.writerMutex.Lock()
					if !d.WriterClosed {
						d.WriterClosed = true
					}
					d.writerMutex.Unlock()
					log.Println("~Writer")
					return
				} else {
		*/
		if output == "" {
			Closed = true
			continue
		}

		if Closed {
			log.Println("Ignoring write output.")
			continue
		}

		if strings.HasSuffix(output, RestorePos) {
			output += Color(d.LastColor...)
		} else {
			d.UpdateLastColor(output, &d.LastColor)
		}

		var l uint32 = uint32(len(output))
		var buffer []byte = []byte(output)
		WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]}

		var UitnZero_1 uint32 = uint32(0)
		var DataWrite uint32 = uint32(0)
		var err error
		err = syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil)
		if err != nil {
			fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err)
		} else {
			log.Printf("write %d bytes\n", DataWrite)
		}

		if (err != nil) || (l != DataWrite) {
			log.Println("CloseChannel")
			Closed = true
			d.writerMutex.Lock()
			if !d.WriterClosed {
				d.WriterClosed = true
			}
			d.writerMutex.Unlock()
			/*
				if !d.Disconnect() {
					atomic.StoreInt32(&d.Disconnected, 1)
					close(d.writerChannel)
				}
				log.Println("~Writer")
				return
			*/
			// }
			// }
		}
	}

	log.Println("closeChannel")
	d.writerMutex.Lock()
	if !d.WriterClosed {
		d.WriterClosed = true
	}
	d.writerMutex.Unlock()
	log.Println("~Writer")
	// return

	/*
		for output := range *writerChannel {
			l := uint32(len(output))
			buffer := []byte(output)
			WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]}
			UitnZero_1 := uint32(0)
			DataWrite := uint32(0)
			err := syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil)
			if err != nil {
				fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err)
			}

			if (err != nil) || (l != DataWrite) {
				close(*writerChannel)
				break
			}
		}
	*/
}