<?php
$Permissoes = User::getUser(true);
if(!$Permissoes){
    User::blockAction("Você não tem permissão para acessar esta tela");
}
use Carbon\Carbon;
class FasesSolicitacaoController extends GxController {

    var $help = 'Esta é a ajuda';

    public function actionRegistraFase($solicitacao, $fase)
    {

        $id = $solicitacao;
        $id_user = User::getId();

        $userName = User::getShortName();
        $userId = User::getId();
        $perfil = Util::getPrivilegio(User::getPrivilegio());
        $textoPadrao = "Usuario {$userName}({$userId}) com perfil de '{$perfil}'";

        if ($fase%2 == 1)  { // Somente restringir em inícios de fases
            $modelSolicitacao = Solicitacoes::model()->findByPk($solicitacao);
            if ($modelSolicitacao->estaTrabalhandoOutraPendencia()) {
                // Restringir registro de fase caso o usuário já esteja trabalhando
                Yii::app()->user->setFlash('error', 'Você não pode realizar esta ação!');
                Util::writeLog($textoPadrao.", não pode realizar essa ação, já está trabalhando em outra pendência.", __LINE__);
                $this->redirect(array('solicitacoes/view', 'id' => $solicitacao));
            }
        }

        $solicitacao = $this->loadModel($id, 'Solicitacoes');
        $fase = $this->loadModel($fase, 'FasesDesenvolvimento');

        if ($solicitacao->isVinculada()) {
            Yii::app()->user->setFlash('error', 'Você não pode realizar esta ação!');
            Util::writeLog($textoPadrao.", pendências vinculadas não podem ter registro de fases.", __LINE__);
            $this->redirect(array('solicitacoes/view', 'id' => $solicitacao));
        }

        Util::writeLog($textoPadrao.", registrando fase na solicitação {$id}.", __LINE__);

        if(!$solicitacao->enableRegistraFase() || $solicitacao->getIdRegistraFase() != $fase->FAD_ID) {
            Yii::app()->user->setFlash('error', 'Você não pode realizar esta ação!');
            Util::writeLog($textoPadrao.", nao pode realizar essa acao.", __LINE__);
            $this->redirect(array('solicitacoes/view', 'id' => $solicitacao->SOL_IDPENDENCIA));

        } else {

            $model = new FasesSolicitacao();
            $model->FAS_IDSOLICITACAO = $solicitacao->SOL_IDPENDENCIA;
            $model->FAS_IDFASE = $fase->FAD_ID;
            $model->FAS_DATA = date('d/m/Y H:i:s');
            $model->FAS_IDUSUARIO = $id_user;

            if ($model->save()) {
                $solicitacao->SOL_FASE = $fase->FAD_ID;
                $solicitacao->save(false, array('SOL_FASE'));

                Yii::app()->user->setFlash('success', $fase->FAD_DESCRICAO . ' com sucesso!');
                Util::writeLog($textoPadrao.", {$fase->FAD_DESCRICAO}. {$id}", __LINE__);
            } else {
                Yii::app()->user->setFlash('error', 'Houve um erro ao tentar salvar. Por favor tente novamente!');
                Util::writeLog($textoPadrao.", houve um erro ao tentar salvar. {$id}", __LINE__);
            }
            $this->redirect(array('solicitacoes/view', 'id' => $solicitacao->SOL_IDPENDENCIA));

        }
    }

    public function actionCalcularHoras($solicitacao, $json = true)
    {

        $solicitacao = $this->loadModel($solicitacao, 'Solicitacoes');
        if($solicitacao->faseNaoFinalizada()) {
            $return = ['code' => 99, 'message' => 'Você não finalizou todas suas tarefas nesta pendência. Finalize as mesmas para poder calcular as horas trabalhadas!'];
            if($json) {
                echo CJSON::encode($return);
            } else {
                return $return;
            }
            return;
        }

        $lancamentos = $solicitacao->loadLancamentosNaoUSados();

        if(isset($lancamentos['inicio']) && isset($lancamentos['fim'])){
            if(count($lancamentos['inicio']) != count($lancamentos['fim'])) {
                $return = ['code' => 99, 'message' => 'Você não finalizou todas suas tarefas nesta pendência. Finalize as mesmas para poder calcular as horas trabalhadas!'];
                if($json) {
                    echo CJSON::encode($return);
                } else {
                    return $return;
                }
                return;
            }
            if(count($lancamentos['inicio']) == 0) {
                $return = ['code' => 99, 'message' => 'Nenhum lançamento encontrado para calcular as horas!'];
                if($json) {
                    echo CJSON::encode($return);
                } else {
                    return $return;
                }
                return;
            }

            $minutes = 0;

            foreach($lancamentos['inicio'] as $key => $lancamento) {
                $minutes += $this->calculaDiferencaDatas($lancamento->FAS_DATA, $lancamentos['fim'][$key]->FAS_DATA);
            }

            $return = ['code' => 0, 'horas' => Util::convertMinutesToTime($minutes)];
        } else{
            $return = $lancamentos;
        }

        if($json) {
            echo CJSON::encode($return);
        } else {
            return $return;
        }
    }

    private function calculaDiferencaDatas($inicio, $fim)
    {

        $calc = new HoursCalculator(
            Carbon::createFromFormat("d/m/Y H:i:s", $inicio),
            Carbon::createFromFormat("d/m/Y H:i:s", $fim)
        );
        $minutes = $calc->getHours();
        return $minutes;
    }
}