<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Response;
use App\Exceptions\Handler;
use Alert;
use Excel;

use App\Recibo;
use App\Pago;
use App\Concepto;
use App\CentroOperacion;
use App\Matriculado;

class ReciboController extends Controller
{
    /**
    * Create a new controller instance.
    *
    * @return void
    */
    public function __construct()
    {
      $this->middleware('auth');
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
      $centros_operacion = CentroOperacion::orderBy('centrooperacion_nombre', 'ASC')->pluck('centrooperacion_nombre', 'centrooperacion_id');

      $pagos = Pago::orderBy('pago_nombre', 'ASC')->pluck('pago_nombre', 'pago_id');

      $recibos = Recibo::join(env('COMPRAS_DATABASE').'.compras_centros_operacion', 'erc_recibos.centrooperacion_id', '=', env('COMPRAS_DATABASE').'.compras_centros_operacion.centrooperacion_id')
      ->join('erc_usuarios', 'erc_recibos.recibo_created_usuario', '=', 'erc_usuarios.id')
      ->join('erc_estados', 'erc_recibos.estado_id', '=', 'erc_estados.estado_id')
      ->leftjoin('erc_recibo_concepto', 'erc_recibos.recibo_id', '=', 'erc_recibo_concepto.recibo_id')
      ->orderBy('recibo_created_at', 'ASC')
      ->Buscar($request->busqueda)
      ->paginate(50);

      return view('recibos.index')
      ->with('centros_operacion', $centros_operacion)
      ->with('pagos', $pagos)
      ->with('recibos', $recibos);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create(Request $request)
    {
      $centros_operacion = CentroOperacion::orderBy('centrooperacion_nombre', 'ASC')->pluck('centrooperacion_nombre', 'centrooperacion_id');
    
      $pagos = Pago::orderBy('pago_nombre', 'ASC')->get();

      $matriculado = Matriculado::where('documento', '=', $request->codigo)
      ->orWhere('usuario', '=', $request->codigo)
      ->orderBy('periodo','DESC')
      ->first();

      if(empty($matriculado))
      {
        return view('recibos.new')
        ->with('centros_operacion', $centros_operacion)
        ->with('pagos', $pagos);
      }
      else
      {        
        return view('recibos.create')
        ->with('centros_operacion', $centros_operacion)
        ->with('pagos', $pagos)
        ->with('matriculado', $matriculado);
      }
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
      $this->validate($request, [
        'recibo_codigo_liquidacion' => 'unique:erc_recibos,recibo_codigo_liquidacion,1,voided',
      ]);

      /*$total_concepto = 0;

      if(!empty($request->pago_id))
      {
        foreach ($request->pago_id as $pagos)
        {
          $total_concepto += $request->recibopago_valor[0];            
        }
      }

      //dd($total_concepto);

      if($request->concepto_total == $total_concepto)
      {*/
        $consecutivo = Recibo::where('erc_recibos.centrooperacion_id', '=', $request->centrooperacion_id)->max('recibo_consecutivo_centro');

        if($consecutivo == null)
        {
          $consecutivo = 1;
        }
        else
        {
          $consecutivo = $consecutivo+1;
        }

        $recibo = new Recibo($request->all());
        $recibo->recibo_consecutivo_centro = $consecutivo;
        $recibo->recibo_created_usuario = \Auth::user()->id;
        $recibo->recibo_created_at = date('Y-m-d H:i:s');
        $recibo->estado_id = 1; //estado predeterminado: No contabilizado.
        $recibo->save();

        $pagos_id = array();
        $i = 0;

        if(!empty($request->pago_id))
        {
          foreach ($request->pago_id as $pagos)
          {
            $pagos_id[] = [
              'pago_id' => $pagos,
              'recibopago_valor' => $request->recibopago_valor[$i],
              'recibopago_entidad_bancaria' => $request->recibopago_entidad_bancaria[$i],
              'recibopago_codigo' => $request->recibopago_codigo[$i],
              'recibopago_plaza' => $request->recibopago_plaza[$i]
            ];
            $i++;
          }
        }

        //inserta registros en la tabla erc_recibo_concepto
        $concepto = new Concepto($request->all());
        $concepto->recibo()->associate($recibo);
        $concepto->save();

        try
        {
          //inserta registros en la tabla pivote erc_recibo_pagos
          $recibo->pagos()->attach($pagos_id);
        }
        catch(\Exception $e) {
          //mensaje de alerta
          Alert::error('<p>Error al intentar guardar los medios de pago del recibo. Solo se guardó el recibo y los conceptos.</p>')->html()->persistent();

          return redirect()->route('erc.recibos.edit', $recibo);
        }

        //mensaje de alerta
        Alert::success('<p>El recibo ha sido generado correctamente <b>N° '.$recibo->recibo_consecutivo_centro.'</b> Centro de operación <b>'.$recibo->centrooperacion_id.'</b>.</p>')->html()->persistent();

        return redirect()->route('erc.recibos.edit', $recibo);
      /*}
      else
      {
        Alert::warning('<p>El valor total de la cuenta no es igual a la suma total de los conceptos.</p>')->html()->persistent();

        return redirect()->back();
      }*/
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Recibo  $recibo
     * @return \Illuminate\Http\Response
     */
    public function show(Request $request, Recibo $recibo)
    {
      $centros_operacion = CentroOperacion::orderBy('centrooperacion_nombre', 'ASC')->pluck('centrooperacion_nombre', 'centrooperacion_id');
      $pagos = Pago::orderBy('pago_nombre', 'ASC')->get();
      
      return view('recibos.show')
      ->with('centros_operacion', $centros_operacion)
      ->with('pagos', $pagos)
      ->with('recibo', $recibo)
      ->with('filtro', $request->filtro)
      ->with('co', $request->co)
      ->with('anio', $request->anio)
      ->with('mes', $request->mes)
      ->with('dia', $request->dia)
      ->with('busqueda', $request->busqueda);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Recibo  $recibo
     * @return \Illuminate\Http\Response
     */
    public function edit(Recibo $recibo)
    {
      $centros_operacion = CentroOperacion::orderBy('centrooperacion_nombre', 'ASC')->pluck('centrooperacion_nombre', 'centrooperacion_id');
      $pagos = Pago::orderBy('pago_nombre', 'ASC')->get();

      return view('recibos.edit')
      ->with('centros_operacion', $centros_operacion)
      ->with('pagos', $pagos)
      ->with('recibo', $recibo);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Recibo  $recibo
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Recibo $recibo)
    {
      /*$total_concepto = 0;

      if(!empty($request->pago_id))
      {
        foreach ($request->pago_id as $pagos)
        {
          $total_concepto += $request->recibopago_valor[0];            
        }
      }

      //dd($total_concepto);

      if($request->concepto_total == $total_concepto)
      {*/
        $recibo_concepto = $recibo->concepto;
        $recibo_centro = $recibo->centroOperacion;

        $recibo->fill($request->all()); //la funcion fill recibe por parametro los campos datos personales del recibo para actualizar
        $recibo->recibo_updated_usuario = \Auth::user()->id; //usuario que actualiza el recibo
        $recibo->recibo_updated_at = date('Y-m-d H:i:s');
        $recibo->save(); //guarda cambios del recibo

        //inserta registros en la tabla erc_recibo_concepto
        $concepto = Concepto::find($recibo->recibo_id);

        if(empty($concepto))
        {
          $concepto = new Concepto($request->all());
          $concepto->recibo()->associate($recibo);
          $concepto->save();
        }
        else
        {
          $concepto->fill($request->all());
          $concepto->recibo()->associate($recibo);
          $concepto->save();
        }

        //crea el arreglo para llenar la tabla pivote erc_recibo_pago
        $pagos_id = array();
        $i = 0;

        if(!empty($request->pago_id))
        {
          foreach ($request->pago_id as $pagos) {
            $pagos_id[] = [
              'pago_id' => $pagos,
              'recibopago_valor' => $request->recibopago_valor[$i],
              'recibopago_entidad_bancaria' => $request->recibopago_entidad_bancaria[$i],
              'recibopago_codigo' => $request->recibopago_codigo[$i],
              'recibopago_plaza' => $request->recibopago_plaza[$i]
            ];

            $i++;
          }

          $recibo->pagos()->detach(); //elimina todos los medios de pagos actuales del recibo
          try
          {
            //inserta registros en la tabla pivote erc_recibo_pagos
            $recibo->pagos()->attach($pagos_id);
          }
          catch(\Exception $e) {
            //mensaje de alerta
            Alert::error('<p>Error al intentar guardar los medios de pago del recibo. Solo se guardó el recibo y los conceptos.</p>')->html()->persistent();

            return redirect()->route('erc.recibos.edit', $recibo);
          }
        }
        else{
          $ver = $recibo->pagos()->detach(); //elimina todos los medios de pagos actuales del recibo
        }                      

        //mensaje de exito
        Alert::info('<p>El <b>eRC N° '.$recibo->recibo_consecutivo_centro.'</b> del Centro de Operación <b>'.$recibo->centroOperacion->centrooperacion_nombre.'</b> ha sido actualizado correctamente.</p>')->html()->persistent();

        return redirect()->back();
      /*}
      else
      {
        //mensaje de exito
        Alert::warning('<p>El valor total de la cuenta no es igual a la suma total de los conceptos.</p>')->html()->persistent();

        return redirect()->back();
      }*/
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Recibo  $recibo
     * @return \Illuminate\Http\Response
     */
    public function destroy(Recibo $recibo)
    {
        //
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function cartera(Request $request)
    {
      $centros_operacion = CentroOperacion::orderBy('centrooperacion_nombre', 'ASC')->get();

      $pagos = Pago::orderBy('pago_nombre', 'ASC')->pluck('pago_nombre', 'pago_id');

      $recibos = Recibo::join(env('COMPRAS_DATABASE').'.compras_centros_operacion', 'erc_recibos.centrooperacion_id', '=', env('COMPRAS_DATABASE').'.compras_centros_operacion.centrooperacion_id')
      ->join('erc_usuarios', 'recibo_created_usuario', '=', 'erc_usuarios.id')
      ->join('erc_estados', 'erc_recibos.estado_id', '=', 'erc_estados.estado_id')
      ->leftjoin('erc_recibo_concepto', 'erc_recibos.recibo_id', '=', 'erc_recibo_concepto.recibo_id')
      ->orderBy('recibo_created_at', 'ASC')
      ->Filtrar($request->filtro, $request->co, $request->anio, $request->mes, $request->dia)
      ->Buscar($request->busqueda)
      ->paginate(50);

      $anios;
      $i = 0;

      for($ii=2016; $ii<=date('Y'); $ii++)
      {
        $anios[$i] = ['anio' => $ii];
        $i++;
      }

      $anios = collect($anios);

      return view('recibos.cartera')
      ->with('anios', $anios)
      ->with('centros_operacion', $centros_operacion)
      ->with('pagos', $pagos)
      ->with('recibos', $recibos)
      ->with('filtro', $request->filtro)
      ->with('co', $request->co)
      ->with('anio', $request->anio)
      ->with('mes', $request->mes)
      ->with('dia', $request->dia)
      ->with('busqueda', $request->busqueda);
    }

    public function contabilizar(Request $request, Recibo $recibo)
    {
      $recibo->estado_id = 2; //cambia el estado a: Contabilizado
      $recibo->recibo_contabilizado_at = date('Y-m-d H:i:s');
      $recibo->recibo_contabilizado_usuario = \Auth::user()->id;
      $recibo->save();

      //mensaje de alerta
      Alert::info('<p>El recibo <b>N° '.$recibo->recibo_consecutivo_centro.'</b> del Centro de operación <b>'.$recibo->centroOperacion->centrooperacion_nombre.'</b> ha sido marcado como <i>Contabilizado</i>.</p>')->html()->persistent();

      $centros_operacion = CentroOperacion::orderBy('centrooperacion_nombre', 'ASC')->get();

      $pagos = Pago::orderBy('pago_nombre', 'ASC')->pluck('pago_nombre', 'pago_id');

      $recibos = Recibo::join(env('COMPRAS_DATABASE').'.compras_centros_operacion', 'erc_recibos.centrooperacion_id', '=', env('COMPRAS_DATABASE').'.compras_centros_operacion.centrooperacion_id')
      ->join('erc_usuarios', 'recibo_created_usuario', '=', 'erc_usuarios.id')
      ->join('erc_estados', 'erc_recibos.estado_id', '=', 'erc_estados.estado_id')
      ->leftjoin('erc_recibo_concepto', 'erc_recibos.recibo_id', '=', 'erc_recibo_concepto.recibo_id')
      ->orderBy('recibo_created_at', 'ASC')
      ->Filtrar($request->filtro, $request->co, $request->anio, $request->mes, $request->dia)
      ->Buscar($request->busqueda)
      ->paginate(50);

      $anios;
      $i = 0;

      for($ii=2016; $ii<=date('Y'); $ii++)
      {
        $anios[$i] = ['anio' => $ii];
        $i++;
      }

      $anios = collect($anios);

      return view('recibos.cartera')
      ->with('anios', $anios)
      ->with('centros_operacion', $centros_operacion)
      ->with('pagos', $pagos)
      ->with('recibos', $recibos)
      ->with('filtro', $request->filtro)
      ->with('co', $request->co)
      ->with('anio', $request->anio)
      ->with('mes', $request->mes)
      ->with('dia', $request->dia)
      ->with('busqueda', $request->busqueda);
    }

    /**
    * Remove the specified resource from storage.
    *
    * @param  \App\Recibo  $recibo
    * @return \Illuminate\Http\Response
    */
    public function void(Recibo $recibo)
    {
      $recibo->voided = 1; //Anulado: Sí.
      $recibo->save();

      Alert::info('<p>El recibo <b>N° '.$recibo->recibo_consecutivo_centro.'</b> del Centro de operación <b>'.$recibo->centroOperacion->centrooperacion_nombre.'</b> ha sido <b>ANULADO</b>.</p>')->html()->persistent();

      return redirect()->back();
    }

    /**
    * Download 
    *
    * @param  \App\Recibo  $recibo
    * @return \Illuminate\Http\Response
    */
    public function planetxt(Request $request)
    {
      $recibos = Recibo::join(env('COMPRAS_DATABASE').'.compras_centros_operacion', 'erc_recibos.centrooperacion_id', '=', env('COMPRAS_DATABASE').'.compras_centros_operacion.centrooperacion_id')
      ->join('erc_usuarios', 'recibo_created_usuario', '=', 'erc_usuarios.id')
      ->join('erc_estados', 'erc_recibos.estado_id', '=', 'erc_estados.estado_id')
      ->leftjoin('erc_recibo_concepto', 'erc_recibos.recibo_id', '=', 'erc_recibo_concepto.recibo_id')
      ->orderBy('recibo_created_at', 'ASC')
      //->Filtro($request->filtro)
      ->Filtrar($request->filtro, $request->co, $request->anio, $request->mes)
      ->Buscar($request->busqueda)
      ->where('voided', '=', '0')
      ->get();

      Excel::create('archivo_plano', function($excel) use ($recibos){
        $excel->sheet('Hoja1', function ($sheet) use ($recibos) {
          $sheet->loadView('recibos.planetext')
          ->with('recibos', $recibos);
        });
      })->export('txt');
    }
    
}
