package model

import (
	"go-nkode/util"
)

type User struct {
	Id                 UserId
	CustomerId         CustomerId
	Username           Username
	EncipheredPasscode EncipheredNKode
	Kp                 KeypadDimension
	UserKeys           UserCipherKeys
	Interface          UserInterface
	Renew              bool
}

func (u *User) DecipherMask(setVals []uint64, passcodeLen int) ([]uint64, error) {
	return u.UserKeys.DecipherMask(u.EncipheredPasscode.Mask, setVals, passcodeLen)
}

func (u *User) RenewKeys(setXor []uint64, attrXor []uint64) error {
	u.Renew = true
	var err error
	u.UserKeys.SetKey, err = util.XorLists(setXor[:u.Kp.AttrsPerKey], u.UserKeys.SetKey)
	if err != nil {
		panic(err)
	}
	u.UserKeys.AlphaKey, err = util.XorLists(attrXor[:u.Kp.TotalAttrs()], u.UserKeys.AlphaKey)
	return err
}

func (u *User) RefreshPasscode(passcodeAttrIdx []int, customerAttributes CustomerAttributes) error {
	setVals, err := customerAttributes.SetValsForKp(u.Kp)
	newKeys, err := NewUserCipherKeys(&u.Kp, setVals, u.UserKeys.MaxNKodeLen)
	if err != nil {
		return err
	}

	encipheredPasscode, err := newKeys.EncipherNKode(passcodeAttrIdx, customerAttributes)
	if err != nil {
		return err
	}

	u.UserKeys = *newKeys
	u.EncipheredPasscode = *encipheredPasscode
	u.Renew = false
	return nil
}

func (u *User) GetLoginInterface() ([]int, error) {
	err := u.Interface.PartialInterfaceShuffle()

	if err != nil {
		return nil, err
	}
	return u.Interface.IdxInterface, nil
}
