// Copyright 2017 The Fuchsia 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 tftp

import (
	"bytes"
	"encoding/binary"
	"errors"
	"fmt"
	"io"
	"net"
	"strconv"
	"strings"
	"time"
)

const (
	ServerPort = 33340 // tftp server port
	ClientPort = 33341 // tftp client port
)

const (
	timeout      = 2 * time.Second // default client timeout
	retries      = 5               // default number of retries
	blockSize    = 1024            // default block size
	datagramSize = 1028            // default datagram size
	// Throttle bootserver transfers to avoid issues with the Monoprice adapters
	// overflowing buffers when combined with the board performance
	// TODO: Consume a -w value from the build or just use bootserver.
	windowSize = 10 // default window size
)

const (
	opRrq   = uint8(1) // read request (RRQ)
	opWrq   = uint8(2) // write request (WRQ)
	opData  = uint8(3) // data
	opAck   = uint8(4) // acknowledgement
	opError = uint8(5) // error
	opOack  = uint8(6) // option acknowledgment
)

const (
	ErrorUndefined        = uint16(0) // Not defined, see error message (if any)
	ErrorFileNotFound     = uint16(1) // File not found
	ErrorAccessViolation  = uint16(2) // Access violation
	ErrorDiskFull         = uint16(3) // Disk full or allocation exceeded
	ErrorIllegalOperation = uint16(4) // Illegal TFTP operation
	ErrorUnknownID        = uint16(5) // Unknown transfer ID
	ErrorFileExists       = uint16(6) // File already exists
	ErrorNoSuchUser       = uint16(7) // No such user
	ErrorBadOptions       = uint16(8) // Bad options

	// ErrorBusy is a Fuchsia-specific extension to the set of TFTP error
	// codes, meant to indicate that the server cannot currently handle a
	// request, but may be able to at some future time.
	ErrorBusy = uint16(0x143) // 'B' + 'U' + 'S' + 'Y'
)

var (
	ErrShouldWait = fmt.Errorf("target is busy")
)

type Client struct {
	Timeout    time.Duration // duration to wait for the client to ack a packet
	Retries    int           // how many times a packet will be resent
	BlockSize  uint16        // maximum block size used for file transfers
	WindowSize uint16        // window size used for file transfers.
}

func NewClient() *Client {
	return &Client{
		Timeout:    timeout,
		Retries:    retries,
		BlockSize:  blockSize,
		WindowSize: windowSize,
	}
}

type options struct {
	timeout      time.Duration
	blockSize    uint16
	windowSize   uint16
	transferSize int64
}

type Session interface {
	// Size returns the transfer size, if set.
	Size() int64

	// RemoteAddr returns the remote adderss.
	RemoteAddr() net.UDPAddr
}

// Send sends the filename of length size to server addr with the content being
// read from the reader.
//
// If the server being talked to is running on Fuchsia, this method may return
// ErrShouldWait, which indicates that the server is currently not ready to
// handle a new request, but will be in the future. This case should be
// explicitly handled by the caller.
func (c *Client) Send(addr *net.UDPAddr, filename string, size int64) (io.ReaderFrom, error) {
	conn, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv6zero})
	if err != nil {
		return nil, fmt.Errorf("creating socket: %s", err)
	}

	var b bytes.Buffer
	writeRequest(&b, opWrq, filename, &options{
		timeout:      c.Timeout,
		blockSize:    c.BlockSize,
		windowSize:   c.WindowSize,
		transferSize: size,
	})

	opts, addr, err := c.sendRequest(conn, addr, b.Bytes())
	if err != nil {
		conn.Close()
		if err == ErrShouldWait {
			return nil, ErrShouldWait
		}
		return nil, fmt.Errorf("sending WRQ: %s", err)
	}
	b.Reset()
	if opts.transferSize != size {
		err := errors.New("transfer size mismatch")
		abort(conn, addr, ErrorBadOptions, err)
		return nil, err
	}

	return &sender{
		addr:  addr,
		conn:  conn,
		opts:  opts,
		retry: c.Retries,
	}, nil
}

type sender struct {
	addr  *net.UDPAddr
	conn  *net.UDPConn
	opts  *options
	retry int
}

func (s *sender) Size() (n int64) {
	return s.opts.transferSize
}

func (s *sender) RemoteAddr() net.UDPAddr {
	return *s.addr
}

func (s *sender) ReadFrom(r io.Reader) (int64, error) {
	l, err := s.send(r)
	if err != nil {
		abort(s.conn, s.addr, ErrorUndefined, err)
		return l, err
	}
	s.conn.Close()
	return l, nil
}

func (s *sender) send(r io.Reader) (int64, error) {
	var n int64    // total number of bytes read
	var seq uint64 // sequence number denoting the beginning of window
	b := make([]byte, s.opts.blockSize+4)
	ra, ok := r.(io.ReaderAt)
	if !ok {
		return n, fmt.Errorf("%t does not implement io.ReaderAt", r)
	}

Loop:
	for {
	Attempt:
		for attempt := 0; attempt < s.retry; attempt++ {
			for i := uint16(0); uint16(i) < s.opts.windowSize; i++ {
				block := uint16(seq + uint64(i+1))
				// Fill the first byte of the command with an arbitrary value to
				// work around the issue where certain ethernet adapters would
				// refuse to send the packet on retransmission.
				b[0] = uint8(attempt)
				b[1] = opData
				binary.BigEndian.PutUint16(b[2:], block)
				off := (seq + uint64(i)) * uint64(s.opts.blockSize)
				l, err := ra.ReadAt(b[4:], int64(off))
				n += int64(l)
				if err != nil && err != io.EOF {
					return n, fmt.Errorf("reading bytes for block %d: %s", block, err)
				}
				isEOF := err == io.EOF
				if _, err := s.conn.WriteToUDP(b[:l+4], s.addr); err != nil {
					return n, fmt.Errorf("sending block %d: %s", block, err)
				}
				if isEOF {
					break
				}
			}

			s.conn.SetReadDeadline(time.Now().Add(s.opts.timeout))

			for {
				m, addr, err := s.conn.ReadFromUDP(b[:])
				if err != nil {
					if t, ok := err.(net.Error); ok && t.Timeout() {
						continue Attempt
					}
					return n, err
				}
				if m < 4 { // packet too small
					continue
				}
				if !addr.IP.Equal(s.addr.IP) || addr.Port != s.addr.Port {
					continue
				}
				break
			}

			switch b[1] {
			case opAck:
				num := binary.BigEndian.Uint16(b[2:4])
				off := num - uint16(seq) // offset from the start of the window
				if off > 0 && off <= s.opts.windowSize {
					seq += uint64(off)
					if seq*uint64(s.opts.blockSize) >= uint64(s.opts.transferSize) {
						return n, nil // all data transferred, return number of bytes
					}
				}
				continue Loop
			case opError:
				msg, _, _ := netasciiString(b[4:])
				return n, fmt.Errorf("server aborted transfer: %s", msg)
			}
		}
		return n, errors.New("timeout waiting for ACK")
	}
}

// Receive reads the data from filename at the server addr with the content
// being written to the writer.
//
// If the server being talked to is running on a Fuchsia, this method may return
// ErrShouldWait, which indicates that the server is currently not ready to
// handle a new request, but will be in the future. This case should be
// explicitly handled by the caller.
func (c *Client) Receive(addr *net.UDPAddr, filename string) (io.WriterTo, error) {
	conn, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv6zero})
	if err != nil {
		return nil, fmt.Errorf("creating socket: %s", err)
	}

	var b bytes.Buffer
	writeRequest(&b, opRrq, filename, &options{
		blockSize:  c.BlockSize,
		timeout:    c.Timeout,
		windowSize: c.WindowSize,
	})
	opts, addr, err := c.sendRequest(conn, addr, b.Bytes())
	if err != nil {
		conn.Close()
		if err == ErrShouldWait {
			return nil, ErrShouldWait
		}
		return nil, fmt.Errorf("sending RRQ: %s", err)
	}
	b.Reset()
	if err := acknowledge(conn, addr, uint16(0)); err != nil {
		return nil, fmt.Errorf("sending ACK: %s", err)
	}

	return &receiver{
		addr:  addr,
		conn:  conn,
		opts:  opts,
		retry: c.Retries,
	}, nil
}

type receiver struct {
	addr  *net.UDPAddr
	conn  *net.UDPConn
	opts  *options
	retry int
}

func (r *receiver) Size() (n int64) {
	return r.opts.transferSize
}

func (r *receiver) RemoteAddr() net.UDPAddr {
	return *r.addr
}

func (r *receiver) WriteTo(w io.Writer) (int64, error) {
	l, err := r.receive(w)
	if err != nil {
		abort(r.conn, r.addr, ErrorUndefined, err)
		return l, err
	}
	r.conn.Close()
	return l, nil
}

func (r *receiver) receive(w io.Writer) (int64, error) {
	var n int64
	var seq uint64
	recv := make([]byte, r.opts.blockSize+4)

Loop:
	for {
	Attempt:
		for attempt := 0; attempt < r.retry; attempt++ {
			for i := uint16(0); i < uint16(r.opts.windowSize); i++ {
				r.conn.SetReadDeadline(time.Now().Add(r.opts.timeout))

				var m int
				for {
					var addr *net.UDPAddr
					var err error
					m, addr, err = r.conn.ReadFromUDP(recv[m:])
					if err != nil {
						if t, ok := err.(net.Error); ok && t.Timeout() {
							acknowledge(r.conn, r.addr, uint16(seq))
							continue Attempt
						}
						return n, err
					}
					if m < 4 { // packet too small
						continue
					}
					if !addr.IP.Equal(r.addr.IP) || addr.Port != r.addr.Port {
						continue
					}
					break
				}

				n += int64(m)

				switch recv[1] {
				case opData:
					if num := binary.BigEndian.Uint16(recv[2:4]); num != uint16(seq)+1 {
						if num-uint16(seq) < uint16(r.opts.windowSize) {
							acknowledge(r.conn, r.addr, uint16(seq))
						}
						continue Loop
					}
					seq++
					if _, err := w.Write(recv[4:m]); err != nil {
						return n, fmt.Errorf("writing bytes for block %d: %v", seq, err)
					}
					if m < int(r.opts.blockSize+4) {
						acknowledge(r.conn, r.addr, uint16(seq))
						return n, nil
					}
				case opError:
					msg, _, _ := netasciiString(recv[4:])
					return n, fmt.Errorf("server aborted transfer: %s", msg)
				}
			}
			// TODO: this should be addr
			acknowledge(r.conn, r.addr, uint16(seq))
			continue Loop
		}
		return n, errors.New("timeout waiting for DATA")
	}
}

func writeRequest(b *bytes.Buffer, op uint8, filename string, o *options) {
	b.WriteByte(0)
	b.WriteByte(op)
	writeString(b, filename)
	// Only support octet mode, because in practice that's the
	// only remaining sensible use of TFTP.
	writeString(b, "octet")
	writeOption(b, "tsize", o.transferSize)
	writeOption(b, "blksize", int64(o.blockSize))
	writeOption(b, "timeout", int64(o.timeout/time.Second))
	writeOption(b, "windowsize", int64(o.windowSize))
}

func writeOption(b *bytes.Buffer, name string, value int64) {
	writeString(b, name)
	writeString(b, strconv.FormatInt(value, 10))
}

func writeString(b *bytes.Buffer, s string) {
	b.WriteString(s)
	b.WriteByte(0)
}

func (c *Client) sendRequest(conn *net.UDPConn, addr *net.UDPAddr, b []byte) (*options, *net.UDPAddr, error) {
	for attempt := 0; attempt < c.Retries; attempt++ {
		if _, err := conn.WriteToUDP(b, addr); err != nil {
			return nil, nil, err
		}

		conn.SetReadDeadline(time.Now().Add(c.Timeout))

		var recv [256]byte
		for {
			n, addr, err := conn.ReadFromUDP(recv[:])
			if err != nil {
				if t, ok := err.(net.Error); ok && t.Timeout() {
					break
				}
				return nil, nil, err
			}

			if n < 4 { // packet too small
				continue
			}
			switch recv[1] {
			case opError:
				// Handling ErrorBusy here is a Fuchsia-specific extension.
				if code := binary.BigEndian.Uint16(recv[2:4]); code == ErrorBusy {
					return nil, addr, ErrShouldWait
				}
				msg, _, _ := netasciiString(recv[4:n])
				return nil, addr, fmt.Errorf("server aborted transfer: %s", msg)
			case opOack:
				options, err := parseOACK(recv[2:n])
				return options, addr, err
			}
		}
	}

	return nil, nil, errors.New("timeout waiting for OACK")
}

func parseOACK(bs []byte) (*options, error) {
	var o options

	for len(bs) > 0 {
		opt, rest, err := netasciiString(bs)
		if err != nil {
			return nil, fmt.Errorf("reading option name: %s", err)
		}
		bs = rest
		val, rest, err := netasciiString(bs)
		if err != nil {
			return nil, fmt.Errorf("reading option %q value: %s", opt, err)
		}
		bs = rest
		switch strings.ToLower(opt) {
		case "blksize":
			size, err := strconv.ParseUint(val, 10, 16)
			if err != nil {
				return nil, fmt.Errorf("unsupported block size %q", val)
			}
			o.blockSize = uint16(size)
		case "timeout":
			seconds, err := strconv.ParseUint(val, 10, 8)
			if err != nil {
				return nil, fmt.Errorf("unsupported timeout %q", val)
			}
			o.timeout = time.Second * time.Duration(seconds)
		case "tsize":
			size, err := strconv.ParseUint(val, 10, 64)
			if err != nil {
				return nil, fmt.Errorf("unsupported transfer size %q", val)
			}
			o.transferSize = int64(size)
		case "windowsize":
			size, err := strconv.ParseUint(val, 10, 16)
			if err != nil {
				return nil, fmt.Errorf("unsupported window size %q", val)
			}
			o.windowSize = uint16(size)
		}
	}

	return &o, nil
}

func acknowledge(conn *net.UDPConn, addr *net.UDPAddr, seq uint16) error {
	var b bytes.Buffer
	b.WriteByte(0)
	b.WriteByte(opAck)
	if err := binary.Write(&b, binary.BigEndian, seq); err != nil {
		return fmt.Errorf("writing seqnum: %v", err)
	}
	if _, err := conn.WriteToUDP(b.Bytes(), addr); err != nil {
		return err
	}
	return nil
}

func abort(conn *net.UDPConn, addr *net.UDPAddr, code uint16, err error) error {
	var b bytes.Buffer
	b.WriteByte(0)
	b.WriteByte(opError)
	if binary.Write(&b, binary.BigEndian, code); err != nil {
		return fmt.Errorf("writing code: %v", err)
	}
	b.WriteString(err.Error())
	b.WriteByte(0)
	if _, err := conn.WriteToUDP(b.Bytes(), addr); err != nil {
		return err
	}
	conn.Close()
	return nil
}

func netasciiString(bs []byte) (string, []byte, error) {
	for i, b := range bs {
		if b == 0 {
			return string(bs[:i]), bs[i+1:], nil
		} else if b < 0x20 || b > 0x7e {
			return "", nil, fmt.Errorf("invalid netascii byte %q at offset %d", b, i)
		}
	}
	return "", nil, errors.New("no null terminated string found")
}

// WindowReader supports reading bytes from an underlying stream using
// fixed sized blocks and rewinding back up to slots blocks.
type WindowReader struct {
	buf     []byte    // buffer space
	len     []int     // len of data written to each slot
	reader  io.Reader // underlying reader object
	current int       // current block to be read
	head    int       // head of buffer
	slots   int       // number of slots
	size    int       // size of the slot
}

// NewWindowReader creates a new reader with slots blocks of size.
func NewWindowReader(reader io.Reader, slots int, size int) *WindowReader {
	return &WindowReader{
		buf:    make([]byte, slots*size),
		len:    make([]int, slots),
		reader: reader,
		slots:  slots,
		size:   size,
	}
}

func (r *WindowReader) Read(p []byte) (int, error) {
	slot := r.current % r.slots
	offset := slot * r.size

	if r.current != r.head {
		len := offset + r.len[slot]
		n := copy(p, r.buf[offset:len])
		r.current++
		return n, nil
	}

	n, err := r.reader.Read(p)
	if err != nil {
		return n, err
	}
	n = copy(r.buf[offset:offset+n], p[:n])
	r.len[slot] = n

	r.current++
	r.head = r.current
	return n, err
}

// Unread rewinds the reader back by n blocks.
func (r *WindowReader) Unread(n int) {
	r.current -= n
}
