<?php

namespace App\Http\Controllers;


use App\Models\Bancos;
use App\Models\CoDocumentoPagos;
use App\Models\CoEnte;
use App\Models\CoSocios;
use App\Models\CtClienteCredito;
use App\Models\CtClienteDeuda;
use App\Models\CtClienteDeudaCuota;
use App\Models\CtDeudaCab;
use App\Models\CuentaBancaria;
use App\Models\DetCuotaPago;
use App\Models\Parametros;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use PDF;
use Illuminate\Support\Facades\Http;

class PagosController extends Controller
{
    //
    public function IndexMantenimientoPagos()
    {
        $dataBancos = CuentaBancaria::where('estado', 'A')->get();
        return view('Mantenimiento.Pagos.pagos', ['bancos' => $dataBancos]);
    }

    public function ConsultarSocios()
    {
        try {
            return datatables(
                DB::table('co_ente as c')
                    ->join('co_socios as s', 'c.id_ente', 's.IdEnte')
                    ->select(['c.id_ente', 'c.nombre_completo', 'c.num_docum_iden', 'c.activo', 'c.tipo_ente', 'c.p_primer_nombre', 'c.p_segundo_nombre', 'c.p_primer_apellido', 'c.p_segundo_apellido', 's.IdSocios'])
                    ->get()
            )->toJson();
        } catch (\Throwable $th) {
            Log::info($th);
        }
    }

    public function ConsultarFacturasSocios(Request $r)
    {
        try {
            Log::info('ConsultarFacturasSocios');
            return datatables(
                DB::table('ct_factura_cab as c')
                    ->join('ct_deuda_cab as s', 'c.id_deuda', 's.id_deuda_cab')
                    ->join('ct_cliente_deuda as d', 'd.id_factura_cab', 'c.id_factura_cab')
                    ->where('c.id_socio', $r->id_socio)
                    ->where('d.saldo', '>', 0)
                    ->select('c.*', 's.descripcion', 'd.monto', 'd.credito', 'd.saldo')
                    ->get()
            )->toJson();
        } catch (\Throwable $th) {
            Log::info($th);
        }
    }

    public function ConsultarCuotasSocios(Request $r)
    {
        try {
            Log::info('ConsultarCuotasSocios');
            Log::info($r);

            $items = DB::table('ct_cliente_deuda_cuota as dc')
                ->join('ct_cliente_deuda as c', 'c.id_cliente_deuda', 'dc.id_cliente_deuda')
                ->where('c.id_factura_cab', $r->id_factura_cab)
                ->select('dc.*')
                ->get();

            return response()->json([
                'status' => 'ok',
                'success' => true,
                'object' => $items
            ]);
        } catch (\Throwable $th) {
            Log::info($th);
            return response()->json([
                'status' => 'error',
                'success' => false,
                'object' => null
            ]);
        }
    }

    public function RegistrarDatosBancarios(Request $r)
    {
        Log::info('RegistrarDatosBancarios');
        Log::info($r);
        try {
            $dameFecha = Carbon::now()->subHour(5);
            if($r->archivo1 != null){
                $path1 = $r->file('archivo1')->store('public/documentos/pagos');    
            }
            
            //EMPIEZA LA TRANSACCION
            DB::beginTransaction();
            //  Graba Rutas en base de dataSocio
            $dataDocumentoPagos = new CoDocumentoPagos();
            $dataDocumentoPagos->id_cliente_credito = $r->id_pago;
            $dataDocumentoPagos->id_cuenta_bancaria = $r->cuenta_bancaria;
            $dataDocumentoPagos->numero_comprobante = $r->txt_comprobante;
            $dataDocumentoPagos->FechaIngreso = $dameFecha;
            $dataDocumentoPagos->RutaPago = $r->archivo1 != null? $path1 : null;
            $dataDocumentoPagos->Estado = 'A';
            $dataDocumentoPagos->UsuarioCreacion = '1';
            $dataDocumentoPagos->FechaCreacion = $dameFecha;
            $dataDocumentoPagos->save();

            DB::commit();
            return response()->json([
                'status' => 'ok',
                'message' => 'Se registro el documento de pago',
            ]);
        } catch (\Throwable $th) {
            Log::info($th);
            DB::rollback();
            return response()->json([
                'status' => 'error',
                'success' => false,
                'message' => 'No se Completo Proceso.'
            ]);
        }
    }

 public function ProcesarPagoSocio(Request $r)
    {
        try {
            $mediopago = 'Efectivo';
            if ($r->tipo_pago != 'EFE') {
                $mediopago = "DEPOSITO";
            }
            $dameFecha = Carbon::now()->subHour(5);
            //CONSULTA LA TABLA DE DEUDA PARA IR DESCONTANDO VALORES
            $deuda_cab = CtClienteDeuda::where('ct_cliente_deuda.id_factura_cab', $r->id_factura_cab)
                ->where('ct_cliente_deuda.id_socio', $r->id_socio)
                ->first();

            //CONSULTA LA TABLA DE DEUDA CUOTA PARA IR DESCONTANDO VALORES
            $deuda_detCuota = CtClienteDeudaCuota::where('id_cliente_deuda', $deuda_cab->id_cliente_deuda)
                ->where('saldo', '>', '0')
                ->get();

            //CONSULTA LA TABLA DE DEUDA CREDITO PARA IR DESCONTANDO VALORES
            $deuda_cre = CtClienteCredito::where('ct_cliente_credito.id_factura_cab', $r->id_factura_cab)
                ->where('ct_cliente_credito.id_socio', $r->id_socio)
                ->orderBy('id_cliente_credito', 'DESC')
                ->first();
            // Log::info('deuda_cre');
            //GACEMOS LA SUMA Y RESTA DE VALORES
            $credito_u = ($deuda_cab->credito + $r->valor_abono);
            $saldo_u = ($deuda_cab->monto -  $credito_u);

            //VALOR TOTAL DE CUOTAS
            $totalCuotas = CtClienteDeudaCuota::where('id_cliente_deuda', $deuda_cab->id_cliente_deuda)->count();
            //AFECTAMOS A LA DEUDA
            $deuda_cab->credito = $credito_u;
            $deuda_cab->saldo = $saldo_u;
            $deuda_cab->aud_mod_usuario = 'BATCH';
            $deuda_cab->aud_mod_fecha_hora = $dameFecha;
            //EMPIEZA LA TRANSACCION
            DB::beginTransaction();
            $deuda_cab->save();
            // INSERTAMOS LA LINEaA EN CREDITO COMO SI FUERA EL PAGO
            $cliente_cred_new = new CtClienteCredito();
            if ($deuda_cre->saldo > $r->valor_abono) {
                $Saldo_act = $deuda_cre->saldo - $r->valor_abono;
            } else {
                $Saldo_act = $r->valor_abono - $deuda_cre->saldo;
            }
            $cliente_cred_new->id_socio = $deuda_cre->id_socio;
            $cliente_cred_new->id_factura_cab = $deuda_cre->id_factura_cab;
            $cliente_cred_new->tipo = 'PAG';
            $cliente_cred_new->monto = $r->valor_abono;
            $cliente_cred_new->fechaingreso = $dameFecha;
            $cliente_cred_new->saldo = $Saldo_act;
            $cliente_cred_new->observacion = $r->observacion;
            $cliente_cred_new->aud_ing_usuario = 'BATCH';
            $cliente_cred_new->aud_ing_estacion = $r->tipo_pago;
            $cliente_cred_new->aud_ing_fecha_hora = $dameFecha;
            $cliente_cred_new->save();

            //AFECTAMOS A LA DEUDA DET
            $saldo = 0;
            $pago_cuota = $r->valor_abono;
            $valorpagoDetCuota = 0;
            $valorRestante = 0;
            $valorSaldo = 0;
            //ENTRA AL FOR A DESCONTAR CUOTAS
            foreach ($deuda_detCuota as $cuota) {
                $saldo = $cuota['saldo'];
                if ($pago_cuota > 0) {
                    $valorPagoRestante = $pago_cuota;
                    $pago_cuota =  $pago_cuota - $saldo;
                    if ($pago_cuota < 0) {
                        $valorpagoDetCuota = $valorPagoRestante;
                        $valorRestante = $cuota['credito'] + $valorPagoRestante;
                        $valorSaldo = $pago_cuota * -1;
                    } else if ($pago_cuota >= 0) {
                        Log::info('Entro aki');
                        $valorpagoDetCuota = $cuota['saldo'];
                        $valorRestante = $cuota['monto'];
                        $valorSaldo = 0;
                    }
                    CtClienteDeudaCuota::where('num_cuota', $cuota['num_cuota'])
                        ->where('id_cliente_deuda', $deuda_cab->id_cliente_deuda)
                        ->update([
                            'saldo' =>   $valorSaldo,
                            'credito' => $valorRestante
                        ]);

                    //REGISTRO DE PAGO DE CUOTA
                    $detcuotaPago = new DetCuotaPago();
                    $detcuotaPago->idpago = $cliente_cred_new->id_cliente_credito;
                    $detcuotaPago->iddeuda = $deuda_cab->id_cliente_deuda;
                    $detcuotaPago->numcuota = $cuota['num_cuota'];
                    $detcuotaPago->monto = $cuota['saldo'];
                    $detcuotaPago->totalcuota = $cuota['saldo'];
                    $detcuotaPago->abono = $valorpagoDetCuota;
                    $detcuotaPago->saldo = $valorSaldo;
                    $detcuotaPago->fechaingreso = $dameFecha;
                    $detcuotaPago->totalcuota = $totalCuotas;
                    $detcuotaPago->tipopago = $mediopago;
                    $detcuotaPago->save();
                    $valorPagoRestante = $valorPagoRestante - $saldo;

                } else {
                    break;
                }
            }

            //verificamos si esta en la tabla de suspenciones
            $existeSuspencion = DB::table('suspensiones')
                ->where('id_socio', $r->id_socio)
                ->where('id_deuda', $deuda_cab->id_cliente_deuda)
                ->count();
            
            if($existeSuspencion){
                DB::table('suspensiones')
                ->where('id_socio', $r->id_socio)
                ->where('id_deuda', $deuda_cab->id_cliente_deuda)
                ->delete();


                DB::table('co_ente as c')
                ->join('co_socios as s', 's.IdEnte', '=', 'c.id_ente')
                ->where('s.IdSocios' , $r->id_socio)
                ->update([ 'c.activo' => 'A' ]);

                DB::table('co_ente as c')
                ->join('co_socios as s', 's.IdEnte', '=', 'c.id_ente')
                ->where('s.IdSocios' , $r->id_socio)
                ->update([ 's.Activo' => 'A' ]);

            }


            //se envia notificacion a movil
            try {
                $co_ente = DB::table('co_ente As a')
                    ->join('co_socios As b', 'a.id_ente', '=', 'b.IdEnte')
                    ->where('b.IdSocios', $r->id_socio)
                    ->select('a.*')
                    ->first();

                if ($co_ente->token != null) {
                    $auth_basic = "AAAAtva8KRc:APA91bGzJx5FvGC9FXugawGM3Qn0KUnSF8jdtJCBNuHpU9m6pAdyTGzYrhawEaOekfuyJvSioqV2VYXyXhhqMe7ke0gNf5OduOj2ptCkkMwvQCnVGigaKvjt0ycqKgTxgKR3X0LuXOUV";
                    $response = Http::withHeaders([
                        "Authorization" => "key=" . $auth_basic,
                        "Cache-Control" => "no-cache",
                        "Content-Type" => "application/json; charset=UTF-8"
                    ])->post('https://fcm.googleapis.com/fcm/send', [
                        'to' => $co_ente->token,
                        'notification' => [
                            'title' => "Notificación de Aviso",
                            'body' => "Hemos Recibido su Pago, Gracias por Preferirnos.!",
                        ],
                    ]);
                }
            } catch (\Throwable $th) {
                Log::info('no se envio notificacion al socio ' . $r->id_socio);
            }
            Log::info('Informacion Guardada');
            DB::commit();
            return response()->json([
                'status' => 'ok',
                'message' => 'Se Proceso el Pago con Exito.',
                'idpago' => $cliente_cred_new->id_cliente_credito,
                'iddeuda' => $deuda_cab->id_cliente_deuda
            ]);
        } catch (\Throwable $th) {
            Log::info($th);
            DB::rollback();
            return response()->json([
                'status' => 'error',
                'success' => false,
                'message' => 'No se Completo Proceso.'
            ]);
        }
    }
    public function PagosPdf($idpago, $iddeuda)
    {
        $dataParametros = Parametros::first();
        $deuda_cab = DB::table('ct_cliente_deuda')
            ->join('ct_factura_cab', 'ct_cliente_deuda.id_factura_cab', 'ct_factura_cab.id_factura_cab')
            ->join('ct_deuda_cab', 'ct_factura_cab.id_deuda', 'ct_deuda_cab.id_deuda_cab')
            ->join('co_socios', 'ct_cliente_deuda.id_socio', 'co_socios.IdSocios')
            ->join('co_ente', 'co_socios.IdEnte', 'co_ente.id_ente')
            ->select(['ct_cliente_deuda.id_socio', 'ct_cliente_deuda.monto', 'ct_cliente_deuda.credito', 'ct_cliente_deuda.saldo', 'co_ente.nombre_completo', 'co_ente.num_docum_iden', 'co_ente.p_celular', 'co_ente.p_correo', 'ct_deuda_cab.descripcion'])
            ->where('ct_cliente_deuda.id_cliente_deuda', $iddeuda)->first();
        $dataPago = DetCuotaPago::where('idpago', $idpago)->get();
        return PDF::loadView('pdf.recibopago', ['parametros' => $dataParametros, 'cabecera' => $deuda_cab, 'pagos' => $dataPago, 'idpago' => $idpago])->stream('comprobante_pago.pdf');
    }
    public function InfPagoIndex()
    {
        $dataSocios = CoEnte::join('co_socios', 'co_socios.IdEnte', 'co_ente.id_ente')
            ->where('tipo_ente', 'S')
            ->select(['co_ente.id_ente', 'co_ente.nombre_completo', 'co_socios.IdSocios'])
            ->get();
        return view('Mantenimiento.Pagos.infpagos', ['datasocio' => $dataSocios]);
        //  return view('');
    }
    public function BuscarInformePagos(Request $r)
    {
        try {
            $dataDeuda = [];
            Log::info($r);
            $r->session()->forget('filtros');
            $r->session()->forget('informacion');
            $r->session()->put('filtros', ['fechadesde' => $r->fechadesde, 'fechahasta' => $r->fechahasta, 'estado' => $r->estado]);
            if ($r->usuario == 'T') {
                $dataDeuda = DB::table('ct_cliente_credito')
                    ->join('ct_factura_cab', 'ct_cliente_credito.id_factura_cab', 'ct_factura_cab.id_factura_cab')
                    ->join('ct_cliente_deuda', 'ct_factura_cab.id_factura_cab', 'ct_cliente_deuda.id_factura_cab')
                    ->join('co_socios', 'ct_cliente_credito.id_socio', 'co_socios.IdSocios')
                    ->join('co_ente', 'co_socios.IdEnte', 'co_ente.id_ente')
                    ->join('ct_deuda_cab', 'ct_factura_cab.id_deuda', 'ct_deuda_cab.id_deuda_cab')
                    ->where('ct_cliente_credito.tipo', 'PAG')
                    ->whereBetween('ct_cliente_credito.fechaingreso', [$r->fechadesde, $r->fechahasta])
                    ->where('ct_cliente_credito.aud_ing_estacion', $r->tipo_pago)
                    ->select(['ct_cliente_deuda.id_cliente_deuda', 'ct_deuda_cab.descripcion', 'ct_cliente_credito.id_cliente_credito', 'ct_factura_cab.num_documento', 'ct_factura_cab.metodo_pago', 'co_ente.nombre_completo', 'ct_cliente_credito.monto', 'ct_cliente_credito.aud_ing_fecha_hora', 'ct_cliente_credito.aud_ing_estacion as tipo_pago'])
                    ->get();
            } else {
                $dataDeuda = DB::table('ct_cliente_credito')
                    ->join('ct_factura_cab', 'ct_cliente_credito.id_factura_cab', 'ct_factura_cab.id_factura_cab')
                    ->join('ct_cliente_deuda', 'ct_cliente_deuda.id_factura_cab', 'ct_factura_cab.id_factura_cab')
                    ->join('co_socios', 'ct_cliente_credito.id_socio', 'co_socios.IdSocios')
                    ->join('co_ente', 'co_socios.IdEnte', 'co_ente.id_ente')
                    ->join('ct_deuda_cab', 'ct_factura_cab.id_deuda', 'ct_deuda_cab.id_deuda_cab')
                    ->where('ct_cliente_credito.tipo', 'PAG')
                    ->whereBetween('ct_cliente_credito.fechaingreso', [$r->fechadesde, $r->fechahasta])
                    ->where('ct_cliente_credito.id_socio', $r->usuario)
                    ->where('ct_cliente_credito.aud_ing_estacion', $r->tipo_pago)
                    ->select(['ct_cliente_deuda.id_cliente_deuda', 'ct_deuda_cab.descripcion', 'ct_cliente_credito.id_cliente_credito', 'ct_factura_cab.num_documento', 'ct_factura_cab.metodo_pago', 'co_ente.nombre_completo', 'ct_cliente_credito.monto', 'ct_cliente_credito.aud_ing_fecha_hora', 'ct_cliente_credito.aud_ing_estacion as tipo_pago'])
                    ->get();
                Log::info($dataDeuda);
            }
            $r->session()->put('informacion', $dataDeuda);
            return response()->json(['status' => 'ok', 'data' =>   $dataDeuda]);
        } catch (\Throwable $th) {
            Log::info($th->getMessage());
            return response()->json(['status' => 'ok', 'message' => 'Problemas consultando la información']);
        }
    }
    public function InfPagosPdf()
    {
         $dataParametros = Parametros::first();
        $data = [
            'parametros' => $dataParametros,
            'datos' => session('filtros'),
            'socios' => session('informacion'),
        ];
        //$pdf = PDF::loadView('pdf.infSocioPdf', ['filtros' => session('filtros'),])->setPaper('a4', 'portrait');
        $pdf = PDF::loadView('pdf.infpagopdf', $data)->setPaper('a4', 'landscape');
        return $pdf->download('inf-pagos.pdf');
    }

    public function MisCabPagosApp(Request $r)
    {
        try {
 Log::info($r);
            $dataSocio = CoSocios::where('IdEnte', $r->id)->first();
Log::info($dataSocio);
            $dataPagos = DB::table('ct_cliente_credito')
                ->join('ct_factura_cab', 'ct_cliente_credito.id_factura_cab', 'ct_factura_cab.id_factura_cab')
                ->join('ct_cliente_deuda', 'ct_factura_cab.id_factura_cab', 'ct_cliente_deuda.id_factura_cab')
                ->join('co_socios', 'ct_cliente_credito.id_socio', 'co_socios.IdSocios')
                ->join('co_ente', 'co_socios.IdEnte', 'co_ente.id_ente')
                ->where('ct_cliente_credito.tipo', 'PAG')
                ->whereBetween('ct_cliente_credito.fechaingreso', [$r->fechadesde, $r->fechahasta])
                ->where('ct_cliente_credito.id_socio', $dataSocio->IdSocios)
                ->where('ct_cliente_credito.aud_ing_estacion', $r->tipo)
                ->select(['ct_cliente_deuda.id_cliente_deuda', 'ct_cliente_credito.id_cliente_credito', 'ct_factura_cab.num_documento', 'ct_factura_cab.metodo_pago', 'co_ente.nombre_completo', 'ct_cliente_credito.monto', 'ct_cliente_credito.aud_ing_fecha_hora'])
                ->get();
            return response()->json(['status' => 'ok', 'datos' =>  $dataPagos]);
        } catch (\Throwable $th) {
            return response()->json(['status' => 'error', 'datos' => [],'message'=> $th->getMessage()]);
        }
    }
    public function MisDetPagos($id)
    {
        try {
            $dataPago = DetCuotaPago::where('idpago', $id)->get();
            return response()->json(['status' => 'ok', 'datos' =>  $dataPago]);
        } catch (\Throwable $th) {
            return response()->json(['status' => 'ok', 'datos' => []]);
        }
    }
}
