package core

import (
	"github.com/nspcc-dev/neo-go/pkg/util"
	"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
)

// opcodePrice returns the deployment prices of specified opcodes
func opcodePrice(opcodes ...opcode.Opcode) util.Fixed8 {
	var result util.Fixed8
	for _, op := range opcodes {
		result += util.Fixed8(prices[op])
	}
	return result
}

var prices = map[opcode.Opcode]int{
	opcode.PUSHINT8:   30,
	opcode.PUSHINT32:  30,
	opcode.PUSHINT64:  30,
	opcode.PUSHINT16:  30,
	opcode.PUSHINT128: 120,
	opcode.PUSHINT256: 120,
	opcode.PUSHA:      120,
	opcode.PUSHNULL:   30,
	opcode.PUSHDATA1:  180,
	opcode.PUSHDATA2:  13000,
	opcode.PUSHDATA4:  110000,
	opcode.PUSHM1:     30,
	opcode.PUSH0:      30,
	opcode.PUSH1:      30,
	opcode.PUSH2:      30,
	opcode.PUSH3:      30,
	opcode.PUSH4:      30,
	opcode.PUSH5:      30,
	opcode.PUSH6:      30,
	opcode.PUSH7:      30,
	opcode.PUSH8:      30,
	opcode.PUSH9:      30,
	opcode.PUSH10:     30,
	opcode.PUSH11:     30,
	opcode.PUSH12:     30,
	opcode.PUSH13:     30,
	opcode.PUSH14:     30,
	opcode.PUSH15:     30,
	opcode.PUSH16:     30,
	opcode.NOP:        30,
	opcode.JMP:        70,
	opcode.JMPL:       70,
	opcode.JMPIF:      70,
	opcode.JMPIFL:     70,
	opcode.JMPIFNOT:   70,
	opcode.JMPIFNOTL:  70,
	opcode.JMPEQ:      70,
	opcode.JMPEQL:     70,
	opcode.JMPNE:      70,
	opcode.JMPNEL:     70,
	opcode.JMPGT:      70,
	opcode.JMPGTL:     70,
	opcode.JMPGE:      70,
	opcode.JMPGEL:     70,
	opcode.JMPLT:      70,
	opcode.JMPLTL:     70,
	opcode.JMPLE:      70,
	opcode.JMPLEL:     70,
	opcode.CALL:       22000,
	opcode.CALLL:      22000,
	opcode.CALLA:      22000,
	opcode.ABORT:      30,
	opcode.ASSERT:     30,
	opcode.THROW:      22000,
	//opcode.TRY: 100,
	//opcode.TRY_L: 100,
	//opcode.ENDTRY: 100,
	//opcode.ENDTRY_L: 100,
	//opcode.ENDFINALLY: 100,
	opcode.RET:          0,
	opcode.SYSCALL:      0,
	opcode.DEPTH:        60,
	opcode.DROP:         60,
	opcode.NIP:          60,
	opcode.XDROP:        400,
	opcode.CLEAR:        400,
	opcode.DUP:          60,
	opcode.OVER:         60,
	opcode.PICK:         60,
	opcode.TUCK:         60,
	opcode.SWAP:         60,
	opcode.ROT:          60,
	opcode.ROLL:         400,
	opcode.REVERSE3:     60,
	opcode.REVERSE4:     60,
	opcode.REVERSEN:     400,
	opcode.INITSSLOT:    400,
	opcode.INITSLOT:     800,
	opcode.LDSFLD0:      60,
	opcode.LDSFLD1:      60,
	opcode.LDSFLD2:      60,
	opcode.LDSFLD3:      60,
	opcode.LDSFLD4:      60,
	opcode.LDSFLD5:      60,
	opcode.LDSFLD6:      60,
	opcode.LDSFLD:       60,
	opcode.STSFLD0:      60,
	opcode.STSFLD1:      60,
	opcode.STSFLD2:      60,
	opcode.STSFLD3:      60,
	opcode.STSFLD4:      60,
	opcode.STSFLD5:      60,
	opcode.STSFLD6:      60,
	opcode.STSFLD:       60,
	opcode.LDLOC0:       60,
	opcode.LDLOC1:       60,
	opcode.LDLOC2:       60,
	opcode.LDLOC3:       60,
	opcode.LDLOC4:       60,
	opcode.LDLOC5:       60,
	opcode.LDLOC6:       60,
	opcode.LDLOC:        60,
	opcode.STLOC0:       60,
	opcode.STLOC1:       60,
	opcode.STLOC2:       60,
	opcode.STLOC3:       60,
	opcode.STLOC4:       60,
	opcode.STLOC5:       60,
	opcode.STLOC6:       60,
	opcode.STLOC:        60,
	opcode.LDARG0:       60,
	opcode.LDARG1:       60,
	opcode.LDARG2:       60,
	opcode.LDARG3:       60,
	opcode.LDARG4:       60,
	opcode.LDARG5:       60,
	opcode.LDARG6:       60,
	opcode.LDARG:        60,
	opcode.STARG0:       60,
	opcode.STARG1:       60,
	opcode.STARG2:       60,
	opcode.STARG3:       60,
	opcode.STARG4:       60,
	opcode.STARG5:       60,
	opcode.STARG6:       60,
	opcode.STARG:        60,
	opcode.NEWBUFFER:    80000,
	opcode.MEMCPY:       80000,
	opcode.CAT:          80000,
	opcode.SUBSTR:       80000,
	opcode.LEFT:         80000,
	opcode.RIGHT:        80000,
	opcode.INVERT:       100,
	opcode.AND:          200,
	opcode.OR:           200,
	opcode.XOR:          200,
	opcode.EQUAL:        200,
	opcode.NOTEQUAL:     200,
	opcode.SIGN:         100,
	opcode.ABS:          100,
	opcode.NEGATE:       100,
	opcode.INC:          100,
	opcode.DEC:          100,
	opcode.ADD:          200,
	opcode.SUB:          200,
	opcode.MUL:          300,
	opcode.DIV:          300,
	opcode.MOD:          300,
	opcode.SHL:          300,
	opcode.SHR:          300,
	opcode.NOT:          100,
	opcode.BOOLAND:      200,
	opcode.BOOLOR:       200,
	opcode.NZ:           100,
	opcode.NUMEQUAL:     200,
	opcode.NUMNOTEQUAL:  200,
	opcode.LT:           200,
	opcode.LTE:          200,
	opcode.GT:           200,
	opcode.GTE:          200,
	opcode.MIN:          200,
	opcode.MAX:          200,
	opcode.WITHIN:       200,
	opcode.PACK:         7000,
	opcode.UNPACK:       7000,
	opcode.NEWARRAY0:    400,
	opcode.NEWARRAY:     15000,
	opcode.NEWARRAYT:    15000,
	opcode.NEWSTRUCT0:   400,
	opcode.NEWSTRUCT:    15000,
	opcode.NEWMAP:       200,
	opcode.SIZE:         150,
	opcode.HASKEY:       270000,
	opcode.KEYS:         500,
	opcode.VALUES:       7000,
	opcode.PICKITEM:     270000,
	opcode.APPEND:       15000,
	opcode.SETITEM:      270000,
	opcode.REVERSEITEMS: 500,
	opcode.REMOVE:       500,
	opcode.CLEARITEMS:   400,
	opcode.ISNULL:       60,
	opcode.ISTYPE:       60,
	opcode.CONVERT:      80000,
}