<?php

namespace App\Http\Controllers\Legacy;

use App\Http\Controllers\Controller;
use Artisaninweb\SoapWrapper\Exceptions\ServiceAlreadyExists;
use Artisaninweb\SoapWrapper\SoapWrapper;
use Exception;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Exception\ServerException;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Session;

class PDFController extends Controller
{
    public function __construct(
        protected SoapWrapper $soapWrapper
    ) {}

    public function getEstadoCuenta()
    {
        try {
            $wsdl = config('services.molina.online.wsdl');

            $this->soapWrapper->add('munimolina', fn ($service) => $service->wsdl($wsdl));

            $data = [
                'session' => Session::get('Datos')['codsesion'],
                'codcontri' => Session::get('Datos')['codContri'],
                'anyo_ini' => 1900,
                'anyo_fin' => date('Y'),
            ];

            $result = $this->soapWrapper->call('munimolina.consultar_ctacte', $data);

            if (Session::Has('Estado')) {
                generateEstadoCuenta(true, $result);
            } else {
                $res = [];

                return redirect('oauth/login')->with('alert-danger', $res['error'].': '.$res['error_description']);
            }
        } catch (ServiceAlreadyExists) {
            return redirect('oauth/login')->with('alert-danger', 'Error durante el registro del servicio.');
        } catch (ClientException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el cliente');
        } catch (ServerException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error con el servidor');
        } catch (BadResponseException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error en la respuesta');
        } catch (ConnectException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el servidor');
        } catch (RequestException) {
            return redirect('oauth/login')->with('alert-danger', 'Request Exception error');
        } catch (Exception) {
            return redirect('oauth/login')->with('alert-danger', 'Exception error');
        }
    }

    public function getMailEstadoCuenta($email)
    {
        try {
            $wsdl = config('services.molina.online.wsdl');

            $this->soapWrapper->add('munimolina', fn ($service) => $service->wsdl($wsdl));

            if (Session::Has('Estado')) {
                $data = [
                    'session' => Session::get('Datos')['codsesion'],
                    'codcontri' => Session::get('Datos')['codContri'],
                    'anyo_ini' => 1900,
                    'anyo_fin' => date('Y'),
                ];

                $result = $this->soapWrapper->call('munimolina.consultar_ctacte', $data);

                $WSResult = $result;

                $attach = generateEstadoCuenta(false, $WSResult);
                $data = [
                    'name' => 'Estado de cuenta Detallado',
                ];

                Mail::send('templates.mail', $data, function ($message) use ($email, $attach) {

                    $message->from('pagosvisa@munimolina.gob.pe', 'Municipalidad de la Molina');

                    $message->to($email)->subject('Municipalidad de la Molina');

                    var_dump($attach);

                    $message->attachData(($attach), 'EstadoDeCuenta.pdf', [
                        'mime' => 'application/pdf',
                    ]);

                });

                if (Mail::failures()) {
                    // return response showing failed emails
                }

                return 'Su correo ha sido enviado satisfactoriamente';

            } else {
                $res = [];

                return redirect('oauth/login')->with('alert-danger', $res['error'].': '.$res['error_description']);
            }
        } catch (ClientException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el cliente');
        } catch (ServerException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error con el servidor');
        } catch (BadResponseException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error en la respuesta');
        } catch (ConnectException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el servidor');
        } catch (RequestException) {
            return redirect('oauth/login')->with('alert-danger', 'Request Exception error');
        } catch (Exception) {
            return redirect('oauth/login')->with('alert-danger', 'Exception error');
        }
    }

    public function getRecibo($codigo)
    {
        try {
            $wsdl = config('services.molina.online.wsdl');

            $this->soapWrapper->add('munimolina', fn ($service) => $service->wsdl($wsdl));

            $data = ['cgonumero' => $codigo];

            $result = $this->soapWrapper->call('munimolina.listar_pagos_detalle', $data);

            if (Session::Has('Estado')) {
                generateRecibo(true, $result);
            } else {
                $res = [];

                return redirect('oauth/login')->with('alert-danger', $res['error'].': '.$res['error_description']);
            }
        } catch (ClientException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el cliente');
        } catch (ServerException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error con el servidor');
        } catch (BadResponseException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error en la respuesta');
        } catch (ConnectException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el servidor');
        } catch (RequestException) {
            return redirect('oauth/login')->with('alert-danger', 'Request Exception error');
        } catch (Exception) {
            return redirect('oauth/login')->with('alert-danger', 'Exception error');
        }
    }

    public function getHistorial()
    {
        try {
            $wsdl = config('services.molina.online.wsdl');

            $this->soapWrapper->add('munimolina', fn ($service) => $service->wsdl($wsdl));

            $data = ['codcontri' => Session::get('Datos')['codContri']];

            $result = $this->soapWrapper->call('munimolina.listar_pagos', $data);

            if (Session::Has('Estado')) {
                generateHistorial(true, $result);
            } else {
                $res = [];

                return redirect('oauth/login')->with('alert-danger', $res['error'].': '.$res['error_description']);
            }
        } catch (ClientException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el cliente');
        } catch (ServerException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error con el servidor');
        } catch (BadResponseException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error en la respuesta');
        } catch (ConnectException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el servidor');
        } catch (RequestException) {
            return redirect('oauth/login')->with('alert-danger', 'Request Exception error');
        } catch (Exception) {
            return redirect('oauth/login')->with('alert-danger', 'Exception error');
        }
    }

    public function getMailRecibo($email)
    {
        try {
            $wsdl = config('services.molina.online.wsdl');

            $this->soapWrapper->add('munimolina', fn ($service) => $service->wsdl($wsdl));

            if (Session::Has('Estado')) {
                $data = ['codcontri' => Session::get('Datos')['codContri']];

                var_dump($data);

                $result = $this->soapWrapper->call('munimolina.listar_pagos', $data);

                var_dump($result);

                $WSResult = $result;

                $attach = generateHistorial(false, $WSResult);
                $data = [
                    'name' => 'Recibo de pago',
                ];

                Mail::send('templates.mail', $data, function ($message) use ($email, $attach) {

                    $message->from('pagosvisa@munimolina.gob.pe', 'Municipalidad de la Molina');

                    $message->to($email)->subject('Municipalidad de la Molina');

                    var_dump($attach);

                    $message->attachData(($attach), 'Recibo.pdf', [
                        'mime' => 'application/pdf',
                    ]);

                });

                if (Mail::failures()) {
                    // return response showing failed emails
                }

                return 'Su correo ha sido enviado satisfactoriamente';

            } else {
                $res = [];

                return redirect('oauth/login')->with('alert-danger', $res['error'].': '.$res['error_description']);
            }
        } catch (ClientException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el cliente');
        } catch (ServerException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error con el servidor');
        } catch (BadResponseException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error en la respuesta');
        } catch (ConnectException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el servidor');
        } catch (RequestException) {
            return redirect('oauth/login')->with('alert-danger', 'Request Exception error');
        } catch (Exception) {
            return redirect('oauth/login')->with('alert-danger', 'Exception error');
        }
    }

    public function getMailPago($email)
    {
        try {
            $wsdl = config('services.molina.online.wsdl');

            $this->soapWrapper->add('munimolina', fn ($service) => $service->wsdl($wsdl));

            if (Session::Has('Estado')) {
                $data = ['cgonumero' => Session::get('General')];

                $result = $this->soapWrapper->call('munimolina.listar_pagos_detalle', $data);

                $WSResult = $result;

                $attach = generateHistorial(false, $WSResult);

                $data = [
                    'name' => 'Estado de cuenta Detallado',
                ];

                Mail::send('templates.mail', $data, function ($message) use ($email, $attach) {

                    $message->from('pagosvisa@munimolina.gob.pe', 'Municipalidad de la Molina');

                    $message->to($email)->subject('Municipalidad de la Molina');

                    $message->attachData(($attach), 'Recibo.pdf', [
                        'mime' => 'application/pdf',
                    ]);

                });

                if (Mail::failures()) {
                    // return response showing failed emails
                }

                return 'Su correo ha sido enviado satisfactoriamente';
            } else {
                $res = [];

                return redirect('oauth/login')->with('alert-danger', $res['error'].': '.$res['error_description']);
            }
        } catch (ClientException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el cliente');
        } catch (ServerException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error con el servidor');
        } catch (BadResponseException) {
            return redirect('oauth/login')->with('alert-danger', 'Ocurrió un error en la respuesta');
        } catch (ConnectException) {
            return redirect('oauth/login')->with('alert-danger', 'Error de conexión con el servidor');
        } catch (RequestException) {
            return redirect('oauth/login')->with('alert-danger', 'Request Exception error');
        } catch (Exception) {
            return redirect('oauth/login')->with('alert-danger', 'Exception error');
        }
    }
}
