<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;


use App\Models\Meiosdetrabalho;
use App\Models\BasesClientes;
use App\Models\OrgaosDeEstrutura;
use App\Models\ParametroDocumental;
use App\Models\CampoMapa;
use App\Models\DepCliente;
use App\Models\LinhaIndexacao;
use App\Models\ReferenciaCaixa;
use App\Models\IntervaloNumerico;
use App\Models\Caixa;
use App\Models\Reserva;
use App\Models\HistoricoCaixa; 
use App\Models\Checkin;
use App\Models\ConfCaixa; 
use App\Models\CaixaCheckin;
use App\Models\Etiqueta; 
use App\Models\EtiqPend;

use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Crypt;

class Servextcontroller extends Controller
{
    
    
    public function cadastrarMeio (Request $request){
        
        $Meio = new Meiosdetrabalho();
        //Verifica se há um meio com o mesmo nome
        $M=Meiosdetrabalho::where('meio',$request->meio)->first();
        if($M){
            return 0;
        }else{
                
            $Meio->meio=$request->meio;
            $Meio->quantidade=$request->quantidade;
            $Meio->usuario_id=Auth::id();
            $Meio->save();
            
            return 1;
        }
    }
    public function actualizarMeio(Request $req){
        
        
        $M=Meiosdetrabalho::where('meio',$req->meio)->where('quantidade',$req->quantidade)->first();
        if($M){
            return 0;
        }else{
            
            $Meio=Meiosdetrabalho::where('id',$req->id)->first();
            
            if ($Meio){
                $Meio->meio=$req->meio;
                $Meio->quantidade=$req->quantidade;
                $Meio->save();
                return 1;
            }else{
                return 0;
            }
        }
    }
    public function cadastrarOE(Request $request){
        
        //dd($request);
        $Base = new BasesClientes();
        //Verifica se há um meio com o mesmo nome
        $B=BasesClientes::where('orgaosdeestrutura_id',$request->tipo)->where('localizacao',$request->localidade)->first();
        if($B){
            return 0;
        }else{
                
            $Base->orgaosdeestrutura_id=$request->tipo;
            $Base->localizacao=$request->localidade;
            $Base->usuario_id=Auth::id(); 
            $Base->save();
            
            return 1;
        } 
    }
    public function actualizarOE(Request $request){
        //tipo
        //localizacao
         
        $B=BasesClientes::where('orgaosdeestrutura_id',$request->tipo)->where('localizacao',$request->localidade)->first();
        if($B){
            return 0;
        }else{
            
            $Base=BasesClientes::where('id',$request->id)->first();
            
            if ($Base){
                $Base->orgaosdeestrutura_id=$request->tipo;
                $Base->localizacao=$request->localizacao;
                $Base->save();
                return 1;
            }else{
                return 0;
            }
        }
    }
    public function cadastrarTOE(Request $request){
        
        //dd($request);
        $Base = new OrgaosDeEstrutura();
        //Verifica se há um meio com o mesmo nome
        $B=OrgaosDeEstrutura::where('orgao',$request->tipo)->where('cliente_id',$request->cliente_id)->first();
        if($B){
            return 0;
        }else{
          
                
            $Base->orgao=$request->tipo;
            $Base->usuario_id=Auth::id();
            $Base->cliente_id= $request->cliente_id;
            $Base->save();
            
            return 1;
        } 
    }
    public function actualizarTOE(Request $request){
        //tipo
        //localizacao
         
         
        $B=OrgaosDeEstrutura::where('orgao',$request->tipo)->where('cliente_id',$request->cliente_id)->first();
        if($B){
            return 0;
        }else{
            
            $Base=OrgaosDeEstrutura::where('id',$request->id)->first();
            
            if ($Base){
                $Base->orgao=$request->tipo;
                $Base->save();
                return 1;
            }else{
                return 0;
            }
        }
    }
    
    
    
    
    public function cadastrarCampoMapa(Request $request){
        
        $campo= new CampoMapa();
            $campo->nome=$request->nome;
            $campo->descricao=$request->descricao;
            $campo->tipo=$request->tipo;
            $campo->possivelvalore1=$request->possiveisVal1;
            $campo->possivelvalore2=$request->possiveisVal2;
            $campo->possivelvalore3=$request->possiveisVal3;
            $campo->origem='Específico';
            $campo->cliente_id=$request->cliente;
            $campo->usuario_id=Auth::id();
        $campo->save(); 
        return 1;
        
    }
    public function actualizarCampoMapa(Request $request){
        
        
    }
    public function eliminarCampoMapa(Request $request){
        
        
    }
    
    public function returnDeps(Request $request){
        
        $Deps=DepCliente::where('orgaosdeestrutura_id',$request->orgao_id)->get();
        if($Deps->count()>0){
            $return="";
            foreach($Deps as $Dep){
                $return.="<option value='$Dep->id'>$Dep->departamento</option>";
            }
            return $return;
        }else
            return 0;
    }
    public function returnOE(Request $request){
        
        $Oes=OrgaosDeEstrutura::where('cliente_id',$request->cliente_id)->get();
        if($Oes->count()>0){
            $return="";
            foreach($Oes as $Oe){
                $return.="<option value='$Oe->id'>$Oe->orgao</option>";
            }
            return $return;
        }else
            return 0;
    }
    public function returnSD(Request $request){
         
        $SDs=ParametroDocumental::where('cliente_id',$request->cliente_id)->get();
        
        if($SDs->count()>0){
            $return="";
            foreach($SDs as $SD){
                $return.="<option value='$SD->id'>$SD->seriedoc</option>";
            }
            return $return;
        }else
            return "<option value='0' style='dysplay:none'>Sem série disponível</option>";
    }
    public function indexarLinha(Request $request){
        
        $camposMapa=new CampoMapa();
        $linhasIndexacao=new LinhaIndexacao();
        $datas =  explode("&", $request->data);
        $codigoHistorico=0;
        while(true){
            $codigoHistorico = mt_rand();
            $indLine=LinhaIndexacao::where('codigo',$codigoHistorico)->first();
            if($indLine){
                
            }else{
                break;
            }
            
        }
        foreach($datas as $data){
            $info=explode("=",$data);
            
            $getCampo=$camposMapa::where('nome',$info[0])->first();
            if($getCampo){
                //echo "<br>".$data." Info: ".$info[0]." | ".$info[1];
                //echo"<br>Campo $getCampo->nome encontrado <br>";
                $linhasIndexacao->create(['campomapa_id'=>$getCampo->id,'codigo'=>$codigoHistorico,'conteudo'=>$info[1],'referenciacaixa_id'=>$request->referencia_id,'cliente_id'=>$request->cliente_id,'estadoindexacao'=>'emprocesso','usuario_id'=>Auth::id()]);
            }
            
        }
        
        
        
        //dd($datas);
        return 1;
    }
    public function finalizarIndexacao(Request $request){
        //dd($request->all());
        $referenciaCaixa=ReferenciaCaixa::where('codigo',$request->codigo)->first();
        
        if($referenciaCaixa){
            
            $referenciaCaixa->estado='Concluido';
            $referenciaCaixa->save();
            
            $indLines=LinhaIndexacao::where('referenciacaixa_id',$referenciaCaixa->id)->get();
            foreach($indLines as $indLine){
                $indLine->estadoindexacao='finalizada';
                $indLine->save();
            }
            return 1;
        }else
            return 0;
        //dd($request->codigo);
    } 
    
    public function iniciarIndex(Request $request){
        $referenciaCaixa=ReferenciaCaixa::where('codigo',$request->codigo)->first();
        
        if($referenciaCaixa){
            
            $referenciaCaixa->estado='Processo';
            $referenciaCaixa->save();
            
            
            return 1;
        }else
            return 0;
        
    }
    public function eliminarLinha(Request $request){
         $referenciaCaixa=ReferenciaCaixa::where('codigo',$request->codigo)->first();
        
        if($referenciaCaixa){
            
            $indLines=LinhaIndexacao::where('referenciacaixa_id',$referenciaCaixa->id)->get();
            foreach($indLines as $indLine){
                $indLine->estadoindexacao='finalizada';
                $indLine->delete();
            }
            
            return 1;
        }else
            return 0;
    }
    
    //Stresss     E L I MI N A R      C L I E  N T E S 
    public function eliminarLinhaClientes(Request $request){

        try {
            $valorchave=Crypt::decryptString($request->codigo);
        } catch (DecryptException $th) {
            //return redirect()->route('');
        }

        $indLines=LinhaIndexacao::where('codigo',$valorchave)->where('estadoindexacao',"emprocesso")->get();
      //  dd($indLines);
        if($indLines){
           foreach($indLines as $indLine){
               $indLine->delete();
           }

           return 1;
       }else
           return 0;
   }
    
    
     
  
    
    public function cadastrarIntervalo(Request $request){
        
        $intervalo = new IntervaloNumerico();
        $iN=IntervaloNumerico::where('seriedocumental_id',$request->serie)->first();
        $inicial=$request->ninicial;
        $final=$request->nfinal;
        $inicial--;
        $final++;
        $iN2=IntervaloNumerico::where('numero_inicial','>',$inicial)->where('numero_final','<',$final)->first();
        if($iN){
            
            return -1;
            
        }
        else{
            
            $intervalo->numero_inicial=$request->ninicial;
            $intervalo->numero_final=$request->nfinal;
            $intervalo->seriedocumental_id=$request->serie;
            $intervalo->cliente_id=$request->cliente;
            $intervalo->usuario_id=Auth::id();
            $intervalo->save();
            return 1;
        }
    }
    public function actualizarIntervalo(Request $request){
        
        $iN=IntervaloNumerico::where('id',$request->id)->first();
             
        if($iN){
            
        
            $iN->numero_inicial=$request->ninicial;
            $iN->numero_final=$request->nfinal;
            $iN->usuario_id=Auth::id();
            $iN->save();
            return 1;
            
        }else{
            
            return -1;
            
        }
        
        
    }
    
    
    private function save(Request $request)
    {
        $minhaEMpresa=\App\Models\FuncionarioCliente::trazer_Empresa_id();

        //dd($minhaEMpresa->id);
        $refCaixa= new ReferenciaCaixa();
        $refCaixa->numerodacaixa=$request->numerodacaixa;
        $refCaixa->numerodecaixafinal=$request->numerodecaixafinal;
        $refCaixa->estado='Processo';
        $refCaixa->data=$request->Data;
        $refCaixa->autor="CLIENTE";
        $refCaixa->flexibilizacao=0;
        $refCaixa->codigo=$this->gerarCode();
        $refCaixa->departamento_id=$request->dep;
        $refCaixa->funcionario_id=Auth::id();
        $refCaixa->cliente_id=$minhaEMpresa->id;
        $refCaixa->seriedocumental_id=1;
        $refCaixa->usuario_id=$request->funcionario_id;
       return $refCaixa->save();
    }
    private function camposVazios(Request $request)
    {
        if(empty($request->OE))
            return false;
            else if($request->OE <= 0)
                return false;

        return true;
    }
    
    public function cadastrarPlanodetarefa(Request $request){
        
        if($request->autor==="CLIENTE")
            {
                if(!$this->camposVazios($request))
                 {
                            $cadastrarPlanodetarefa['success']=false;
                            $cadastrarPlanodetarefa['message']='Preencha o campo Departamento';
                            return json_encode($cadastrarPlanodetarefa);
                }else
                    if(empty($request->Data))
                    {
                            $cadastrarPlanodetarefa['success']=false;
                            $cadastrarPlanodetarefa['message']='Preencha o campo Data';
                            return json_encode($cadastrarPlanodetarefa);

                    }else
                        if(empty($request->numerodacaixa))
                        {
                                $cadastrarPlanodetarefa['success']=false;
                                $cadastrarPlanodetarefa['message']='Preencha o campo Número da Caixa Inicial';
                                return json_encode($cadastrarPlanodetarefa);
                        }else
                            if(empty($request->numerodecaixafinal))
                            {
                                    $cadastrarPlanodetarefa['success']=false;
                                    $cadastrarPlanodetarefa['message']='Preencha o campo Número da Caixa Final';
                                    return json_encode($cadastrarPlanodetarefa);
                            }
                            else
                                if(empty($request->dep))
                                {
                                    $cadastrarPlanodetarefa['success']=false;
                                    $cadastrarPlanodetarefa['message']='Preencha o campo Departamento';
                                    return json_encode($cadastrarPlanodetarefa);
                                }
                    
                $salvo=$this->save($request);

                if($salvo)
                {
                    $cadastrarPlanodetarefa['success']=true;
                    $cadastrarPlanodetarefa['message']='Agenda Realizada com sucesso';
                    return json_encode($cadastrarPlanodetarefa);
                }

                $cadastrarPlanodetarefa['success']=false;
                $cadastrarPlanodetarefa['message']='bad';
                return json_encode($cadastrarPlanodetarefa);
        }

        $refCaixa= new ReferenciaCaixa();
        
        if($request->Quantidade){
            
        }else{
           
            //Indexação ADOC
            $departamento = DepCliente::where('id',$request->departamento_id)->first();
            $cliente_id=$departamento->getCliente->id;
            $reserva = new Reserva();
            $reserva->cliente_id=$cliente_id;
            $reserva->departamento_id=$request->departamento_id;
            $reserva->quantcaixas=1;
            $reserva->usuario_id=Auth::id();
            $reserva->save();
            
            $caixa=new Caixa();
            
            $lastIdReserva=Reserva::latest('id')->first();
             
            $caixa->create(['reserva_id'=> $lastIdReserva->id,'numerodacaixa'=> $request->numerodacaixa,'usuario_id'=>Auth::id()]);
            
            $histCx= new HistoricoCaixa();
            $etiqueta = new Etiqueta();
            $cx = $caixa::join('etiquetas','etiquetas.caixa_id','=','caixas.id')->where('caixas.idantigo',null)->select('etiquetas.numerobarcode','caixas.id')->latest('caixas.id')->first();
            $cxMid = $caixa::max('id');
            $histCx->create(['caixa_id'=>$cxMid,'acontecimento'=>'Caixa reservada para a indexação','usuario_id'=>Auth::id()]); 
            
            if($cx){
                
            $bcN=$cx->numerobarcode;
            $nbc=0;
            if ($bcN<5000000)
            $nbc=5000000;
            else
            $nbc=$bcN+1;
            }else
            $nbc=5000000;
             
            $etiqueta->create(['numerobarcode'=>$nbc,'caixa_id'=>$cxMid,'usuario_id'=>Auth::id()]);
             
            $lastEtiq=Etiqueta::latest('id')->first();
            $histCx->create(['caixa_id'=>$cxMid,'acontecimento'=>'Geração automática da etiqueta da caixa','usuario_id'=>Auth::id()]);
            $etiqPend = new EtiqPend();
            $etiqPend->caixa_id=$cx->id;
            $etiqPend->etiqueta_id=$lastEtiq->id;
            $etiqPend->usuario_id=Auth::id();
            $etiqPend->save();
    
     
           
             
        }
        
        if($request->Quantidade)
            $refCaixa->quantidade_caixas=$request->Quantidade;
        else
            $refCaixa->quantidade_caixas=1;
        $refCaixa->numerodacaixa=$request->numerodacaixa;
        $refCaixa->numerodecaixafinal=$request->numerodecaixafinal;
        $refCaixa->estado='Processo';
        $refCaixa->data=$request->data;
        $refCaixa->autor=$request->autor;
        $refCaixa->flexibilizacao= $request->flexibilizacao =='false'? 0:1;
        $refCaixa->tipoindexacao=$request->tipoindexacao;
        $refCaixa->codigo=$request->codigo;
        $refCaixa->departamento_id=$request->departamento_id;
        $refCaixa->funcionario_id=Auth::id();
        $refCaixa->cliente_id=$request->cliente_id;
        if($request->seriedocumental_id>0)
        $refCaixa->seriedocumental_id=$request->seriedocumental_id;
        $refCaixa->usuario_id=$request->funcionario_id;
        $refCaixa->save();
        
        if($request->flexibilizacao =='false'){
            
            
        }else{
            
            
            
        }
       return 1;
        
    }
    public function actualizarPlanodetarefa(Request $request){
        
    }
    
    
    
    public function gerarCode()
    {
        $codigoHistorico=0;
            while(true){
                $codigoHistorico = mt_rand();
                if($codigoHistorico>0)
                {
                        $indLine=\App\Models\LinhaIndexacao::where('codigo',$codigoHistorico)->first();
                        if($indLine){
                            
                        }else{
                            break;
                        }
                }
            }
        return $codigoHistorico;
    }
    
    public function returnNumerosDisponiveis(Request $request){
        
        $oucupadas="";
       if($request->cliente_id >0){
           
        $numero=Caixa::join('reservas','reservas.id','=','caixas.reserva_id')->where('reservas.cliente_id',$request->cliente_id)->select('caixas.numerodacaixa')->orderBy('caixas.numerodacaixa','desc')->first();
        if($numero){
            $numeroCx=$numero->numerodacaixa;
            $numeroCx++;
            return $numeroCx;
        }
        else{
            return 1;
        }
       }
       else
        return 0;
    }
    
    public function importMapaGeral(){
        
        $data=array();
        
        $camposMapa=new CampoMapa();
        
        $linhasIndexacao=new LinhaIndexacao();
         
        array_push($data,[1,0,0,0,'2008-01-01','2008-05-31','Bom',1,'GESTDOC','',0,0,'SALÁRIOS']); 
        
       /* 
        3-numero_da_caixa
        4-orgaoestrutura_id
        5-departamento_id
        6-seriedocumental_id
        7-data1
        8-data2
        9-estado
        10-funcionario_id
        11-local_custodia
        12-observacao
        13-recolha_id
        14-controlo_de_quaidade
        15-desc_omb
          */
        $linhasIndexacao->create(['campomapa_id'=>3,'codigo'=>40,'conteudo'=>$data[0][1],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>4,'codigo'=>40,'conteudo'=>$data[0][2],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>5,'codigo'=>40,'conteudo'=>$data[0][3],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>6,'codigo'=>40,'conteudo'=>$data[0][4],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>7,'codigo'=>40,'conteudo'=>$data[0][5],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>8,'codigo'=>40,'conteudo'=>$data[0][6],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>9,'codigo'=>40,'conteudo'=>$data[0][7],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>10,'codigo'=>40,'conteudo'=>$data[0][8],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>11,'codigo'=>40,'conteudo'=>$data[0][9],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>12,'codigo'=>40,'conteudo'=>$data[0][10],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>13,'codigo'=>40,'conteudo'=>$data[0][11],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>14,'codigo'=>40,'conteudo'=>$data[0][12],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);
        $linhasIndexacao->create(['campomapa_id'=>15,'codigo'=>40,'conteudo'=>$data[0][13],'cliente_id'=>10,'numerocaixa'=>$data[0][0],'usuario_id'=>Auth::id()]);

        
       
        
    }
}
