<?php

namespace App\Http\Controllers\Tesoreria;

use App\Model\NumeroSerie;
use App\Model\Recibo;
use App\Model\ReciboDetalle;
use App\Model\TurnoCaja;
use App\Model\User;
use App\Participante;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Yajra\Datatables\Datatables;

class EventoController extends Controller
{
    public function index() {
        return view('pages.tesoreria.eventos.index');
    }
    public function validateUser(Request $request) {
        try {
//            $model = new User();
//            $usuario = User::where('username','=', $request['code'])->first();
//            $usuario = $model->where('username','=', $request['code'])->orWhere('dni','=',$request['code'])->first();
//            if (!$usuario) {
//                return response()->json('false');
//            }
            return response()->json('true');
        } catch (\Exception $e) {
            return response()->json('false');
        }
    }

    public function getEventos(Request $request)
    {
        try {
            $usuario = User::where('username','=', $request['code'])->first();

            if ($usuario) {
                $dni = $usuario->dni;
            } else {
                $dni = $request['code'];
            }

            $eventos = Participante::join('evento', function($q) {
                    $q->on('evento.id','=','participante.id_evento')
                        ->where('evento.pago', '=', true);
                })
                ->where('participante.dni','=', $dni)
                ->where('participante.pagado','=', false)
                ->orderByDesc('evento.id')
                ->select(
                    'participante.id',
                    'participante.dni',
                    'evento.nombre',
                    'evento.fecha_inicio',
                    'evento.fecha_fin',
                    'evento.costo'
                );

            return Datatables::of($eventos)->make(true);
        } catch (\Exception $e) {
            return json_encode([
                "sEcho" => 1,
                "iTotalRecords" => 0,
                "iTotalDisplayRecords" => 0,
                "aaData" => []
            ]);
        }
    }

    public function postEventos(Request $request)
    {
//        try {
            if (!$request->id) {
                Alert()->error('Debe seleccionar por lo menos un pago pendiente.', 'No selecciono un pago')->persistent('Ok');
                return redirect('tesoreria/eventos');
            }
            $turnocaja = TurnoCaja::where('id_usuario', '=', Auth::user()->id)
                ->where('estado','=',config('constants.TURNO_ESTADO.ACTIVO'))
//                ->whereDate('created_at', '=', Carbon::today()->toDateString())
                ->first();
            if(!$turnocaja){
                Alert()->error('Debe aperturar una caja primero para realizar pagos.', 'No existe caja aperturada')->persistent('Ok');
                return redirect('tesoreria/eventos');
            }
            $numeroserie = NumeroSerie::find($turnocaja->id_serie);

            $ids = $request->id;

            $conceptos = Participante::join('evento','evento.id','=','participante.id_evento')
                ->whereIn('participante.id', $ids)
                ->select(
                    'participante.id',
                    'participante.dni',
                    'participante.id_usuario',
                    'evento.nombre',
                    'evento.costo',
                    DB::raw('CONCAT(participante.nombres," ",participante.apellidos) as nombres')
                )->get();

            $usuario["nombre"] = $conceptos->pluck('nombres')->first();
            $usuario["dni"] = $conceptos->pluck('dni')->first();
            $usuario["id"] = $conceptos->pluck('id_usuario')->first();
            $montos = $conceptos->pluck('costo');
            $total = 0.0;
            foreach ($montos as $monto) {
                $total += $monto;
            }

//            dd($total);
            $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);

            $recibo = $model_recibo->create([
                'numero' => $numboleta1.' - '.$numboleta2,
                'anulado' => false,
                'dni' =>  $usuario["dni"],
                'nombre_cliente' => $usuario["nombre"],
                'monto' => $total,
                'tipo_recibo' => config('constants.TIPO_RECIBO.EVENTO'),
                'id_turno' => $turnocaja->id,
                'id_cliente' =>  $usuario["id"],
                'id_tesorero' => Auth::user()->id
            ]);

            $model_detalle = new ReciboDetalle();
            foreach ($conceptos as $concepto) {
                $detalle = [
                    'concepto' => $concepto->nombre,
                    'monto' => $concepto->costo,
                    'id_recibo' => $recibo->id,
                    'tipo' => config('constants.TIPO_CONCEPTO.EVENTO'),
                    'id_participante' => $concepto->id
                ];
                $model_detalle->create($detalle);
            }
            return redirect('tesoreria/eventos/recibo/'.$recibo->id);
//            return redirect('tesoreria/evento/recibo/'.$recibo->id);
//        } catch (\Exception $e) {
//            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
//            return Redirect('tesoreria/pagos');
//        }
    }

    public function getRecibo($id)
    {
        try {
            $recibo = Recibo::where('id','=',$id)->with('detalles')->with('usuario')->with('turno')->firstOrFail();

            if ($recibo->tipo_recibo != config('constants.TIPO_RECIBO.EVENTO')) {
                return redirect('tesoreria/pagos/recibo/' . $recibo->id);
            }

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