package wireguard

import (
	"encoding/hex"
	"net/netip"

	"github.com/xtls/xray-core/common/protocol"
	"google.golang.org/protobuf/proto"
)

func (p *PeerConfig) AsAccount() (protocol.Account, error) {
	pub, err := ParseKey(p.PublicKey)
	if err != nil {
		return nil, err
	}

	allowedIPs := make([]netip.Prefix, 0, len(p.AllowedIps))
	for i := range p.AllowedIps {
		p, err := netip.ParsePrefix(p.AllowedIps[i])
		if err != nil {
			return nil, err
		}
		allowedIPs = append(allowedIPs, p)
	}

	return &MemoryAccount{
		Pub:          *pub,
		AllowedIPs:   allowedIPs,
		PreSharedKey: p.PreSharedKey,
		KeepAlive:    p.KeepAlive,
	}, nil
}

type MemoryAccount struct {
	Pub          [32]byte
	AllowedIPs   []netip.Prefix
	PreSharedKey string
	KeepAlive    string
}

func (a *MemoryAccount) Equals(other protocol.Account) bool {
	if b, ok := other.(*MemoryAccount); ok {
		return a.Pub == b.Pub
	}
	return false
}

func (a *MemoryAccount) ToProto() proto.Message {
	allowedIPs := make([]string, 0, len(a.AllowedIPs))
	for i := range a.AllowedIPs {
		allowedIPs = append(allowedIPs, a.AllowedIPs[i].String())
	}

	return &PeerConfig{
		PublicKey:    hex.EncodeToString(a.Pub[:]),
		AllowedIps:   allowedIPs,
		PreSharedKey: a.PreSharedKey,
		KeepAlive:    a.KeepAlive,
	}
}
