<?php

namespace App\Http\Controllers\Api\Cobranzas;

use App\Danoral\Cobranzas\Cobros\Cobro;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;

use Illuminate\Http\Request;
use App\Danoral\Cobranzas\NotiPago;
use App\Http\Resources\NotiPago as NotiPagoResources;

class NotiPagoController extends Controller
{
    protected $notiPago;

    public function __construct(NotiPago $notiPago){
        $this->notiPago = $notiPago;
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {

        $where =[];
        $where[] = ['origenNP', 1002];

        if(isset($request->idEdif) && !is_null($request->idEdif) && $request->idEdif !== 'undefined'){
            $where[] = ['idESuper', $request->idEdif];
        }
        if(isset($request->estado) && !is_null($request->estado) && $request->estado !== 'undefined'){
            
            switch($request->estado){
                case 0:
                    break;
                case 1:
                    $where[] = ['estadoNP', null];
                    break;
                default:
                    $where[] = ['estadoNP', $request->estado];
            }
        }


        $res = NotiPago::where($where)
        ->leftJoin('admin.entidades', 'entidades.idE', '=', 'noti_pagos.idE')
        ->orderByDesc('idNP')
        ->limit(isset($request->limit)?$request->limit:3000)
        ->get();

        return response()->json(NotiPagoResources::collection($res), 200);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $notiPago = new NotiPago;
        $notiPago->fill($request->input());
        $notiPago->save();

        return $notiPago->wasChanged();
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show(NotiPago $notiPago)
    {
       return response()->json(new NotiPagoResource($notiPago),200);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

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

    public function procesarNotiPago(Request $request){
        $notiPago = new NotiPago;
        $res = $notiPago->procesarNotiPago($request->all());

        if($res){
            return response()->json($res, 200);
        }

        return response()->json([
            'message'   => 'ERROR EN: NotiPagoController.procesarNotiPago ',
        ], 200);

    }

    public function procesarNotipagoCobro(Request $request){
        
        if(!isset($request->idNP)) {
            return response()->json([
                'error'     => 1,
                'request'   => $request->all(),
                'message'   => "No hay idNP ($request->idNP)",
            ], 200);   
        }
        
        $notiPago = NotiPago::find($request->idNP);

        if(!$notiPago){
            return response()->json([
                'error'     => 2,
                'request'   => $request->all(),
                'message'   => "No se encontro la notificacion ($request->idNP)",
            ], 200);   
        }

        if($notiPago->estadoNP > 1){
            return response()->json([
                'error'     => 6,
                'request'   => $request->all(),
                'notipago'  => new NotiPagoResources($notiPago),
                'message'   => ['La notificacion ya fue procesada', "Estado: ($notiPago->estadoNP)"],
            ], 200);   

        }

        if(isset($request->estadoNP)) {

            DB::beginTransaction();
            try {

                $notiPago->estadoNP = $request->estadoNP;
                $notiPago->idEUser = $request->user()->idE;

                if($request->estadoNP == NotiPago::$ESTADO_ERROR){
                    $notiPago->nroErrorNP = isset($request->nroErrorNP)?$request->nroErrorNP:null;
                    $notiPago->save();

                    return response()->json([
                        'error'     => 0,
                        'request'   => $request->all(),
                        'notipago'  => new NotiPagoResources($notiPago),
                        'message'   => ["NotiPago: $notiPago->idNP", "Estado error: ($notiPago->nroErrorNP)"],
                    ], 200);   
    
                }


                //cobro
                $input = $request->all();
                $cobro = new Cobro();
                $cobro->idEUser = $request->user()->idE;
                $cobro->idNP = $notiPago->idNP;
                
                $cobro->validarCargar($input['cobro']);  

                if(!$cobro->isPlanilla()){
                    return response()->json([
                        'error'     => 5,
                        'request'   => $request->all(),
                        'notipago'  => new NotiPagoResources($notiPago),
                        'message'   => ['Planilla no seleccionada'],
                    ], 200);   
                }

                $res = $cobro->procesarCobro();
                                
                $notiPago->logNP = $res;
                $notiPago->save();
                
                DB::commit();

                return response()->json([
                    'error'     => 0,
                    'request'   => $request->all(),
                    'notipago'  => new NotiPagoResources($notiPago),
                    'message'   => ["NotiPago: $notiPago->idNP"],
                ], 200);   

            }catch (\Exception $e) {
                DB::rollback();

                return response()->json([
                    'error'     => 4,
                    'request'   => $request->all(),
                    'notipago'  => new NotiPagoResources($notiPago),
                    'message'   => [$e->getMessage()],
                ], 200);   
            }

        }

        return response()->json([
            'error'     => 3,
            'request'   => $request->all(),
            'notipago'  => new NotiPagoResources($notiPago),
            'message'   => "NO estadoNP ($request->idNP)",
        ], 200);   
        

    }

    public function cambioEstadoNotipago(Request $request) {

        if(!isset($request->estado)) {
            return response()->json([
                'error'     => 5,
                'request'   => $request->all(),
                'message'   => "Falta el parametro estado",
            ], 200);   
            
        }
        $estado = $request->estado;
        
        $notiPago = NotiPago::find($request->idNP);
        if(!$notiPago){
            return response()->json([
                'error'     => 2,
                'request'   => $request->all(),
                'message'   => "No se encontro la notificacion ($request->idNP)",
            ], 200);   
        }
                
        DB::beginTransaction();
        try {
            
            //$notiPago->estadoNP = NotiPago::$ESTADO_PENDIENTE;
            $notiPago->estadoNP = $estado;
            $notiPago->idEUser = $request->user()->idE;
            $notiPago->save();

            DB::commit();
        
            return response()->json([
                'error'     => 0,
                'request'   => $request->all(),
                'notipago'  => new NotiPagoResources($notiPago),
                'message'   => ["NotiPago: $notiPago->idNP ", "CAMBIO DE ESTADO CON EXITO"],
            ], 200);   

        }catch (\Exception $e) {
            DB::rollback();

            return response()->json([
                'error'     => 4,
                'request'   => $request->all(),
                'notipago'  => new NotiPagoResources($notiPago),
                'message'   => [$e->getMessage()],
            ], 200);   
        }        
        


    }

    public function liberar() {
    } 


}
