from pytoniq_core.boc import HashMap, Builder, Address


"""### ways to set values in hashmaps ###"""


hashmap = HashMap(key_size=267,  # key bit length
                  key_serializer=lambda src: Builder().store_address(src).end_cell().begin_parse().load_uint(267),  # function to serialize keys if they're not integers or type of dict.Key
                  value_serializer=lambda src, dest: dest.store_coins(src)  # function to serialize value if they're not cells
                  )

hashmap2 = HashMap(267).with_coins_values()

hashmap.set(key=Address('EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG'), value=15) \
    .set(key=Address('EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N'), value=10)

hashmap2.set(key=Address('EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG'), value=15) \
    .set(key=Address('EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N'), value=10)

assert hashmap.serialize() == hashmap2.serialize()


"""### serializing hashmaps ###"""

print(hashmap.map)

#  {118621468258109555883414559823777639640406072296410285331234498098430527437346690: 15, 118630747841378569603204119301805376564831504145530059638093173869611524683674024: 10}

hashmap_cell = hashmap.serialize()

# 22[817000] -> {
# 	277[BFF7ADE33CC37032184B0ECEF80219C935266C972CBEEEC553021B22D6105E8BC10878],
# 	277[BFC1EFEAA9731B94DA397E5E64622F5E63348B812AC5B4763A93F0DD201D0798D40850]
# }

empty_hashmap = HashMap(10)

print(empty_hashmap.serialize())  # None


"""### parsing hashmaps ###"""

print(HashMap.parse(hashmap_cell.begin_parse(), key_length=267))

# {118621468258109555883414559823777639640406072296410285331234498098430527437346690: <Slice 12[10F0] -> 0 refs>, 118630747841378569603204119301805376564831504145530059638093173869611524683674024: <Slice 12[10A0] -> 0 refs>}

def key_deserializer(src):
    return Builder().store_bits(src).to_slice().load_address()
def value_deserializer(src):
    return src.load_coins()

print(HashMap.parse(hashmap_cell.begin_parse(), key_length=267, key_deserializer=key_deserializer, value_deserializer=value_deserializer))

# {Address<EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG>: 15, Address<EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N>: 10}

"""### load hashmaps from slices ###"""

slice_with_hashmap = Builder().store_dict(hashmap_cell).end_cell().begin_parse()

print(slice_with_hashmap)

# 1[80] -> {
# 	22[817000] -> {
# 		277[BFF7ADE33CC37032184B0ECEF80219C935266C972CBEEEC553021B22D6105E8BC10878],
# 		277[BFC1EFEAA9731B94DA397E5E64622F5E63348B812AC5B4763A93F0DD201D0798D40850]
# 	}
# }

# load and parse HashmapE from reference
print(slice_with_hashmap.load_dict(key_length=267, key_deserializer=key_deserializer, value_deserializer=value_deserializer))

# {Address<EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG>: 15, Address<EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N>: 10}

# parse Hashmap directly from cell
print(hashmap_cell.begin_parse().load_hashmap(key_length=267, key_deserializer=key_deserializer, value_deserializer=value_deserializer))

# {Address<EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG>: 15, Address<EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N>: 10}