package paych

import (
	"github.com/filecoin-project/go-address"
	"github.com/filecoin-project/go-state-types/abi"

	builtin{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin"
	init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init"
	paych{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/paych"

	"github.com/filecoin-project/lotus/chain/actors"
	init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init"
	"github.com/filecoin-project/lotus/chain/types"
)

type message{{.v}} struct{ from address.Address }

func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) {
	params, aerr := actors.SerializeParams(&paych{{.v}}.ConstructorParams{From: m.from, To: to})
	if aerr != nil {
		return nil, aerr
	}
	enc, aerr := actors.SerializeParams(&init{{.v}}.ExecParams{
		CodeCID:           builtin{{.v}}.PaymentChannelActorCodeID,
		ConstructorParams: params,
	})
	if aerr != nil {
		return nil, aerr
	}

	return &types.Message{
		To:     init_.Address,
		From:   m.from,
		Value:  initialAmount,
		Method: builtin{{.v}}.MethodsInit.Exec,
		Params: enc,
	}, nil
}

func (m message{{.v}}) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) {
	params, aerr := actors.SerializeParams(&paych{{.v}}.UpdateChannelStateParams{
	{{if (ge .v 7)}}
	    Sv:     toV{{.v}}SignedVoucher(*sv),
	{{else}}
		Sv:     *sv,
	{{end}}
		Secret: secret,
	})
	if aerr != nil {
		return nil, aerr
	}

	return &types.Message{
		To:     paych,
		From:   m.from,
		Value:  abi.NewTokenAmount(0),
		Method: builtin{{.v}}.MethodsPaych.UpdateChannelState,
		Params: params,
	}, nil
}

func (m message{{.v}}) Settle(paych address.Address) (*types.Message, error) {
	return &types.Message{
		To:     paych,
		From:   m.from,
		Value:  abi.NewTokenAmount(0),
		Method: builtin{{.v}}.MethodsPaych.Settle,
	}, nil
}

func (m message{{.v}}) Collect(paych address.Address) (*types.Message, error) {
	return &types.Message{
		To:     paych,
		From:   m.from,
		Value:  abi.NewTokenAmount(0),
		Method: builtin{{.v}}.MethodsPaych.Collect,
	}, nil
}
