<?php
include "Solver.php";
include "MySQL_Database_Handler.php";


class Pump
{
    function __construct(){}

    private function call_Base_Select_Function_According_To_Type($row, $date_start, $date_end)
    {
        $database_Handler=MySQL_Database_Handler::getInstance();

        if($date_start==null and $date_end==null)
        {
            $senzor_Data= $database_Handler->get_Data_From_Senzor($row["vcelstvo_id"],$row["senzor_id"],$row["velicina_id"],null,null);
        }
        else{
            $senzor_Data= $database_Handler->get_Data_From_Senzor($row["vcelstvo_id"],$row["senzor_id"],$row["velicina_id"],$date_start, $date_end);
        }

        $data_array=array();

        while($row2 = $senzor_Data->fetch_assoc()) {
            array_push($data_array,new Row_Of_Data($row2['cas'],$row2['hodnota'],$row["senzor_id"],$row["velicina_id"]));
        }

        return $data_array;
    }

     function get_Data($vcelstvo_id)
    {
        $data_Array= array();
        $data_Temp=null;
        $database_Handler=MySQL_Database_Handler::getInstance();
        $solver=Solver::getInstance();

        try {
            if(!is_numeric($vcelstvo_id)){
                throw new Exception('Hodnota $vcelstvo_id není číslo');
            }
            $senzor_ids=$database_Handler->Get_Senzors_From_Vcelstvo($vcelstvo_id,null,null);

            if ($senzor_ids->num_rows > 0)
            {
                while($row = $senzor_ids->fetch_assoc()) {
                    $data_Temp= $this->call_Base_Select_Function_According_To_Type($row,null, null);
                    $data_Temp= $solver->go_Thru_Remove_Invalid_Blocks($solver->count_Difference($data_Temp));
                    array_push($data_Array,$data_Temp);
                }
                $database_Handler->close_Con();
            } else {
                throw new Exception('Pro zadané včelstvo není žádný senzor');
            }
        }catch(Throwable $e){
            return   $e->getMessage();

        }
        return $data_Array;
    }

    public function validate_Date($input_str) {
        $return_str = str_replace( array('<',';','|','&','>',"'",'"',')','('), array(''), $input_str );
        if (preg_match('/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/', $input_str)) {
            return $return_str;
        } else {
            throw new Exception('Zadany datum $input_str neprošel kontrolou ');
        }
    }

    function get_Data_Between_Dates($vcelstvo_id,$date_start, $date_end)
    {
        $data_Array= array();
        $data_Temp=null;
        $database_Handler=MySQL_Database_Handler::getInstance();
        $solver=Solver::getInstance();

        try {
            if(!is_numeric($vcelstvo_id)){

                throw new Exception('Hodnota $vcelstvo_id není číslo');
            }
            $this->validate_Date($date_start);
            $this->validate_Date($date_end);
            $senzor_ids=$database_Handler->Get_Senzors_From_Vcelstvo($vcelstvo_id,$date_start, $date_end);

            if ($senzor_ids->num_rows > 0)
            {
                while($row = $senzor_ids->fetch_assoc()) {
                    $data_Temp= $this->call_Base_Select_Function_According_To_Type($row,$date_start, $date_end);
                    $database_Handler->close_Con();
                    $data_Temp= $solver->go_Thru_Remove_Invalid_Blocks($solver->count_Difference($data_Temp));
                    array_push($data_Array,$data_Temp);
                }
            } else {
                throw new Exception('Pro zadané včelstvo není žádný senzor nebo není v zadaném datumu žádné měření');
            }
        } catch(Throwable $e){
            return   $e->getMessage();
        }
        return $data_Array;
    }

    function get_Data_Between_Dates_Standard_Deviation($vcelstvo_id,$date_start, $date_end,$numberOfStandardDeviation){
        $solver=Solver::getInstance();
        try{
            if(!is_numeric($numberOfStandardDeviation)){
                throw new Exception('Hodnota $vcelstvo_id není číslo');
            }else{
                if ($numberOfStandardDeviation<0 and 4<$numberOfStandardDeviation )
                {
                    throw new Exception('Hodnota $vcelstvo_id není v rozmezí 0-4');
                }
            }
            $temp=$this->get_Data_Between_Dates($vcelstvo_id,$date_start, $date_end);
        } catch(Throwable $e){
            return   $e->getMessage();
        }

        if (is_string($temp)){
            return   $temp;
        }

        for ($x=0;$x<count($temp);$x++){
            $temp[$x]= $solver->standard_Deviation($temp[$x],$numberOfStandardDeviation);
        }
        return $temp;

    }

    function get_Data_Standard_Deviation($vcelstvo_id, $numberOfStandardDeviation){
        $solver=Solver::getInstance();
        try{
            if(!is_numeric($numberOfStandardDeviation)){
                throw new Exception('Hodnota $vcelstvo_id není číslo');
            }else{
                if ($numberOfStandardDeviation<0 and 4<$numberOfStandardDeviation )
                {
                    throw new Exception('Hodnota $vcelstvo_id není v rozmezí 0-4');
                }
            }
            $allRows=$this->get_Data($vcelstvo_id);
        } catch(Throwable $e){
            return   $e;
        }
        if (is_string($allRows)){
            return   $allRows;
        }

        for ($x=0;$x<count($allRows);$x++){
            $allRows[$x]= $solver->standard_Deviation($allRows[$x],$numberOfStandardDeviation);
        }
        return $allRows;
    }





}