import math
import matplotlib.pyplot as plt
from .Generaldistribution import Distribution

class Gaussian(Distribution):

    def __init__(self, mu=0, sigma=1):
        Distribution.__init__(self, mu, sigma)
    
    def calculate_mean(self):

        avg = 1.0 * sum(self.data) / len(self.data)

        self.mean = avg
        return self.mean

    def calculate_stdev(self, sample=True):

        if sample:
            n = len(self.data)-1
        else:
            n = len(self.data)

        sigma = 0
        mean = self.mean
        for xi in self.data:
            sigma = (xi - mean) **2

        sigma = math.sqrt(sigma / n)
        self.stdev = sigma

        return self.stdev

    def read_data_file(self, file_name, sample = True):

        with open(file_name) as file:
            data_list = []
            line = file.readline()
            while line:
                data_list.append(int(line))
                line = file.readline()
        file.close()

        self.data = data_list
        #self.mean = calculate_mean()
        #self.stdev = calculate_stdev(sample)

    def plot_histogram(self):

        plt.hist(self.data)
        plt.title("Histogram of data")
        plt.xlabel("Data")
        plt.ylabel("Count")

    def pdf(self, x):

        return (1.0 / (self.stdev * math.sqrt(2*math.pi))) * math.exp(-0.5*((x - self.mean) / self.stdev) ** 2)

    def plot_histogram_pdf(self, n_spaces=50):
        
        min_range = min(self.data)
        max_range = max(self.data)

		# calculates the interval between x values
        interval = 1.0 * (max_range - min_range) / n_spaces
        x = []
        y = []
        # calculate the x values to visualize
        
        for i in range(n_spaces):
            tmp = min_range + interval*i
            x.append(tmp)
            y.append(self.pdf(tmp))
            
        # make the plots
        
        fig, axes = plt.subplots(2,sharex=True)
        fig.subplots_adjust(hspace=.5)
        axes[0].hist(self.data, density=True)
        axes[0].set_title('Normed Histogram of Data')
        axes[0].set_ylabel('Density')
        
        axes[1].plot(x, y)
        axes[1].set_title('Normal Distribution for \n Sample Mean and Sample Standard Deviation')
        axes[0].set_ylabel('Density')
        plt.show()
        
        return x, y

    def __add__(self,other):

        result = Gaussian()
        result.mean = self.mean + other.mean
        result.stdev = math.sqrt(self.stdev**2 + other.stdev**2)

        return result

    def __repr__(self):

        return "mean {}, standard deviation {}".format(self.mean, self.stdev)



