package door

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

func Writer(d *Door) {
	var handle syscall.Handle = syscall.Handle(d.Config.Comm_handle)
	// handle syscall.Handle, writerChannel *chan string
	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() {
					atomic.StoreInt32(&d.Disconnected, 1)
				}
				log.Println("~Writer")
				return
			} else {
				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")
					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
			}
		}
	*/
}