package dht

import (
	"math"
	"math/big"
)

type int160 struct {
	bits [20]uint8
}

func (me *int160) AsByteArray() [20]byte {
	return me.bits
}

func (me *int160) ByteString() string {
	return string(me.bits[:])
}

func (me *int160) BitLen() int {
	var a big.Int
	a.SetBytes(me.bits[:])
	return a.BitLen()
}

func (me *int160) SetBytes(b []byte) {
	n := copy(me.bits[:], b)
	if n != 20 {
		panic(n)
	}
}

func (me int160) Bytes() []byte {
	return me.bits[:]
}

func (l int160) Cmp(r int160) int {
	for i := range l.bits {
		if l.bits[i] < r.bits[i] {
			return -1
		} else if l.bits[i] > r.bits[i] {
			return 1
		}
	}
	return 0
}

func (me *int160) SetMax() {
	for i := range me.bits {
		me.bits[i] = math.MaxUint8
	}
}

func (me *int160) Xor(a, b *int160) {
	for i := range me.bits {
		me.bits[i] = a.bits[i] ^ b.bits[i]
	}
}

func (me *int160) IsZero() bool {
	for _, b := range me.bits {
		if b != 0 {
			return false
		}
	}
	return true
}

func int160FromBytes(b []byte) (ret int160) {
	ret.SetBytes(b)
	return
}

func int160FromByteArray(b [20]byte) (ret int160) {
	ret.SetBytes(b[:])
	return
}

func int160FromByteString(s string) (ret int160) {
	ret.SetBytes([]byte(s))
	return
}

func distance(a, b *int160) (ret int160) {
	ret.Xor(a, b)
	return
}
