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 {
		/*
			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)
				}

				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
					*/
				}
			}
		}
	}

	/*
		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
			}
		}
	*/
}