<?php

namespace App\Services;

use App\Models\Setting;
use App\Models\UserDirectorData;
use FPDF;

class VoucherService
{

    public function generate($process)
    {
        $pdf = new FPDF('P', 'mm', [80, 190]);
        $pdf->AddPage();

        $pdf->SetFont('Arial', 'B', 8);
        $textypos = 5;
        $pdf->setY(5);
        $pdf->setX(30);
        $pdf->Cell(25, $textypos, 'UGEL CORONGO');

        $pdf->setFont('Arial', '', 5);
        $pdf->setXY(29, 9);
        $pdf->Cell(25, 2, '_____________________');

        $pdf->SetFont('Arial', '', 6);
        $pdf->setXY(62, 5);
        $pdf->Cell(5, 5, 'FOLIO: ' . $process->folios);

        // Datos
        $periodo = $process->period;
        $periodoAnio = date('Y', strtotime($periodo));
        $fechaIngreso = date('d/m/Y H:i', strtotime($process->entry_date));
        $fechaRecepcion = date('d/m/Y H:i', strtotime($process->entry_date));
        $fechaActual = date('d/m/Y');
        $horaActual = date('H:i:s');

        $user = $process->user();
        $personTypes = $user->personTypeDescriptions();

        $name = in_array('JURIDICA', $personTypes)
            ? $user->company_name ?? '---'
            : trim("{$user->paternal_surname} {$user->maternal_surname} {$user->name}");

        
        $secondNode = $process->procedure()?->getSecondRouteNode();

        if ($secondNode) {
            $area = $secondNode->area()->description ?? 'UNDEFINED';
            $groupType = $secondNode->groupType()->description ?? 'UNDEFINED';
            $group = $secondNode->group()->description ?? 'UNDEFINED';
        } else {
            $area = $groupType = $group = 'UNDEFINED';
        }
            

        // Frase del año
        $fraseAnio = Setting::getYearName();
        if ($fraseAnio) {
            $fraseAnio = str_replace(['“', '”'], '"', $fraseAnio);
            $fraseAnio = utf8_decode($fraseAnio);
            $pdf->SetFont('Arial', '', 5);
            $pdf->setXY(5, 13);
            $pdf->Cell(70, 4, $fraseAnio);
        }

        // === BLOQUE COMPACTO ===
        $pdf->SetFont('Arial', '', 6);
        $pdf->setXY(3, 20);
        $pdf->Cell(5, 4, 'MESA DE PARTES');
        $pdf->setXY(50, 20);
        $pdf->Cell(5, 4, $fechaActual);
        $pdf->setXY(65, 20);
        $pdf->Cell(5, 4, $horaActual);
        $pdf->setXY(2, 22);
        $pdf->Cell(5, 4, '_______________________________________________________________');

        $pdf->SetFont('Arial', 'B', 7);
        $pdf->setXY(3, 27);
        $pdf->Cell(5, 4, 'DOCUMENTO');

        $pdf->SetFont('Arial', '', 6);
        $pdf->setXY(60, 27);
        $pdf->Cell(5, 4, 'Periodo:');
        $pdf->setXY(68, 27);
        $pdf->Cell(5, 4, $periodoAnio);

        $pdf->setXY(3, 33);
        $pdf->Cell(5, 4, 'Fecha de ingreso:');
        $pdf->setXY(30, 33);
        $pdf->Cell(5, 4, $fechaIngreso);

        $pdf->setXY(3, 39);
        $pdf->Cell(5, 4, utf8_decode('Fecha de Recepción:'));
        $pdf->setXY(30, 39);
        $pdf->Cell(5, 4, $fechaRecepcion);

        $pdf->setXY(3, 45);
        $pdf->Cell(5, 4, utf8_decode('Tipo de Documento:'));
        $pdf->setXY(30, 45);
        $pdf->MultiCell(45, 3, utf8_decode($process->procedure()->description ?? $process->custom_procedure));

        $pdf->SetFont('Arial', '', 6);
        $pdf->setXY(3, 55);
        $pdf->Cell(5, 4, utf8_decode('N°:'));
        $pdf->SetFont('Arial', 'B', 10);
        $pdf->setXY(10, 55);
        $pdf->Cell(5, 4, $process->num_exped);

        // === BLOQUE DATOS PERSONALES ===
        $pdf->SetFont('Arial', '', 6);
        $pdf->setXY(3, 65);
        $pdf->Cell(5, 4, utf8_decode('Razón Social ó Apellidos y Nombres:'));

        $pdf->SetFont('Arial', 'B', 6);
        $pdf->setXY(3, 72);
        $pdf->Cell(5, 4, utf8_decode($name));

        if (in_array('DIRECTOR', $personTypes)) {
            $directorData = UserDirectorData::findBy('comunity_user_id', $user->id);
            if ($directorData && $directorData->school_name) {
                $pdf->SetFont('Arial', 'B', 6);
                $pdf->setXY(3, 80);
                $pdf->Cell(5, 4, utf8_decode('DIRECTOR DE LA I.E. - ' . strtoupper($directorData->school_name)));
            }
        }

        // === BLOQUE REGISTRO ===
        $pdf->SetFont('Arial', '', 6);
        $pdf->setXY(3, 90);
        $pdf->Cell(5, 4, utf8_decode('Registrado por:'));
        $pdf->setXY(28, 90);
        $pdf->Cell(5, 4, 'UGEL CORONGO');

        // === BLOQUE ASUNTO ===
        $pdf->SetFont('Arial', 'B', 6);
        $pdf->setXY(3, 100);
        $pdf->Cell(5, 4, utf8_decode('Asunto:'));

        $pdf->SetFont('Arial', '', 5);
        $pdf->setXY(3, 107);
        $auxiliar = ($process->subject === 'POSESION DE CARGO') ? '' : $periodoAnio;
        $pdf->MultiCell(65, 2, utf8_decode('REPORTE DE ' . strtoupper($process->subject) . ' - ' . $auxiliar), 0, 1);

        // === BLOQUE DERIVADO A ===
        $pdf->SetFont('Arial', 'B', 6);
        $pdf->setXY(3, 120);
        $pdf->Cell(5, 4, utf8_decode('Derivado A:'));

        $pdf->SetFont('Arial', '', 6);
        $pdf->setXY(3, 127);
        $pdf->Cell(5, 4, utf8_decode($area));
        $pdf->setXY(3, 133);
        $pdf->Cell(5, 4, $groupType);
        $pdf->setXY(3, 139);
        $pdf->Cell(5, 4, $group);

        $pdf->setXY(3, 144);
        $pdf->Cell(5, 4, '_______________________________________________________________');

        // === MENSAJE FINAL ===
        $pdf->SetFont('Arial', '', 7);
        $pdf->setXY(3, 150);
        if ($process->subject === 'POSESION DE CARGO') {
            $pdf->Cell(5, 4, utf8_decode('Sr. Director, recuerde enviar sus posesión de cargo con sus'));
            $pdf->setXY(3, 156);
            $pdf->Cell(5, 4, utf8_decode('respectivos oficios para generar sus numeros de expedientes'));
            $pdf->setXY(3, 162);
            $pdf->Cell(5, 4, utf8_decode('y no estar omisos'));
        } else {
            $pdf->Cell(5, 4, utf8_decode('Sr. Director, recuerde enviar sus asistencias y horas efectivas'));
            $pdf->setXY(3, 156);
            $pdf->Cell(5, 4, utf8_decode('en los días señalados de acuerdo a la R.S N° 326-2017 MINEDU'));
            $pdf->setXY(3, 162);
            $pdf->Cell(5, 4, utf8_decode('y no estar omisos'));
        }

        $pdf->Output('I', 'DOC. ' . $process->num_exped . ' - ' . $periodoAnio . '.pdf');
    }


    public function generateA5($process)
    {
        $pdf = new FPDF('P', 'mm', 'A4');
        $pdf->AddPage();

        $this->renderVoucherContentA5($pdf, $process, 10);
        $this->renderVoucherContentA5($pdf, $process, 155);

        $pdf->Output('I', 'DOC. ' . $process->num_exped . ' - A5.pdf');
    }

    private function renderVoucherContentA5($pdf, $process, $startY)
    {
        $pdf->SetFont('Arial', 'B', 10);
        $pdf->SetXY(10, $startY);
        $pdf->Cell(0, 5, utf8_decode('UGEL CORONGO'), 0, 1, 'C');

        $pdf->SetFont('Arial', '', 7);
        $fraseAnio = Setting::getYearName();
        if ($fraseAnio) {
            $fraseAnio = str_replace(['“', '”'], '"', $fraseAnio);
            $fraseAnio = utf8_decode($fraseAnio);
            $pdf->SetFont('Arial', '', 7);
            $pdf->SetXY(10, $startY + 6);
            $pdf->Cell(0, 4, $fraseAnio, 0, 1, 'C');
        }

        $pdf->SetFont('Arial', '', 7);
        $pdf->SetXY(10, $startY + 12);
        $pdf->Cell(100, 4, 'MESA DE PARTES', 0, 0, 'L');
        $pdf->Cell(0, 4, date('d/m/Y H:i'), 0, 1, 'R');

        $pdf->Line(10, $startY + 17, 200, $startY + 17);

        $user = $process->user();
        $periodo = $process->period;
        $periodoAnio = date('Y', strtotime($periodo));
        $fechaIngreso = date('d/m/Y H:i', strtotime($process->entry_date));
        $fechaRecepcion = date('d/m/Y H:i', strtotime($process->entry_date));
        $personTypes = $user->personTypeDescriptions();

        $name = in_array('JURIDICA', $personTypes)
            ? $user->company_name ?? '---'
            : trim("{$user->paternal_surname} {$user->maternal_surname} {$user->name}");

        $secondNode = $process->procedure()?->getSecondRouteNode();

        if ($secondNode) {
            $area = $secondNode->area()->description ?? 'UNDEFINED';
            $groupType = $secondNode->groupType()->description ?? 'UNDEFINED';
            $group = $secondNode->group()->description ?? 'UNDEFINED';
        } else {
            $area = $groupType = $group = 'UNDEFINED';
        }

        $y = $startY + 20;
        $pdf->SetFont('Arial', 'B', 8);
        $pdf->SetXY(10, $y);
        $pdf->Cell(0, 5, 'DOCUMENTO', 0, 1);

        $pdf->SetFont('Arial', '', 7);
        $pdf->SetXY(10, $y += 5);
        $pdf->Cell(0, 4, 'Periodo: ' . $periodoAnio, 0, 1);

        $pdf->SetXY(10, $y += 5);
        $pdf->Cell(0, 4, 'Fecha de ingreso: ' . $fechaIngreso, 0, 1);

        $pdf->SetXY(10, $y += 5);
        $pdf->Cell(0, 4, utf8_decode('Fecha de Recepción: ') . $fechaRecepcion, 0, 1);

        $pdf->SetXY(10, $y += 5);
        $pdf->MultiCell(0, 4, utf8_decode('Tipo de Documento: ') . $process->procedure()->description ?? $process->custom_procedure);

        $pdf->SetFont('Arial', 'B', 9);
        $pdf->SetXY(10, $y += 7);
        $pdf->Cell(0, 5, utf8_decode('N°: ') . $process->num_exped, 0, 1);

        $pdf->SetFont('Arial', '', 7);
        $pdf->SetXY(10, $y += 6);
        $pdf->Cell(0, 4, utf8_decode('Razón Social ó Apellidos y Nombres:'), 0, 1);

        $pdf->SetFont('Arial', 'B', 7);
        $pdf->SetXY(10, $y += 5);
        $pdf->Cell(0, 4, utf8_decode($name), 0, 1);

        if (in_array('DIRECTOR', $personTypes)) {
            $directorData = UserDirectorData::findBy('comunity_user_id', $user->id);
            if ($directorData && $directorData->school_name) {
                $pdf->SetFont('Arial', 'B', 7);
                $pdf->SetXY(10, $y += 5);
                $pdf->Cell(0, 4, utf8_decode('DIRECTOR DE LA I.E. - ' . strtoupper($directorData->school_name)), 0, 1);
            }
        }

        $pdf->SetFont('Arial', '', 7);
        $pdf->SetXY(10, $y += 7);
        $pdf->Cell(0, 4, 'Registrado por: UGEL CORONGO', 0, 1);

        $pdf->SetFont('Arial', 'B', 7);
        $pdf->SetXY(10, $y += 6);
        $pdf->Cell(0, 4, utf8_decode('Asunto:'), 0, 1);

        $pdf->SetFont('Arial', '', 6);
        $auxiliar = ($process->subject === 'POSESION DE CARGO') ? '' : $periodoAnio;
        $pdf->SetXY(10, $y += 5);
        $pdf->MultiCell(0, 4, utf8_decode('REPORTE DE ' . strtoupper($process->subject) . ' - ' . $auxiliar));

        $pdf->SetFont('Arial', 'B', 7);
        $pdf->SetXY(10, $y += 10);
        $pdf->Cell(0, 4, utf8_decode('Derivado A:'), 0, 1);

        $pdf->SetFont('Arial', '', 6);
        $pdf->SetXY(10, $y += 5);
        $pdf->Cell(0, 4, utf8_decode($area), 0, 1);

        $pdf->SetXY(10, $y += 4);
        $pdf->Cell(0, 4, utf8_decode($groupType), 0, 1);

        $pdf->SetXY(10, $y += 4);
        $pdf->Cell(0, 4, utf8_decode($group), 0, 1);

        $pdf->Line(10, $y += 5, 200, $y);

        $pdf->SetFont('Arial', '', 6.5);
        $pdf->SetXY(10, $y += 5);

        if ($process->subject === 'POSESION DE CARGO') {
            $pdf->MultiCell(0, 4, utf8_decode(
                'Sr. Director, recuerde enviar sus posesión de cargo con sus respectivos oficios para generar sus números de expedientes y no estar omisos.'
            ));
        } else {
            $pdf->MultiCell(0, 4, utf8_decode(
                'Sr. Director, recuerde enviar sus asistencias y horas efectivas en los días señalados de acuerdo a la R.S N° 326-2017 MINEDU y no estar omisos.'
            ));
        }
    }

}