<?php

namespace Predial\Http\Controllers;

use Predial\DetallePagoPredial;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Predial\Http\Controllers\ExtractoController;
use Predial\Http\Controllers\FacturaPredialController;
use Predial\Http\Controllers\PagoPredialController;
use Predial\PagoPredial;
use Predial\Anulacion;

class AnulacionPagoController extends Controller{

    /**
     * index
     * Metodo para mostrar la vista en ejecución
     * @author Alexander Numpaque
     * @package Predial
     * @return view Muestra la vista en anulación/index
     */
    public function index(){
        return view('anulacion.index');
    }

    /**
     * store
     * Metodo para guardar y obtener los datos para anular los pagos realizados a una factura
     * @author Alexander Numpaque
     * @package Predial
     * @param Request $request Envio desde un formulario
     * @return back() Retorna a la pagina anterior
     */
    public static function store(Request $request){
        $factura = AnulacionPagoController::buscarFacturaNumero($request->numero);
        if(!empty($request->id)){
            $data = PagoPredial::findOrFail($request->id);
            AnulacionPagoController::guardarPago(7, $request->fecha, $data->responsable, $data->banco);
            $idxxp    = AnulacionPagoController::buscarUltimoPagoTipo(7);
            $detalles = AnulacionPagoController::buscarDetallesPago($request->id);
            foreach ($detalles as $row){
                $valor =  $row->valor<0?$row->valor * -1 : $row->valor * -1;
                AnulacionPagoController::guardarDetallePago($valor, $row->detallefactura, $idxxp->id);
            }
            RelacionPredialContableController::procesarRelacion($idxxp->id);
            $ultimo = ExtractoController::obtnerultimoannopago($factura->predio);
            AnulacionPagoController::eliminarUltimoAnoPago($factura->predio, $ultimo);
            AnulacionPagoController::guardarSeguimiento(date("Y-m-d"), $factura->id_unico, $request->id, $idxxp->id);
            flash()->overlay("Información guardada correctamente.", "Información");
            return back();
        }else{
            flash()->overlay("No hay un pago relacionado a la factura.", "Información");
            return back();
        }
    }

    /**
     * buscarFacturaNumero
     * Metodo para buscar los datos de la factura por medio de su número
     * @author Alexander Numpaque
     * @package Predial
     * @param int $numero Número de la factura
     * @return $data Datos devueltos por la consulta
     */
    public static function buscarFacturaNumero($numero){
        try {
            $data = DB::table('gr_factura_predial')
                        ->where('numero', '=', $numero)
                        ->first();
            return $data;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * bucarPagoFactura
     * Metodo para buscar los pagos relacionados a la factura
     * @author Alexander Numpaque
     * @package Predial
     * @param int $factura Id de la factura
     * @return Collection|array Datos obtenidos por la consulta
     */
    public static function bucarPagoFactura($factura){
        try {
            $data = DB::table('gr_pago_predial as pag')
                        ->select('pag.*')
                        ->leftJoin('gr_detalle_pago_predial as dtp', 'dtp.pago', '=', 'pag.id_unico')
                        ->leftJoin('gr_detalle_factura_predial as dtf', 'dtp.detallefactura', '=', 'dtf.id_unico')
                        ->where('dtf.factura', '=', $factura)
                        ->whereIn('pag.tipopago', [ 1, 4 ])
                        ->groupBy('pag.id_unico')
                        ->get();
            return $data;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * buscarDetallesPAgo
     * Metodo para buscar los detalles realcionados al pago
     * @author Alexander Numpaque
     * @package Predial
     * @param int $pago Id del pago de la factura
     * @return Collection|Array $data Valores devueltos por la consulta
     */
    public static function buscarDetallesPago($pago){
        try {
            $data = DB::table('gr_detalle_pago_predial as dtp')
                        ->where('dtp.pago', '=', $pago)
                        ->get();
            return $data;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * guardarDetallePago
     * Metodo para guardar uno a uno los detalles
     * @author Alexander Numpaque
     * @package Predial
     * @param int|double $valor Valor del detalle pago
     * @param int $detallefactura  Id de detalle factura
     * @param int $pago Id del pago
     */
    public static function guardarDetallePago($valor, $detallefactura, $pago){
        try {
            $detallePago = new DetallePagoPredial();
            $detallePago->valor          = $valor;
            $detallePago->detallefactura = $detallefactura;
            $detallePago->pago           = $pago;
            $detallePago->save();
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * guardarPago
     * Metodo para guardar pago
     * @author Alexander Numpaque
     * @package Predial
     * @param int $tipo Id del tipo de pago
     * @param date $fecha Fecha del pago
     * @param int $responsable Responsable del pago
     * @param int $banco Banco al que se realiza el pago
     */
    public static function guardarPago($tipo, $fecha, $responsable, $banco){
        try {
            $pago = new PagoPredial;
            $pago->tipopago    = $tipo;
            $pago->fechapago   = $fecha;
            $pago->responsable = $responsable;
            $pago->banco       = $banco;
            $pago->parametrizacionanno = session()->get('anno');
            $pago->save();
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * buscarUltimoPagoTipo
     * Meotodo para buscar el último pago realizado respecto a un tipo de pago
     * @author Alexander Numpaque
     * @package Predial
     * @param int $tipo Id de tipo de pago
     * @return Collection|Array $data Datos obtenidos por la consulta realizada
     */
    public static function buscarUltimoPagoTipo($tipo){
        $data = DB::table('gr_pago_predial as pag')
                    ->select(DB::raw('MAX(pag.id_unico) as id'))
                    ->where('pag.tipopago', '=', $tipo)
                    ->first();
        return $data;
    }

    public static function eliminarUltimoAnoPago($predio, $anno){
        DB::table('gr_ultimo_ano_pago')
            ->where('predio', '=', $predio)
            ->where('anno', '=', $anno)
            ->delete();
    }

    public static function guardarSeguimiento($fecha, $factura, $pagoAnulado, $pago){
        $data              = new Anulacion();
        $data->fecha       = $fecha;
        $data->responsable = session()->get('usuario_tercero');
        $data->factura     = $factura;
        $data->pagoAnulado = $pagoAnulado;
        $data->pago        = $pago;
        $data->save();
        return $data;
    }

    public static function obtenerPagoFactura(Request $request){
        try {
            $data = DB::table('gr_pago_predial as gpg')
                        ->leftJoin('gr_detalle_pago_predial as gdp', 'gdp.pago', '=', 'gpg.id_unico')
                        ->leftJoin('gr_detalle_factura_predial as gdf', 'gdp.detallefactura', '=', 'gdf.id_unico')
                        ->leftJoin('gr_factura_predial as gft', 'gdf.factura', '=', 'gft.id_unico')
                        ->leftJoin('gf_tercero as gtr', 'gpg.responsable', '=', 'gtr.id_unico')
                        ->leftJoin('gf_tipo_identificacion as gti', 'gtr.tipoidentificacion', '=', 'gti.id_unico')
                        ->leftJoin('gr_paquete as gpq', 'gpg.paquete', '=', 'gpq.id_unico')
                        ->leftJoin('gf_cuenta_bancaria as gcb', 'gpg.banco', '=', 'gcb.id_unico')
                        ->leftJoin('gr_tipo_pago AS gtp', 'gpg.tipopago', '=', 'gtp.id_unico')
                        ->where('gft.numero', '=', $request->numero)
                        ->select(
                            'gpg.id_unico as id', DB::raw('DATE_FORMAT(gpg.fechapago, "%d/%m/%Y") as fecha'),
                            DB::raw(
                                '(
                                    IF(
                                        CONCAT_WS(" ", gtr.nombreuno, gtr.nombredos, gtr.apellidouno, gtr.apellidodos) = " ",
                                        gtr.razonsocial,
                                        CONCAT_WS(" ", gtr.nombreuno, gtr.nombredos, gtr.apellidouno, gtr.apellidodos)
                                    )
                                ) as resp'
                            ),
                            'gti.sigla as sdoc',
                            DB::raw(
                                '(
                                    IF(
                                        gtr.razonsocial = " ",
                                        gtr.numeroidentificacion,
                                        CONCAT_WS(" ", gtr.numeroidentificacion, gtr.digitoverficacion)
                                    )
                                ) as numdoc'
                            ),
                            'gpq.numero as paq', 'gcb.descripcion as banco', 'gtp.nombre as nomtp'
                        )
                        ->groupBy('gpg.id_unico')
                        ->get();
            $html = "";
            if($data->count() > 0){
                foreach ($data as $row){
                    $html .= "<tr>";
                    $html .= "<td>$row->nomtp</td>";
                    $html .= "<td>$row->fecha</td>";
                    $html .= "<td>$row->resp $row->sdoc $row->numdoc</td>";
                    $html .= "<td>$row->paq</td>";
                    $html .= "<td>$row->banco</td>";
                    $html .= "<td><a class='btn btn-primary texto-blanco cursor' href='javascript:registrar($row->id)'><span class='fa fa-send'></span></a></td>";
                    $html .= "</tr>";
                }
            }else{
                $html .= "<tr>";
                $html .= "<th colspan='7' style='text-align: center;'>NO HAY PAGOS REALIZADOS</th>";
                $html .= "</tr>";
            }
            echo $html;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }
}
