<?php
class ReportListEntity Extends ReportListRepository{
    
    public $flashmessenger = null;
    public $saveFile = null;
    public $options = array(
        'fechaInicio'=>null,
        'fechaFin'=>null,
        'vendor_id'=>null,
        'reporte'=>null
    );
    public $nombreArchivo = null;
    public $reporte = null;
    public $tempFolder = null;
    public $headerExcelReport = null;
    
     private $reportes = array(
        'cuentas_por_pagar'=>'accountsPayable',
        'cuentas_por_pagar_detalles'=>'accountsPayableDetails',
    );
    
    private $nombreReportes = array(
        'cuentas_por_pagar'=>'Cuentas por pagar',
        'cuentas_por_pagar_detalles'=>'Cuentas por pagar detalles',
    );
    
    #Para excel 'nombreReporte'=>'nombreArchivo en View/Reports/Excel'
    private $reportesEspeciales = array(
        'cuentas_por_pagar'=>'cuentas_por_pagar',
        'cuentas_por_pagar_detalles'=>'cuentas_por_pagar',
    );
    
    #Para excel 'nombreReporte'=>'nombreArchivo en View/Reports/Screen'
    private $reportesEspecialesPantalla = array(
        'cuentas_por_pagar'=>'cuentas_por_pagar',
        'cuentas_por_pagar_detalles'=>'cuentas_por_pagar',
    );    
    
     #Para pantala=la 'nombreReporte'=>'nombreArchivo en View/Reports/PDF'
    private $reportesEspecialesPDF = array(
        'cuentas_por_pagar'=>'cuentas_por_pagar',
        'cuentas_por_pagar_detalles'=>'cuentas_por_pagar_detalles',
    );
    
    public function __construct() {
        if(!$this->flashmessenger instanceof FlashMessenger){
            $this->flashmessenger = new FlashMessenger();
        }
    }
    
    public function _getTranslation($text){
        return $this->flashmessenger->_getTranslation($text);
    }
    
    public function setOptions($data){
      foreach ($this->options as $option => $value){
          if(isset($data[$option])){
            $this->options[$option] = $data[$option];
          }
      } 
      $this->createReporte();
    }
    
    public function getOptions(){
        return $this->options;
    }
    
    public function getNombreReporte(){
        return $this->options['reporte'];
    }
    
    public function getTituloReporte(){
        return $this->nombreReportes[$this->options['reporte']];
    }
    
    public function getNombreArchivo(){
        return str_replace(' ', '', $this->nombreArchivo);
    }
    
    public function setNombreArchivo(){
        if(isset($this->nombreReportes[$this->getNombreReporte()])){
            $this->nombreArchivo = $this->nombreReportes[$this->getNombreReporte()];
        }
    }
    
    public function setNombreReporteManual($nombreArchivo){
        $this->nombreArchivo = $nombreArchivo;
    }
    
    public function setHeaderExcelReportManual($headerReport){
        $this->headerExcelReport = $headerReport;
    }
    
    public function createReporte(){
        ini_set('max_execution_time', 18000);
        ini_set('mysql.connect_timeout', 18000);
        ini_set('default_socket_timeout', 18000);
        ini_set('memory_limit', '-1');
        
        $nombreReporte = $this->reportes[$this->getNombreReporte()];
        $this->setNombreArchivo();
        $this->setReporte($this->$nombreReporte());  
        
        $_SESSION['optionsCurrentReport'] = array(
            'options'=>$this->getOptions()
        );
    }
    
    public function getStringToSendGET(){
        $options = $this->getOptionsCurrentReport();
        $string = "?";
        foreach($options['options'] as $key => $value){
            if(is_array($value)){ $value = implode(',', $value);}            
            $string .= $key."=".$value."&";
        }
        
        $string = trim($string,"&");
        return $string;
    }
    
    public function getOptionsCurrentReport(){
        return $_SESSION['optionsCurrentReport'];
    }
    
     public function setReporte($data){      
        if($data == null){ 
            $this->flashmessenger->addMessage(array('info'=>'No se encontraron resultados.'));
            header('location: '.ROOT_HOST.'/Controller/Reportes.php');
            exit;
        }
        
        $this->reporte = $data; 
    }
    
    public function getReporte(){
       return $this->reporte;
    }
    
    public function accountsPayable(){        
        return parent::getAccountPayable($this->getOptions());
    }
    
     public function accountsPayableDetails(){        
        return parent::getAccountPayableDetails($this->getOptions());
    }
    
    public function getReporteOnFile($formato = null){   
        $empresa = new CompanyRepository();
        $empresa = $empresa->getById(1);
        
        $fechaInicio = $this->options['fechaInicio'];
        $fechaFin = $this->options['fechaFin'];
        if(trim($fechaInicio)=='' && trim($fechaFin)==''){
            $fechaInicio = $this->_getTranslation("Desde el inicio de los tiempos");
            $fechaFin = strftime('%m/%d/%Y',strtotime('now'));
        }elseif(trim($fechaInicio)=='' && trim($fechaFin)!=''){
            $fechaInicio = $fechaFin;
        }elseif(trim($fechaInicio)!='' && trim($fechaFin)==''){
            $fechaFin = $fechaInicio;
        }
        $this->setHeaderExcelReportManual($empresa['name']."\n".$this->_getTranslation($this->getTituloReporte())."\n".$fechaInicio." - ".$fechaFin);
      
        if($formato == 'excel'){ 
            if(isset($this->reportesEspeciales[$this->options['reporte']])){ 
             $this->reporteEspecial();
            }else{
                $this->reporteDefault();
            }
        }elseif($formato == 'pdf'){
            if(isset($this->reportesEspecialesPDF[$this->options['reporte']])){
                $this->reporteEspecialPDF();
            }
        }          
    }
    
    public function reporteEspecial(){
        $data = $this->reporte;
        include ROOT.'/View/Reports/Excel/'.$this->options['reporte'].".php";
    }
    
    public function reporteEspecialPDF(){
        $data = $this->reporte;
        include ROOT.'/View/Reports/Pdf/'.$this->options['reporte'].".php";
    }
    
    public function getTemplateReporteOnScreen(){
        if(isset($this->reportesEspecialesPantalla[$this->options['reporte']])){
            return ROOT.'View/Reports/Screen/'.$this->options['reporte'].".php";
        }else{
            return ROOT.'View/Reports/Screen/default.php';
        }
    }
    
    public function reporteDefault(){
        $arrayData = $this->reporte;
        $arrayData = $arrayData['data'];
        $colTitulosTemp = $arrayData[0];
       
        foreach($colTitulosTemp as $titulo => $value){
            $colTitulos[] = $titulo;
        }
                     
        $objPHPExcel = new PHPExcel(); 
        $objPHPExcel->getActiveSheet()->freezePane('A3');
        $col = count($colTitulos);
        $lastCol = $this->getColLetter($col-1);
        //var_dump($arrayData);echo "aqui ando";exit;

        $objPHPExcel->getActiveSheet()->mergeCells("A1:".$lastCol."1");            
        $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(50);
        $objPHPExcel->getActiveSheet()->getStyle("A1")->getFont()->setBold(true);
        $objPHPExcel->getActiveSheet()->setCellValue("A1", $this->headerExcelReport);
        $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setWrapText(true);
        $objPHPExcel->getActiveSheet()->getStyle("A1")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle("A1")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

        $objPHPExcel->getActiveSheet()->getStyle("A2:".$lastCol."2")->getFont()->setBold(true);
        $objPHPExcel->getActiveSheet()->getStyle("A2:".$lastCol."2")->getAlignment()->setWrapText(true);
        $objPHPExcel->getActiveSheet()->getStyle("A2:".$lastCol."2")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle("A2:".$lastCol."2")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);     

        $objPHPExcel->getActiveSheet()->fromArray($colTitulos,NULL,'A2');   
        $row = 3;
        foreach ($arrayData as $key => $data) {
            $i=0;
            foreach ($data as $col => $value) {
                $col = $this->getColLetter($i);
                $objPHPExcel->getActiveSheet()->setCellValue($col . $row, $value);
                $i++;
            }
            $row++;
        }
        
        foreach(range('A',$lastCol) as $columnID) {
        $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)
            ->setAutoSize(true);
        }
        
        $objPHPExcel->setActiveSheetIndex(0);          
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

        if($this->saveFile == true){
            $objWriter->save($this->getTempFolder()."/".$this->getNombreArchivo().".xlsx");
        }else{                
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            header("Content-Disposition: attachment;filename=".$this->getNombreArchivo().".xlsx");
            header('Cache-Control: max-age=0');
            $objWriter->save('php://output');
            unset($objWriter);
            exit;
        }
    }
    
    public function reportToPDF(){
        $reporteName = $this->getNombreReporte();
        #Widths de columnas del reporte
        $reportsWidths = array(
            'entradas'=>array(17,17,17,30,60,40,17,17,14,14,14,17),
            'salidas'=>array(17,22,13,20,13,17,60,40,17,17,14,14,17),
            'inventario_por_cliente'=>array(60,50,25,25,12,12,12),
            'inventario_por_lote'=>array(29,40,17,17,17,12,12,12,40),
            'inventario_por_locacion'=>array(25,40,20,20,12,12,12,50)
        );
        
        #Aligns de columnas del reporte
        $reportsAligns = array(
            'entradas'=>array('C','C','C','C','C','C','C','C','R','R','R','C'),
            'salidas'=>array('C','C','C','C','C','C','C','C','C','C','R','R','R'),
            'inventario_por_cliente'=>array('C','C','C','C','C','R','R'),
            'inventario_por_lote'=>array('C','C','C','C','C','R','R','C','C',),
            'inventario_por_locacion'=>array('C','C','C','C','C','R','R','C')
        );
        
        #Columnas que no se imprimen en reporte pdf
        $colNoPrint = array(
            'entradas'=>array('Load status','Product status'),
            'salidas'=>array(),
            'inventario_por_cliente'=>array(),
            'inventario_por_lote'=>array(),
            'inventario_por_locacion'=>array()
        );
        
        #Orienteacion de la pagina dependiendo del reporte.
        $orientationPage = array(
            'entradas'=>'L',
            'salidas'=>'L',
            'inventario_por_cliente'=>'P',
            'inventario_por_lote'=>'P',
            'inventario_por_locacion'=>'P',
        );
        
        #Set X dependiendo del reporte
        $setX = array(
            'entradas'=>'170',
            'salidas'=>'170',
            'inventario_por_cliente'=>'100',
            'inventario_por_lote'=>'100',
            'inventario_por_locacion'=>'100'
        );
        
        $pdf = new PDF();
        $pdf->AddPage($orientationPage[$reporteName]);
        
        $pdf->SetFillColor(200,200,200);
        $pdf->Image(ROOT."/public/img/logo.png",10,10,40,0);
        
        /*Para titulo de reporte*/
        $pdf->SetFont('Arial','','10');
        $pdf->SetWidths(array(100));
        $pdf->SetAligns(array('C'));
        $pdf->SetX($setX[$reporteName]);
        $pdf->Row(array($this->headerExcelReport));              
        
        $arrayData = $this->reporte;  
        $arrayData = $arrayData['data'];
       
        /* GET COL TITLES */
        $colTitulosTemp = $arrayData[0];
        $colNoPrint = $colNoPrint[$reporteName];
        foreach($colTitulosTemp as $titulo => $value){
            if(!in_array($titulo,$colNoPrint )){
                $colTitulos[$titulo] = $titulo;
            }            
        }       

        $pdf->SetFont('Arial','','6');
        #Agregar titulos de columnas en primera posicion del array.
        array_unshift($arrayData, $colTitulos);
        $pdf->Ln(10);
        #Setear width de columnas de la tabla
        $pdf->SetWidths($reportsWidths[$reporteName]);
        $pdf->SetAligns($reportsAligns[$reporteName]);
        #Imprimir tabla con informacion
        $pdf->printTable($arrayData,array('width'=>270,'align'=>'C','padding'=>5),$colNoPrint);
        $pdf->Output();        
    }
    
    public function saveFile(){
        $this->setTempFolder();
        $this->saveFile = true;
    }
    
    public function getColLetter($i){
        $colName = array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI");
        
        return $colName[$i];
    }
    
    private function setTempFolder(){
        $login = new Login();
        $this->tempFolder = PATH_TEMP_DOCS.$login->getId();
        if(!is_dir($this->tempFolder)){
            mkdir($this->tempFolder,0777,true);
        }
    }
    
    public function getTempFolder(){
        return $this->tempFolder;
    }
    
    public function getFileSaved(){
        return $this->getTempFolder()."/".$this->getNombreArchivo().'.xlsx';
    }
}