package storagecontract

import (
	"github.com/nspcc-dev/neo-go/pkg/interop/iterator"
	"github.com/nspcc-dev/neo-go/pkg/interop/storage"
)

// Main is a very useful function.
func Main(operation string, args []interface{}) interface{} {
	ctx := storage.GetContext()

	// Puts value at key
	if operation == "put" {
		if checkArgs(args, 2) {
			key := args[0].([]byte)
			value := args[1].([]byte)
			storage.Put(ctx, key, value)
			return key
		}
	}

	// Returns the value at passed key
	if operation == "get" {
		if checkArgs(args, 1) {
			key := args[0].([]byte)
			return storage.Get(ctx, key)
		}
	}

	// Deletes the value at passed key
	if operation == "delete" {
		key := args[0].([]byte)
		storage.Delete(ctx, key)
		return true
	}

	// Returns an array of key-value pairs with key that matched the passed value
	if operation == "find" {
		if checkArgs(args, 1) {
			value := args[0].([]byte)
			iter := storage.Find(ctx, value)
			result := []string{}
			for iterator.Next(iter) {
				val := iterator.Value(iter)
				key := iterator.Key(iter)
				result = append(result, key.(string)+":"+val.(string))
			}
			return result
		}
	}

	return false
}

func checkArgs(args []interface{}, length int) bool {
	if len(args) == length {
		return true
	}

	return false
}