package protocol

import (
	"bytes"
	"encoding/gob"

	"github.com/Queueue0/qpass/internal/models"
)

type PayloadData interface {
	Encode() ([]byte, error)
	Decode([]byte)
}

type SyncData struct {
	UUID      string
	Passwords models.PasswordList
}

func (s *SyncData) Encode() (data []byte, err error) {
	var buf bytes.Buffer
	enc := gob.NewEncoder(&buf)

	err = enc.Encode(s)
	if err != nil {
		return nil, err
	}

	return buf.Bytes(), nil
}

func (s *SyncData) Decode(data []byte) error {
	var buf bytes.Buffer
	_, err := buf.Write(data)
	if err != nil {
		return err
	}

	dec := gob.NewDecoder(&buf)
	err = dec.Decode(s)
	if err != nil {
		return err
	}

	return nil
}

type AuthData struct {
	Token []byte
}

func (d *AuthData) Encode() (data []byte, err error) {
	var buf bytes.Buffer
	enc := gob.NewEncoder(&buf)

	err = enc.Encode(d)
	if err != nil {
		return nil, err
	}

	return buf.Bytes(), nil
}

func (d *AuthData) Decode(data []byte) error {
	var buf bytes.Buffer
	_, err := buf.Write(data)
	if err != nil {
		return err
	}

	dec := gob.NewDecoder(&buf)
	err = dec.Decode(d)
	if err != nil {
		return err
	}

	return nil
}

type NewUserData struct {
	UUID  string
	Token []byte
}

func (d *NewUserData) Encode() (data []byte, err error) {
	var buf bytes.Buffer
	enc := gob.NewEncoder(&buf)

	err = enc.Encode(d)
	if err != nil {
		return nil, err
	}

	return buf.Bytes(), nil
}

func (d *NewUserData) Decode(data []byte) error {
	var buf bytes.Buffer
	_, err := buf.Write(data)
	if err != nil {
		return err
	}

	dec := gob.NewDecoder(&buf)
	err = dec.Decode(d)
	if err != nil {
		return err
	}

	return nil
}