<?php

class ReporteAuxiliarNomina
{
    protected $nomina;

    public function __construct($nomina)
    {
        $this->nomina = $nomina;
    }

    public function make()
    {
        $excel = new PHPExcel();

        foreach(range('A', 'J') as $columnID) {
            $excel->getActiveSheet()->getColumnDimension($columnID)->setAutoSize(true);
        }

        $excel->getActiveSheet()->getStyle('A1:J1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $excel->getActiveSheet()->getStyle('A1:J1')->getFont()->setBold(true);
        $excel->getActiveSheet()->getStyle('A1:J1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
        $excel->getActiveSheet()->getStyle('A1:J1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
        $excel->getActiveSheet()->getStyle('A1:J1')->getFill()->getStartColor()->setARGB('1C336E');

        $excel->getActiveSheet()->getStyle('A4:E4')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $excel->getActiveSheet()->getStyle('A4:E4')->getFont()->setBold(true);
        $excel->getActiveSheet()->getStyle('A4:E4')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
        $excel->getActiveSheet()->getStyle('A4:E4')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
        $excel->getActiveSheet()->getStyle('A4:E4')->getFill()->getStartColor()->setARGB('1C336E');

        $excel->getActiveSheet()->getStyle('A7:H7')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $excel->getActiveSheet()->getStyle('A7:H7')->getFont()->setBold(true);
        $excel->getActiveSheet()->getStyle('A7:H7')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
        $excel->getActiveSheet()->getStyle('A7:H7')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
        $excel->getActiveSheet()->getStyle('A7:H7')->getFill()->getStartColor()->setARGB('1C336E');

        $fila = 1;
        foreach ($this->primerBloque() as $campos) {
            $columna = 0;

            foreach ($campos as $key => $valor) {
                if ($key == 'total_pago') {
                    $excel->getActiveSheet()->setCellValueByColumnAndRow($columna, $fila, $valor);
                    $excel->getActiveSheet()->getStyleByColumnAndRow($columna, $fila)->getNumberFormat()->setFormatCode('#,##0.00');
                    $excel->getActiveSheet()->getStyleByColumnAndRow($columna, $fila)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
                } else {
                    $excel->getActiveSheet()->setCellValueExplicitByColumnAndRow($columna, $fila, $valor);
                }

                $columna++;
            }
            $fila++;
        }

        $fila += 1;
        foreach ($this->segundoBloque() as $campos) {
            $columna = 0;

            foreach ($campos as $key => $valor) {
                if ($key == 'monto_pagado') {
                    $excel->getActiveSheet()->setCellValueByColumnAndRow($columna, $fila, $valor);
                    $excel->getActiveSheet()->getStyleByColumnAndRow($columna, $fila)->getNumberFormat()->setFormatCode('#,##0.00');
                    $excel->getActiveSheet()->getStyleByColumnAndRow($columna, $fila)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
                } else {
                    $excel->getActiveSheet()->setCellValueExplicitByColumnAndRow($columna, $fila, $valor);
                }
                $columna++;
            }
            $fila++;
        }

        $fila += 1;
        foreach ($this->tercerBloque() as $campos) {
            $columna = 0;
            foreach ($campos as $key => $valor) {
                if ($key == 'monto_pagar') {
                    $excel->getActiveSheet()->setCellValueByColumnAndRow($columna, $fila, $valor);
                    $excel->getActiveSheet()->getStyleByColumnAndRow($columna, $fila)->getNumberFormat()->setFormatCode('#,##0.00');
                    $excel->getActiveSheet()->getStyleByColumnAndRow($columna, $fila)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
                } else {
                    $excel->getActiveSheet()->setCellValueExplicitByColumnAndRow($columna, $fila, $valor);
                }
                $columna++;
            }
            $fila++;
        }

        return $excel;
    }

    private function primerBloque()
    {
        $datos = [
            ['Nombre archivo','Descripción','Fecha registro','Tipo de pago','Banco','Tipo de cuenta','Número de cuenta',
            'Cant pago','Monto total a pagar','Estatus']
        ];

        return array_merge($datos, $this->getEncabezado());
    }

    private function segundoBloque()
    {
        $datos = [
            ['Número de comprobante', 'Fecha de operación', 'Cantidad', 'Monto pagado', 'Observación']
        ];

        return array_merge($datos, $this->getPago());
    }

    private function tercerBloque()
    {
        $datos = [
            ['Cédula','Nombre','Apellidos','Unidad','Proceso','Monto Pagar','Estatus','Observación']
        ];

        return array_merge($datos, $this->getDetalle());
    }

    private function getEncabezado()
    {
        return Yii::app()->getDb()->createCommand("
            select  pm.nombre_archivo
                ,pm.descripcion
                ,pm.fecha_registro
                ,tpp.nombre_proceso
                ,pb.banco
                ,pb.tipo_cuenta
                ,pb.num_cuenta
                ,pm.cant_pago
                ,pm.total_pago
                ,ep.nombre_estatus
            from pagos.pagos_masivos pm
            inner join contable.titulo_proceso_pago tpp on tpp.id=pm.id_tipo_pagos_masivos
            inner join configuracion.param_bancos pb on pb.id=pm.id_param_banco
            inner join pagos.pagos_masivos_seguimiento pms on pms.id_pagos_masivos=pm.id and pms.actual is true
            inner join pagos.estatus_pagos ep on ep.id=pms.id_estatus_pagos
            where pm.id=:id
        ")->bindValues([
            'id' => $this->nomina->id
        ])->queryAll();
    }

    public function getPago()
    {
        return Yii::app()->getDb()->createCommand("
            select referencia, fecha_pago, count(*) as cantidad, sum(monto_pagado) as monto_pagado, observacion
            from contable.proceso_pago
            where id_proceso in (
                select id_proceso
                from pagos.pagos_masivos_detalle
                where id_pagos_masivos=:id
            )
            group by referencia, fecha_pago, observacion
        ")->bindValues([
            'id' => $this->nomina->id
        ])->queryAll();
    }

    private function getDetalle()
    {
        $datos = (new PagosMasivosDetalle('search'))->searchExcel($this->nomina->id)->getData();

        return (new Warp($datos))->map(function ($pago) {
            return [
                'cedula' => $pago->cedula,
                'nombre' => $pago->nombre,
                'apellidos' => $pago->apellidos,
                'unidad' => $pago->unidad,
                'proceso' => $pago->proceso,
                'monto_pagar' => $pago->monto_pagar,
                'estatus' => $pago->idEstatusDetalle->nombre,
                'observacion' => $pago->observacion,
            ];
        });
    }
}
