<?php
include_once '../classes/pagina.php';
include_once '../classes/sessao.php';

class Script extends Pagina {
    
    const WHEREATIVOS = "!(equipe.status LIKE 'INATIVO' OR ((equipe.pago = 'NÃO' OR equipe.pago IS NULL) AND prova.isentopagamento <> 'SIM'))";

    public $prova_id;
    public $bd2;


    public function __construct() {
        parent::checarPermissao(array('administrador'));
        parent::__construct();
        
        $this->prova_id = $_REQUEST[prova_id];
        $this->bd2 = new BD();
    }
    
    public function corpo() {
        if(empty($_REQUEST[acao]) AND empty($_REQUEST[executarAcao])) echo "<div><a href='home.php' class='voltar'>Voltar para a tela inicial</a></div><br/>";
        $this->filtro();
        if(!empty($_REQUEST[executar])) $this->executar();
    }
    
    public function filtro() {
        echo "<div>ATENÇÃO: SOMENTE EXECUTE ESTE SCRIPT APÓS TER FINALIZADO TODAS AS FASES DA PROVA E FINALIZADO CORREÇÕES E RECURSOS.</div>";
        echo "<div>Este script irá gravar campos calculados no banco de dados. Deve ser seguida a seguinte sequência na execução:<br/>1º pontuacao<br/>2º classificacao<br/>3º medalha<br/></div>";
        echo "<form action='scriptcamposcalculados.php' method='POST'>";
        echo "<fieldset><legend>Filtro</legend>";
        echo "<table align='center'>";
        $prova_id = (isset($_REQUEST[prova_id]))? $_REQUEST[prova_id] : $_SESSION[prova_id];
        echo "<tr style='display:block'><td>";
        echo "Prova: ";parent::selectProva($prova_id, true, null, "1=1");
        echo "</td></tr>";
        echo "<tr style='display:block'><td>";
//        echo "UF: ";parent::montaSelect('uf', array('AC','AL','AM','AP','BA','CE','DF','ES','GO','MA','MG','MS','MT','PA','PB','PE','PI','PR','RJ','RN','RO','RR','RS','SC','SE','SP','TO'), $_REQUEST[uf], false);;echo " &nbsp; ";
        echo "Executar: ";parent::montaSelect('executar', array('pontuacao', 'classificacao', 'medalha'), $_REQUEST[executar], true);echo " &nbsp; ";
        echo "</td></tr>";
        echo "</table>";
        echo "<div align='center'><input type='submit' value='Executar' /></div>";
        echo "</fieldset>";
        echo "</form>";
    }
    
    public function executar() {
        $bd = new BD();
        
        echo "<p>inicio:  ".date('d/m/Y H:i:s')."</p>";
            
        //PROVAFASEs
        $sql = "SELECT provafase.* 
                FROM imediaco_geo.prova 
                INNER JOIN imediaco_geo.provafase ON prova.id = provafase.prova_id 
                WHERE prova.id = '".$this->prova_id."'";
        $bd->executarSQL($sql);
        $provafases_ids[0] = -1;
        while($obj = $bd->getObjeto()){
            $provafases_ids[$obj->fase] = $obj->id;
        }
        //UFs
        $sql = "SELECT DISTINCT(equipe.uf) AS uf 
                FROM imediaco_geo.equipe 
                INNER JOIN imediaco_geo.prova ON equipe.prova_id = prova.id
                WHERE equipe.prova_id = '".$this->prova_id."' AND ".self::WHEREATIVOS."";
        $bd->executarSQL($sql);
        while($obj = $bd->getObjeto()){
            $ufs[] = $obj->uf;
        }
        
        switch($_REQUEST[executar]){
            case 'pontuacao':
                foreach($provafases_ids as $provafase_id){
                    $this->pontuacao($provafase_id);
                }
                break;
            case 'classificacao':
                foreach($provafases_ids as $provafase_id){
                    $this->classificacao($provafase_id);
                    foreach($ufs as $uf){
                        $this->classificacao($provafase_id, $uf);
                    }
                }
                break;
            case 'medalha':
                foreach($ufs as $uf){
                    $this->medalha($uf);
                }
                break;
        }
        
        if(!empty($_SESSION[erro])){
            echo "<div class='erro'>Foram encontrados ". count($_SESSION[erro])." no processamento.<br/>Execute o processamento novamente.</div>";
            unset($_SESSION[erro]);
        }
        
        echo "<p>fim:  ".date('d/m/Y H:i:s')."</p>";
        
    }
    
    public function gravaValor($equipe_id, $campo, $valor){
        $sql = "SELECT id FROM imediaco_geo.campocalculado WHERE equipe_id = '$equipe_id' AND campo = '$campo'";
        $this->bd2->executarSQL($sql);
        $obj = $this->bd2->getObjeto();
        if(!empty($obj->id)){
            $sql = "UPDATE imediaco_geo.campocalculado SET valor = '$valor' WHERE id = '$obj->id'";
            $this->bd2->executarSQL($sql);
        }else{
            $sql = "INSERT INTO imediaco_geo.campocalculado(equipe_id, campo, valor) VALUES('$equipe_id', '$campo', '$valor')";
            $this->bd2->executarSQL($sql);
        }
//        echo "$sql;<br/>";
    }
    
    public function pontuacao($provafase_id=-1){
        echo "<p>Processando PONTUAÇÃO provafase_id = $provafase_id</p>";
        $sql = "SELECT equipe.id AS equipe_id, imediaco_geo.pontuacao(equipe.id, $provafase_id) AS pontuacao 
                FROM imediaco_geo.equipe 
                INNER JOIN imediaco_geo.prova ON equipe.prova_id = prova.id
                WHERE equipe.prova_id = ".$this->prova_id." AND ".self::WHEREATIVOS."";
        $this->bd->executarSQL($sql);
        $i = 0;
        while($obj = $this->bd->getObjeto()){
            $this->gravaValor($obj->equipe_id, "pontuacao provafase $provafase_id", $obj->pontuacao);
            $i++;
        }
        echo "<p>Total processadas: $i</p>";
    }

    public function classificacao($provafase_id=-1, $uf=null){
        echo "<p>Processando CLASSIFICAÇÃO provafase_id = $provafase_id, uf = $uf</p>";
        $where = (!empty($uf))? "equipe.uf = '$uf'" : '1=1';
        $sql = "SELECT equipe.id AS equipe_id
                FROM imediaco_geo.equipe
                INNER JOIN imediaco_geo.prova ON equipe.prova_id = prova.id
                INNER JOIN imediaco_geo.campocalculado ON campocalculado.equipe_id = equipe.id AND campocalculado.campo = 'pontuacao provafase $provafase_id' 
                WHERE equipe.prova_id = ".$this->prova_id." AND $where AND ".self::WHEREATIVOS."
                ORDER BY 
                    campocalculado.valor DESC -- imediaco_geo.pontuacao(equipe.id, $provafase_id) DESC
                    , (
                        SELECT CASE WHEN s.datahorafinalizacao IS NOT NULL THEN CAST(TIMESTAMPDIFF(MICROSECOND, s.datahora, s.datahorafinalizacao) AS UNSIGNED) ELSE CAST(999999999999 AS UNSIGNED) END 
                        FROM imediaco_geo.sessao s 
                        WHERE s.equipe_id = equipe.id AND s.provafase_id = (SELECT MAX(pf.fase) FROM imediaco_geo.provafase pf WHERE pf.prova_id = ".$this->prova_id." ORDER BY pf.fase DESC)
                        ) -- tempo de realizacao da ultima fase da prova
                    , equipe.id";
        $this->bd->executarSQL($sql);//echo "<pre>$sql</pre>";
        $classificacao = 1;
        $i = 0;
        while($obj = $this->bd->getObjeto()){
            $this->gravaValor($obj->equipe_id, "classificacao provafase $provafase_id uf $uf", $classificacao);
            if(!empty($uf) AND $provafase_id == -1){
                $sql = "UPDATE imediaco_geo.equipe SET colocacao = '$classificacao' WHERE id = $obj->equipe_id";
                $this->bd2->executarSQL($sql);
            }
            $classificacao++;
            $i++;
        }
        echo "<p>Total processadas: $i</p>";
    }
    
    public function medalha($uf){
        echo "<p>Processando MEDALHA uf = $uf</p>";
        $sql = "SELECT equipe.id AS equipe_id
                FROM imediaco_geo.equipe
                INNER JOIN imediaco_geo.prova ON equipe.prova_id = prova.id
                WHERE equipe.prova_id = ".$this->prova_id." AND equipe.uf = '$uf' AND ".self::WHEREATIVOS." 
                ORDER BY equipe.colocacao";
        $this->bd->executarSQL($sql);
        $quantidadetotal = $this->bd->getQuantidadeRegistros();
        //por estado, 10% outro, proximos 15% prata e proximos 25% bronze
        $ultimocolocadoouro = round($quantidadetotal * 0.10);
        $ultimocolocadoprata = $ultimocolocadoouro + round($quantidadetotal * 0.15);
        $ultimocolocadobronze = $ultimocolocadoprata + round($quantidadetotal * 0.25);
        $i = 1;
        $ouro = $prata = $bronze = 0;
        while($obj = $this->bd->getObjeto()){
            if($i <= $ultimocolocadoouro){
                $sql = "UPDATE imediaco_geo.equipe SET medalha = 'OURO' WHERE id = $obj->equipe_id";
                $this->bd2->executarSQL($sql);
                $ouro++;
            }elseif($i <= $ultimocolocadoprata){
                $sql = "UPDATE imediaco_geo.equipe SET medalha = 'PRATA' WHERE id = $obj->equipe_id";
                $this->bd2->executarSQL($sql);
                $prata++;
            }elseif($i <= $ultimocolocadobronze){
                $sql = "UPDATE imediaco_geo.equipe SET medalha = 'BRONZE' WHERE id = $obj->equipe_id";
                $this->bd2->executarSQL($sql);
                $bronze++;
            }
            $i++;
        }
        echo "<p>Total processadas: ".($i - 1)." :: ouro: $ouro :: prata: $prata :: bronze: $bronze</p>";
    }
}

$pagina = new Script();
$pagina->montar();