import random
from numba import jit

# I use https://en.wikipedia.org/wiki/Roulette as my main guidance

@jit(nopython = True)
def single():
    '''Generate random number from 0-36

    Returns:
        int: randomly generated number from 0-36
    '''

    bet_type = 'single'

    decision = random.randint(0, 36)

    return bet_type, decision

@jit(forceobj = True)
def split():

    bet_type = 'split'

    number = random.randint(1, 35)

    if number % 3 in [1, 2] and number < 33:
        choice = [number + 1, number + 3]
        pair = random.choice(choice)
        decision = [number, pair]
    elif number % 3 == 0 and number <= 33:
        decision = [number, number + 3]
    elif number == 34:
        decision = [number, number + 1]
    elif number == 35:
        decision = [number, number + 1]
    return bet_type, decision

@jit(forceobj = True)
def street():

    bet_type = 'street'

    number = [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34]
    choice = random.choice(number) # pick randomly from first column except 34

    decision = list(range(choice, choice + 3)) # get number for street bet

    return bet_type, decision

@jit(forceobj = True)
def corner():

    bet_type = 'corner'

    number = [1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32]
    choice = random.choice(number)

    decision = [choice, choice + 1, choice + 3, choice + 4]

    return bet_type, decision

@jit(forceobj = True)
def basket():

    bet_type = 'basket'

    basket_array = [0, 1, 2, 3]
    decision = basket_array

    return bet_type, decision

@jit(forceobj = True)
def double_street():

    bet_type = 'double_street'

    number = [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31]
    choice = random.choice(number) # pick randomly from first column except 34

    decision = list(range(choice, choice + 6)) # get number for double street bet

    return bet_type, decision

@jit(forceobj = True)
def column():

    bet_type = 'column'

    result = random.randint(1, 3)

    first_column = [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34]
    second_column = [2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35]
    third_column = [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36]

    if result == 1:
        decision = first_column
    elif result == 2:
        decision = second_column
    else:
        decision = third_column

    return bet_type, decision

@jit(forceobj = True)
def dozen():

    bet_type = 'dozen'

    result = random.randint(1, 3)

    if result == 1:
        decision = list(range(1, 13))
    elif result == 2:
        decision = list(range(13, 25))
    else:
        decision = list(range(25, 37))
    
    return bet_type, decision

@jit(forceobj = True)
def odd_or_even():

    bet_type = 'odd_or_even'

    number = list(range(1,37))
    odd = number[1::2]
    even = number[::2]

    choice = ['odd', 'even']
    result = random.choice(choice)

    decision = even if result == 'even' else odd
    return bet_type, decision

@jit(forceobj = True)
def red_or_black():

    bet_type = 'red_or_black'

    number = random.randint(1, 100)
    result = number % 2

    red = [32, 19, 21, 25, 34, 27, 36, 30, 23, 5, 16, 1, 14, 9, 18, 7, 12, 3]
    black = [15, 4, 2, 17, 6, 13, 11, 8, 10, 24, 33, 20, 31, 22, 29, 28, 35, 26]

    decision = red if result == 0 else black
    return bet_type, decision

@jit(forceobj = True)
def half():  # sourcery skip: assign-if-exp

    bet_type = 'half'

    number = random.randint(1, 100)
    result = number % 2

    if result == 0:
        decision = list(range(1, 19))
    else:
        decision = list(range(19, 37))
    
    return bet_type, decision

@jit(forceobj = True)
def decide(tendency):
    '''Generate random bet decision for the player

    Returns:
        string : type of bet it picked
        int | list[int] : number(s) it picked
    '''

    # get the bet types randomly
    if tendency == 'random': # all random
        number = random.randint(0, 10)
    elif tendency == 'dangerous': # only choose
        number = 0
    elif tendency == 'safe': # only choose safe bet
        number = random.choice([6, 7, 8, 9, 10])

    match number:
        case 0: # single
            bet_type, decision = single()
        case 1: # split
            bet_type, decision = split()
        case 2: # street
            bet_type, decision = street()
        case 3: # corner
            bet_type, decision = corner()
        case 4: # basket
            bet_type, decision = basket()
        case 5: # double_street
            bet_type, decision = double_street()
        case 6: # column
            bet_type, decision = column()
        case 7: # dozen
            bet_type, decision = dozen()
        case 8: # odd_or_even
            bet_type, decision = odd_or_even()
        case 9: # red_or_black
            bet_type, decision = red_or_black()
        case 10: # half
            bet_type, decision = half()
        case _: # else
            bet_type, decision = "something's wrong", 'check it'
    return bet_type, decision