import math
import numpy as np
import particle
from scipy.stats import norm
from random import randint

def actionModel(particles, numParticles, boxX, boxY, dx, dy, covX, covY):
    for i in range(numParticles):
        boxX, boxY = np.random.normal(boxX, randint(0,5)), np.random.normal(boxY, randint(0,5))
        newx, newy = boxX + np.random.normal(dx, covX), boxY + np.random.normal(dy, covY)
        particles[i].x, particles[i].y = np.random.normal(newx, covX),  np.random.normal(newy, covY)
    return particles

def sensorModel(particles, numParticles, boxX, boxY):
    totalW = 0
    for i in range(numParticles):
        x = particles[i].x
        y = particles[i].y
        dx = abs(boxX - x)
        dy = abs(boxY - y)
        dist = math.sqrt(dx**2 + dy**2)

        if dist == 0:
            dist = 0.1

        bias = 1/dist
        particles[i].weight = norm.pdf(bias)
        totalW += particles[i].weight

    for i in range(numParticles):
        particles[i].weight = particles[i].weight/totalW

    return particles

def resample(particles, numParticles):
    Q = [0.0]*numParticles

    idxArr = np.zeros((numParticles, 1), dtype = int)

    newParticles = [particle.Particle(0,0,0)]*numParticles

    # calculate CDF
    Q[0] = particles[0].weight
    for i in range(1,numParticles):
        Q[i] = particles[i].weight + Q[i-1]

    t = np.random.rand(numParticles + 1, 1)
    T = np.sort(t, axis=0)
    T[numParticles] = 1

    i, j = 0, 0
    while i<numParticles:
        print(i,j, len(T), len(Q))
        if T[i] < Q[j]:
            idxArr[i] = j
            i += 1
        else:
            j += 1

    for i in range(numParticles):
        newParticles[i].x = particles[idxArr[i][0]].x
        newParticles[i].y = particles[idxArr[i][0]].y
        newParticles[i].weight = 1/numParticles

    return newParticles