<?php

namespace MedidasDispersao;

class MedidasDispersao
{

// Média - OK

// Variancia (Total ou Amostra) - E(u - x)² / n (Total) ou E(u - x)² / (n - 1) (amostragem) ok

// Desvio Padrão ok

// Coeficiente de Variação - Desvio padrão / média (x 100 para apresentar a porcentagem)

// Teste Z - (valor - u) / DP

// private $arrNumeros;

// private $bAmostragem;

// private $fMedia;

// private $fVariancia;

// private $fDesvioPadrao;

// private $fCoeficienteVariacao;

// public function MedidasDispersao($textoNumeros, $bAmostragem = true) {

//     $this->arrNumeros = explode(" ", $textoNumeros);

//     $this->bAmostragem = $bAmostragem;

//     $this->calcularGeral();

// }

// public function calcularGeral() {

//     $this->calcularMedia();

//     $this->calcularVariancia();

//     $this->calcularDesvioPadrao();

//     $this->calcularCoeficienteVariacao();

// }

// public function fRetornarTesteZ($index) {

//     if ($index <= 0 || $index > count($this->arrNumeros)) {

//         throw new Exception("Digite um número de 0 a " . count($this->arrNumeros));

//     }

//     return ($this->arrNumeros[$index - 1] - $this->fMedia) / $this->fDesvioPadrao;

// }

// public function calcularCoeficienteVariacao() {

//     $this->fCoeficienteVariacao = $this->fDesvioPadrao / $this->fMedia;

// }

// public function calcularVariancia() {

//     $iQuantidadeDivisao = 0;

//     $iSomaTotal = 0;

//     if ($this->bAmostragem === true) {

//         // Se for amostragem

//         $iQuantidadeDivisao = count($this->arrNumeros) - 1;

//     } else {

//         // Total

//         $iQuantidadeDivisao = count($this->arrNumeros);

//     }

//     for ($i = 0; $i < count($this->arrNumeros); $i++) {

//         $iSomaTotal += pow(($this->fMedia - $this->arrNumeros[$i]), 2);

//     }

//     $this->fVariancia = $iSomaTotal / $iQuantidadeDivisao;

// }

// public function calcularDesvioPadrao() {

//     $this->fDesvioPadrao = sqrt($this->fVariancia);

// }

// public function calcularMedia() {

//     // Média = Total Números / quantidade

//     $quantidadeArrayNumeros = count($this->arrNumeros);

//     $totalSomaNumeros = 0;

//     // Loop para obter todos os números

//     for ($i = 0; $i < $quantidadeArrayNumeros; $i++) {

//         // Array no PHP inicia pelo 0

//         $totalSomaNumeros +=  $this->arrNumeros[$i];

//     }

//     $this->fMedia = $totalSomaNumeros / $quantidadeArrayNumeros;

// }

// public function getDesvioPadrao() {

//     return $this->fDesvioPadrao;

// }

// public function getMedia() {

//     return $this->fMedia;

// }

// public function getVariancia() {

//     return $this->fVariancia;

// }

// public function getCoeficienteVariacao() {

//     return $this->fCoeficienteVariacao;

// }

// public function setNumeros($numeros) {

//     $this->arrNumeros = explode(" ", $numeros);

// }

    public function calc_variance($arrNumeros, $bAmostragem = false)
    {

        $iQuantidadeDivisao = 0;
        $fVariancia = 0;
        $fdesvioPadrao = 0;
        $fcoeficienteVariacao = 0;
        $iSomaTotal = 0;

        if (is_array($arrNumeros) && count($arrNumeros) > 0)
        {
            $fMedia = array_sum($arrNumeros) / count($arrNumeros);

            if ($bAmostragem === true)
            {
                // Se for amostragem
                $iQuantidadeDivisao = count($arrNumeros) - 1;
            }
            else
            {
                // Total
                $iQuantidadeDivisao = count($arrNumeros);
            }

            for ($i = 0; $i < count($arrNumeros); $i++)
            {
                $iSomaTotal += pow(($fMedia - $arrNumeros[$i]), 2);
            }

            $fVariancia = $iSomaTotal / $iQuantidadeDivisao;
            $fdesvioPadrao = sqrt($fVariancia);
            
            if ($fdesvioPadrao > 0)
            {
                $fcoeficienteVariacao = ($fdesvioPadrao / $fMedia) * 100;
                $fcoeficienteVariacao = round($fcoeficienteVariacao, 2);
            }
            
        }

        return $fcoeficienteVariacao;
    }

    // calcula op desvio padrao
    public function standard_deviation($arrNumeros, $bAmostragem = false)
    {
        $iQuantidadeDivisao = 0;
        $fVariancia = 0;
        $iSomaTotal = 0;

        if (is_array($arrNumeros) && count($arrNumeros) > 0)
        {
            $fMedia = array_sum($arrNumeros) / count($arrNumeros);

            if ($bAmostragem === true)
            {
                // Se for amostragem
                $iQuantidadeDivisao = count($arrNumeros) - 1;
            }
            else
            {
                // Total
                $iQuantidadeDivisao = count($arrNumeros);
            }

            for ($i = 0; $i < count($arrNumeros); $i++)
            {
                $iSomaTotal += pow(($fMedia - $arrNumeros[$i]), 2);
            }

            $fVariancia = $iSomaTotal / $iQuantidadeDivisao;

            $fVariancia = round(sqrt($fVariancia), 2);
        }

        return $fVariancia;
    }

    //calcula a média
    public function calc_average($arr)
    {
        $mean = 0;

        if (count($arr) > 0)
        {
            $mean = array_sum($arr) / count($arr);
        }

        return round($mean, 2);
    }

    //calcula a mediana
    public function calculate_median($arr)
    {
        $median = 0;

        if (is_array($arr))
        {
            sort($arr);
            $count = count($arr); //total numbers in array

            if ($count > 0)
            {
                // find the middle value, or the lowest middle value
                $middleval = floor(($count - 1) / 2);

                if ($count % 2)
                {
                    // odd number, middle is the median
                    $median = $arr[$middleval];
                }
                else
                {
                    // even number, calculate avg of 2 medians
                    $low = $arr[$middleval];
                    $high = $arr[$middleval + 1];
                    $median = (($low + $high) / 2);
                }
            }
        }

        return round($median, 2);
    }

    //calcula o percentual de um número
    public function calculate_percentage($val, $count)
    {
        $result = 0;

        if ($val > 0 && $count > 0)
        {
            $result = ($val / $count) * 100;
            //$result = ($count * 100) /$val;
        }

        return round($result, 0);
    }
}
