<?php

declare(strict_types=1);

namespace App\Controller;

use Dompdf\Dompdf;
use Dompdf\Options;

/**
 * AvancesProyectos Controller
 *
 * @property \App\Model\Table\AvancesProyectosTable $AvancesProyectos
 */
class AvancesProyectosController extends AppController
{
    public function beforeFilter(\Cake\Event\EventInterface $event)
    {
        parent::beforeFilter($event);

        $currentAction = $this->request->getParam('action');
        $this->verificarPermisoORedireccionar('AvancesProyectos', $currentAction);
    }

    public function index()
    {
        $table = $this->fetchTable('AvancesProyectos');
        $query = $table->find()
            ->contain(['SeguimientosProyectos.ClientesFacturacion'])
            ->orderBy(['AvancesProyectos.fecha_avance' => 'DESC']);
        $avancesProyectos = $this->paginate($query);

        $this->set(compact('avancesProyectos'));
        if ($this->request->is('ajax')) {
            $this->viewBuilder()->setLayout('ajax');
        }
    }

    public function view($id = null)
    {
        $table = $this->fetchTable('AvancesProyectos');
        $avanceProyecto = $table->get($id, contain: [
            'SeguimientosProyectos.ClientesFacturacion'
        ]);

        $this->set(compact('avanceProyecto'));
        if ($this->request->is('ajax')) {
            $this->viewBuilder()->setLayout('ajax');
        }
    }

    public function add()
    {
        $table = $this->fetchTable('AvancesProyectos');
        $avanceProyecto = $table->newEmptyEntity();
        $seguimientoProyectoId = $this->request->getQuery('seguimiento_proyecto_id');

        if ($avanceProyecto->isNew() && !$this->request->is('post')) {
            $avanceProyecto->fecha_avance = date('Y-m-d');
            $avanceProyecto->proximo_hito = date('Y-m-d', strtotime('+30 days'));
        }

        if ($this->request->is('post')) {
            $avanceProyecto = $table->patchEntity($avanceProyecto, $this->request->getData());

            if (empty($avanceProyecto->fecha_avance)) {
                $avanceProyecto->fecha_avance = date('Y-m-d');
            }

            if (empty($avanceProyecto->proximo_hito)) {
                $avanceProyecto->proximo_hito = date('Y-m-d', strtotime('+30 days'));
            }

            if ($table->save($avanceProyecto)) {
                $this->Flash->success(__('El avance fue creado exitosamente.'));

                $seguimientoProyecto = $this->fetchTable('SeguimientosProyectos')->get($avanceProyecto->seguimiento_proyecto_id);

                return $this->redirect([
                    'controller' => 'ClientesFacturacion',
                    'action' => 'view',
                    $seguimientoProyecto->cliente_facturacion_id,
                    '#' => 'recordatorios'
                ]);
            }

            $this->Flash->error(__('El avance no pudo ser creado. Intente de nuevo.'));
        } elseif (!empty($seguimientoProyectoId)) {
            $avanceProyecto->seguimiento_proyecto_id = $seguimientoProyectoId;
            $avanceProyecto->fecha_avance = date('Y-m-d');
            $avanceProyecto->proximo_hito = date('Y-m-d', strtotime('+30 days'));
        }

        $seguimientosProyectosTable = $this->fetchTable('SeguimientosProyectos');
        $seguimientosProyectos = [];
        foreach (
            $seguimientosProyectosTable->find()
                ->contain('ClientesFacturacion')
                ->orderBy(['SeguimientosProyectos.fecha_inicio' => 'DESC'])
                ->limit(200)
                ->all() as $item
        ) {
            $nombreCliente = $item->clientes_facturacion ? $item->clientes_facturacion->nombre_razon_social : 'Sin cliente';
            $seguimientosProyectos[$item->id] = $item->titulo . ' - ' . $nombreCliente;
        }

        $this->set(compact('avanceProyecto', 'seguimientosProyectos', 'seguimientoProyectoId'));
        if ($this->request->is('ajax')) {
            $this->viewBuilder()->setLayout('ajax');
        }
    }

    public function edit($id = null)
    {
        $table = $this->fetchTable('AvancesProyectos');
        $avanceProyecto = $table->get($id, contain: []);

        if ($this->request->is(['patch', 'post', 'put'])) {
            $avanceProyecto = $table->patchEntity($avanceProyecto, $this->request->getData());

            if ($table->save($avanceProyecto)) {
                $this->Flash->success(__('El avance fue actualizado exitosamente.'));

                $seguimientoProyecto = $this->fetchTable('SeguimientosProyectos')->get($avanceProyecto->seguimiento_proyecto_id);

                return $this->redirect([
                    'controller' => 'ClientesFacturacion',
                    'action' => 'view',
                    $seguimientoProyecto->cliente_facturacion_id,
                    '#' => 'recordatorios'
                ]);
            }

            $this->Flash->error(__('El avance no pudo ser actualizado. Intente de nuevo.'));
        }

        $seguimientosProyectosTable = $this->fetchTable('SeguimientosProyectos');
        $seguimientosProyectos = [];
        foreach (
            $seguimientosProyectosTable->find()
                ->contain('ClientesFacturacion')
                ->orderBy(['SeguimientosProyectos.fecha_inicio' => 'DESC'])
                ->limit(200)
                ->all() as $item
        ) {
            $nombreCliente = $item->clientes_facturacion ? $item->clientes_facturacion->nombre_razon_social : 'Sin cliente';
            $seguimientosProyectos[$item->id] = $item->titulo . ' - ' . $nombreCliente;
        }

        $this->set(compact('avanceProyecto', 'seguimientosProyectos'));
        if ($this->request->is('ajax')) {
            $this->viewBuilder()->setLayout('ajax');
        }
    }

    public function delete($id = null)
    {
        $this->request->allowMethod(['post', 'delete']);

        $table = $this->fetchTable('AvancesProyectos');
        $avanceProyecto = $table->get($id);
        $seguimientoProyectoId = $avanceProyecto->seguimiento_proyecto_id;

        $avanceProyecto->estado_control = 'I';

        if ($table->save($avanceProyecto)) {
            $this->Flash->success(__('El avance fue desactivado correctamente.'));
        } else {
            $this->Flash->error(__('El avance no pudo ser desactivado.'));
        }

        $seguimientoProyecto = $this->fetchTable('SeguimientosProyectos')->get($seguimientoProyectoId);

        return $this->redirect([
            'controller' => 'ClientesFacturacion',
            'action' => 'view',
            $seguimientoProyecto->cliente_facturacion_id,
            '#' => 'recordatorios'
        ]);
    }

    public function getBySeguimiento($seguimientoProyectoId = null)
    {
        $this->request->allowMethod(['get']);

        $avances = [];
        if (!empty($seguimientoProyectoId)) {
            $table = $this->fetchTable('AvancesProyectos');
            $avances = $table->find()
                ->where(['seguimiento_proyecto_id' => $seguimientoProyectoId])
                ->select(['id', 'fecha_avance', 'proximo_hito', 'detalles_avance', 'modulos_completados', 'observaciones', 'estado_control'])
                ->orderBy(['fecha_avance' => 'DESC'])
                ->toArray();
        }

        return $this->response->withType('application/json')
            ->withStringBody(json_encode($avances));
    }

    public function reportes()
    {
        $table = $this->fetchTable('AvancesProyectos');

        $fechaInicio = $this->request->getQuery('fecha_inicio');
        $fechaFin = $this->request->getQuery('fecha_fin');

        $query = $table->find()
            ->contain(['SeguimientosProyectos.ClientesFacturacion'])
            ->orderBy(['AvancesProyectos.fecha_avance' => 'DESC']);

        if (!empty($fechaInicio)) {
            $query->where(['DATE(AvancesProyectos.fecha_avance) >=' => $fechaInicio]);
        }

        if (!empty($fechaFin)) {
            $query->where(['DATE(AvancesProyectos.fecha_avance) <=' => $fechaFin]);
        }

        $avancesProyectos = $query->all();
        $totalAvances = count($avancesProyectos);

        $this->set(compact('avancesProyectos', 'totalAvances', 'fechaInicio', 'fechaFin'));

        if ($this->request->is('ajax')) {
            $this->viewBuilder()->setLayout('ajax');
        }
    }

    public function exportarPdf()
    {
        $table = $this->fetchTable('AvancesProyectos');

        $fechaInicio = $this->request->getQuery('fecha_inicio');
        $fechaFin = $this->request->getQuery('fecha_fin');

        $query = $table->find()
            ->contain(['SeguimientosProyectos.ClientesFacturacion'])
            ->orderBy(['AvancesProyectos.fecha_avance' => 'DESC']);

        if (!empty($fechaInicio)) {
            $query->where(['DATE(AvancesProyectos.fecha_avance) >=' => $fechaInicio]);
        }

        if (!empty($fechaFin)) {
            $query->where(['DATE(AvancesProyectos.fecha_avance) <=' => $fechaFin]);
        }

        $avancesProyectos = $query->all();

        $this->viewBuilder()->disableAutoLayout();
        $this->set(compact('avancesProyectos', 'fechaInicio', 'fechaFin'));

        $html = $this->render('reportes_pdf')->getBody()->__toString();

        $options = new Options();
        $options->set('defaultFont', 'DejaVu Sans');
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($html);
        $dompdf->setPaper('A4', 'portrait');
        $dompdf->render();

        $filename = 'reporte_avances_proyectos_' . date('Ymd_His') . '.pdf';

        return $this->response
            ->withType('application/pdf')
            ->withHeader('Content-Disposition', 'attachment; filename="' . $filename . '"')
            ->withStringBody($dompdf->output());
    }
}
