<?php

namespace App\Http\Controllers\Tesoreria;

use App\Model\Especialidad;
use App\Model\NumeroSerie;
use App\Model\PeriodoAdmision;
use App\Model\Recibo;
use App\Model\ReciboDetalle;
use App\Model\TipoPostulacion;
use App\Model\TramiteRequisito;
use App\Model\TramiteUsuario;
use App\Model\TurnoCaja;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Model\FichaPostulacion;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Yajra\Datatables\Datatables;

class PagoPostulanteController extends Controller
{
    public function getIndex()
    {
        try
        {
            return view('pages.tesoreria.postulantes.index');
        }
        catch (\Exception $e)
        {
            Alert()->error("Error en la conexi贸n con el servidor, intente m谩s tarde", "Ocurrio un problema")->persistent('Ok');
            return redirect('/');
        }
    }

    public function postPostulantes()
    {
        try
        {
            $p = PeriodoAdmision::where('estado','=',1)->get()->toArray();

            if($p == []){

                $datos = FichaPostulacion::get()->toArray();
            }
            else{
                $datos = FichaPostulacion::where('id_periodo_admision','=',$p[0]['id'])->get()->toArray();
            }


            return Datatables::of($datos)->make(true);
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function getEspecialidades()
    {
        try
        {
            $data = Especialidad::select('id','code','nombre')->get()->toArray();
            return $data;
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function getTipoPostulacion()
    {
        try
        {
            $data = TipoPostulacion::select('id','nombre')->get()->toArray();

            return $data;
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function getValidarCaja()
    {
        try
        {
            $turnocaja = TurnoCaja::where('id_usuario', '=', Auth::user()->id)
                ->where('estado','=',config('constants.TURNO_ESTADO.ACTIVO'))
                ->whereDate('created_at', '=', Carbon::today()->toDateString())
                ->first();
            if(!$turnocaja){
                return 205;
            }
            else{
                return 825;
            }
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function postRecibo(Request $request)
    {
        try
        {
            $tramiteUsuario = [
                'deuda' => 0,
                'folio' => null,
                'monto_pagado' => 0.0,
                'monto_pagar' => 0.0,
                'id_dependencia' => 5,
                'id_tramite_procedimiento' => config('constants.TRAMITE_PROCEDIMIENTO.ADMISION'),
                'id_tramite_usuario_accion' => null,
                'id_tramite_usuario_estado' => 8,
                'id_recibo' => null,
                'id_usuario' => 9,
            ];

            $tu = TramiteUsuario::create($tramiteUsuario)->id;

            $turnocaja = TurnoCaja::where('id_usuario', '=', Auth::user()->id)
                ->where('estado','=',config('constants.TURNO_ESTADO.ACTIVO'))
                ->whereDate('created_at', '=', Carbon::today()->toDateString())
                ->first();


            $numeroserie = NumeroSerie::find($turnocaja->id_serie);

            $model_recibo = new Recibo();
            $numboleta1 = str_pad($numeroserie->serie, config('constants.ZERO_SERIE'), '0', STR_PAD_LEFT);
            $numboleta2 = str_pad($numeroserie->correlativo, config('constants.ZERO_CORRELATIVO'), '0', STR_PAD_LEFT);

            $list = TramiteRequisito::where('id_tramite_procedimiento','=',config('constants.TRAMITE_PROCEDIMIENTO.ADMISION'))
                ->select('tramitacion_soles')->get()->toArray();

            $monto = 0.0;
            foreach ($list as $item){
                $monto = $monto + (float)$item['tramitacion_soles'];
            }

            $recibo = $model_recibo->create([
                'numero' => $numboleta1.' - '.$numboleta2,
                'anulado' => false,
                'dni' =>  $request['dni'],
                'nombre_cliente' => $request['no'],
                'monto' => $monto,
                'metodo_pago' => 0,//config('constants.TIPO_PAGO.EFECTIVO'),
                'cancelado' => false,
                'tipo_recibo' => config('constants.TIPO_RECIBO.TRAMITEMORA'),
                'id_turno' => $turnocaja->id,
                'id_cliente' =>  9,
                'id_tesorero' => Auth::user()->id
            ])->id;


            $detallelist = DB::table('tramite_procedimiento')
                ->join('tramite_requisito', 'tramite_procedimiento.id', '=','tramite_requisito.id_tramite_procedimiento')
                ->where('tramite_requisito.id_tramite_procedimiento','=',config('constants.TRAMITE_PROCEDIMIENTO.ADMISION'))
                ->select('tramite_requisito.nombre','tramite_requisito.tramitacion_soles')->get()->toArray();

            $model_detalle = new ReciboDetalle();

            foreach ($detallelist as $concepto) {
                $detalle = [
                    'concepto' => $concepto->nombre,
                    'monto' => $concepto->tramitacion_soles,
                    'id_recibo' => $recibo,
                    'tipo' => config('constants.TIPO_CONCEPTO.DERECHO_ADMISION'),
                    'id_tramite_usuario' => $tu
                ];
                $model_detalle->create($detalle);
            }
            return response()->json($recibo);
        }
        catch (\Exception $e)
        {
            $recibo = 'REINTENTAR';
            return response()->json($recibo);
        }
    }

    public function getRecibo($id)
    {
        try
        {
            $recibo = Recibo::where('id','=',$id)->with('detalles')->with('turno')->firstOrFail();
            return view('pages.tesoreria.postulantes.recibo',compact('recibo'));
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function postPago(Request $request) {
        try {
            $recibo = Recibo::find($request['id']);
            $turno = TurnoCaja::find($recibo->id_turno);

            $recibo_excel = Recibo::where('id','=',$request->id)->with('detalles')->first();

            if ($recibo->cancelado == false) {
                $serie = NumeroSerie::find($turno->id_serie);
                $numboleta1 = str_pad($serie->serie, config('constants.ZERO_SERIE'), '0', STR_PAD_LEFT);
                $numboleta2 = str_pad($serie->correlativo, config('constants.ZERO_CORRELATIVO'), '0', STR_PAD_LEFT);
                $recibo->cancelado = true;
                $recibo->numero = $numboleta1.'-'.$numboleta2;
                $recibo->metodo_pago = $request['tipo_pago'];

                $recibo->save();
                $serie->correlativo = str_pad((intval($serie->correlativo)+1), config('constants.ZERO_CORRELATIVO'), '0', STR_PAD_LEFT);
                $serie->save();

                foreach ($recibo_excel->detalles as $detalle) {
                    if ($detalle->tipo == config('constants.TIPO_CONCEPTO.DERECHO_ADMISION')) {

                        $tramite = TramiteUsuario::where('tramite_usuario.id', '=', $detalle->id_tramite_usuario)
                            ->select(
                                'tramite_usuario.id',
                                'tramite_usuario.monto_pagar as montopagar',
                                'tramite_usuario.monto_pagado',
                                'tramite_usuario.id_tramite_usuario_estado',
                                'tramite_usuario.id_tramite_procedimiento'
                            )->first();

                        $monto_debe = $tramite->montopagar * 1.0 - $tramite->monto_pagado * 1.0;

                        TramiteUsuario::where('id','=', $detalle->id_tramite_usuario)->update([
                            'id_recibo' => $recibo->id,
                            'deuda' => ($monto_debe > $detalle->monto ? true : false),
                            'monto_pagado' => ( $tramite->monto_pagado + $detalle->monto ),
                            'monto_pagar' => ( $tramite->monto_pagado + $detalle->monto )
                        ]);

                    }
                }
            }


            $recibo = Recibo::where('id','=',$request['id'])->with('detalles')->first();

            FichaPostulacion::where('dni','=',$recibo->dni)->update(['estado_pago' => 1]);

            return view('pages.tesoreria.pagos.boleta',compact('recibo'));
        } catch (\Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return Redirect('tesoreria/pagos');
        }
    }

}
