import numpy as np
import math


class Weapon:
    def __init__(self, name, gpe, dammage, type, pene, range, mode, at, rch, attribute):
        self.name = name
        self.gpe = gpe
        self.dammage = dammage
        self.type = type
        self.pene = pene
        self.range = range
        self.mode = mode
        self.at = at
        self.rch = rch
        self.attribute = attribute


class MyPerso:
    def __init__(self):
        self.experience = 17400
        self.CC = 52
        self.CT = 40
        self.F = 46
        self.E = 45
        self.AG = 50
        self.INT = 34
        self.PER = 43
        self.FM = 43
        self.SOC = 40
        self.MF = 2 * math.floor((self.F + 2 * 5) / 10) + 30 / 10
        self.weapons = [
            Weapon("Flamethrower", "Base", "2d10+5", "", 3, 20, None, None, None, None)
        ]

    def bonus(self, int):
        return np.round(int / 10)

    def dices(self, number_of_dice, int):
        dice = np.random.random_integers(1, int, number_of_dice)
        print("rolled %s dice of %s and got %s" % (number_of_dice, int, dice))
        return dice

    def initiative(self):
        return self.dices(1, 10) + self.bonus(self.AG)

    def perception(self, bonus=0):
        return (self.dices(1, 100) - self.PER - bonus - 20) < 0

    def flamethrower(self, hord=True):
        if hord:
            return np.ceil(self.weapons[0].range / 4) + self.dices(1, 5)

    def bolter_damage(self, success_degree):
        throw = []

        for degree in range(success_degree):
            current_throw = self.dices(3, 10)
            throw.append(current_throw[np.argsort(current_throw)[-2:]])
        print(throw)
        return np.sum(throw) + 5 * success_degree

    def bolter(self, bonus_ct=0):
        ct_dice = self.CT - self.dices(1, 100) + bonus_ct
        print("ct_dice_roll %i" % ct_dice)
        if ct_dice > 0:
            success_degree = 1 + int(math.floor(ct_dice / 10))
            print(success_degree)
        else:
            success_degree = 0
        return self.bolter_damage(success_degree)

    def sword_damage(self):
        return self.dices(1, 10) + 3 + self.MF

    def test_cc(self, bonus=0):
        return self.CC + bonus - self.dices(1, 100) > 0

    def fast_attack(self):
        damage = 0
        for i in range(2):
            if self.test_cc():
                damage += self.sword_damage()
                print("Sword damage % i penetration 4" % damage)
        return damage
