<?php

namespace App\Http\Controllers;

use App\Models\Asignacion;
use App\Models\CoChofer;
use App\Models\ConfiguracionApp;
use App\Models\CtVehiculos;
use App\Models\EntradaUnidad;
use App\Models\Guardias;
use App\Models\HtKilometraje;
use App\Models\Novedades;
use App\Models\SalidadUnidad;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class GuardiaController extends Controller
{
    public function CrearEntradaUnidad(Request $r)
    {
        try {
            Log::info($r);
            //consultar salida unida
            $dataAsignacion = Asignacion::where('id', $r->idasignacion)->first();
            $dataSalida = SalidadUnidad::where('idunidad', $dataAsignacion->id_unidad_fk)
                ->where('idchofer', $dataAsignacion->id_chofer_fk)
                ->where('estado', 'P')->first();
            $kilometrajeValido = $this->KilometrajeValido($dataSalida->idunidad, $r->kilometraje);
            if (!$kilometrajeValido) {
                return response()->json(['status' => 'error', 'message' => 'El kilometraje no puede ser menor al anterior.!!']);
            }
            
            //COMIEZA GUARDANDO LA INFORMACION
            $damefecha = Carbon::now()->subHour(5);
            $newEntrega = new EntradaUnidad();
            $newEntrega->idsalida = $dataSalida->id;
            $newEntrega->kilometraje = $r->kilometraje;
            $newEntrega->diferenciakilo = $r->diferenciakilo;
            $newEntrega->observacion = $r->observacion;
            $newEntrega->montocobrado = $r->montocobrado;
            $newEntrega->fecha_ing = $damefecha;
            $newEntrega->usuario_ing = $r->idusuario;
            $newEntrega->estado = 'A';
            DB::beginTransaction();
            $newEntrega->save();
            SalidadUnidad::where('id', $r->idsalida)->update(['estado' =>  'F']);
            CtVehiculos::where('IdVehiculos', $dataSalida->idunidad)->update(['EstacionCreacion' =>  'L']);
            CoChofer::where('IdChofer', $dataSalida->idchofer)->update(['EstacionCreacion' =>  'L']);
            Asignacion::where('id', $r->idasignacion)->update(['estado' =>  'E','tipoAsignacion'=>'T']);
            $valorFinalGuardia = Guardias::where('id_asignacion_fk', $r->idasignacion)->sum('valcobrado');
            //realizar Asignacion
            $newAsigancion = new Asignacion();
            $newAsigancion->id_chofer_fk = $dataSalida->idchofer;
            $newAsigancion->id_unidad_fk = $dataSalida->idunidad;
            $newAsigancion->tipoAlquiler = $dataSalida->tipoalquiler;
            $newAsigancion->kilometrajeactual = $r->kilometraje;
            $newAsigancion->kilometrajepost = $r->diferenciakilo;
            $newAsigancion->canthoras =     $valorFinalGuardia;
            $newAsigancion->observacion =  $r->observacion;
            $newAsigancion->estado = 'T';
            $newAsigancion->id_usuario_ing = $r->idusuario;
            $newAsigancion->fechaIngreso = $damefecha;
            $newAsigancion->save();
            // creare la informaicon de guardia
            // $dataGuardia = new Guardias();
            // $dataGuardia->id_asignacion_fk = $newAsigancion->id;
            // $dataGuardia->valcobrado = $r->montocobrado;
            // $dataGuardia->fechaIngreso = $damefecha;
            // $dataGuardia->id_usuario_ing = $r->idusuario;
            // $dataGuardia->estado = 'A';
            // $dataGuardia->save();
            //guardar historial kilometraje
            $modeloKilometraje = new HtKilometraje();
            $modeloKilometraje->id_unidad_fk = $dataSalida->idunidad;
            $modeloKilometraje->kilometraje = $r->kilometraje;
            $modeloKilometraje->fechaIngreso = $damefecha;
            $modeloKilometraje->estado = 'A';
            $modeloKilometraje->save();

            DB::commit();

            return response()->json(['status' => 'ok', 'message' => 'Unidad insertada con exito.!!', 'idasignacion' => $newAsigancion->id]);
        } catch (\Throwable $th) {
            Log::error($th->getMessage());
            DB::rollback();
            return response()->json(['status' => 'error', 'message' => 'Problemas al grabar la información.!!']);
        }
    }
    public function CrearSalidaUnidad(Request $r)
    {
        try {
            //vlalidar que la salida no se mayor a la establecida
            $kilometrajeValido = $this->KilometrajeValido($r->idunidad, $r->kilometraje);
            if (!$kilometrajeValido) {
                return response()->json(['status' => 'error', 'message' => 'El kilometraje no puede ser menor al anterior.!!']);
            }

            $damefecha = Carbon::now()->subHour(5);
            $newSalida = new SalidadUnidad();
            $newSalida->idunidad = $r->idunidad;
            $newSalida->idchofer = $r->idchofer;
            $newSalida->kilometraje = $r->kilometraje;
            $newSalida->tipoalquiler = $r->tipoalquiler;
            $newSalida->observacion = $r->observacion;
            $newSalida->monto = $r->monto;
            $newSalida->fecha_ing = $damefecha;
            $newSalida->usuario_ing = $r->usuario_ing;
            $newSalida->estado = 'P';
            DB::beginTransaction();
            $newSalida->save();
            //guardar historial kilometraje
            $modeloKilometraje = new HtKilometraje();
            $modeloKilometraje->id_unidad_fk = $r->idunidad;
            $modeloKilometraje->kilometraje = $r->kilometraje;
            $modeloKilometraje->fechaIngreso = $damefecha;
            $modeloKilometraje->estado = 'A';
            $modeloKilometraje->save();
            //actualizar unidad ocupada
            CtVehiculos::where('IdVehiculos', $r->idunidad)->update(['EstacionCreacion' =>  'O']);
            CoChofer::where('IdChofer', $r->idchofer)->update(['EstacionCreacion' =>  'O']);
            //INGRESAR ASIGNACIONN
            $newAsigancion = new Asignacion();
            $newAsigancion->id_chofer_fk =  $r->idchofer;
            $newAsigancion->id_unidad_fk = $r->idunidad;
            $newAsigancion->tipoAlquiler =  $r->tipoalquiler;
            $newAsigancion->kilometrajeactual = $r->kilometraje;
            $newAsigancion->kilometrajepost = 0;
            $newAsigancion->canthoras = $r->monto;
            $newAsigancion->observacion =  $r->observacion;
            $newAsigancion->estado = 'E';
            $newAsigancion->tipoAsignacion = 'P';
            $newAsigancion->id_usuario_ing = $r->usuario_ing;
            $newAsigancion->fechaIngreso = $damefecha;
            $newAsigancion->save();
            DB::commit();
            return response()->json(['status' => 'ok', 'message' => 'Unidad insertada con exito.!!']);
        } catch (\Throwable $th) {
            DB::rollback();
            Log::error($th->getMessage());
            return response()->json(['status' => 'error', 'message' => 'Problemas al grabar la información.!!']);
        }
    }
    public function ListarSalidaUnidad($id)
    {
        try {
            $dataSalida = DB::table('salidaunidad')
                ->join('ct_vehiculos', 'salidaunidad.idunidad', 'ct_vehiculos.IdVehiculos')
                ->join('co_chofer', 'co_chofer.IdChofer', 'salidaunidad.idchofer')
                ->join('co_ente', 'co_chofer.IdEnte', 'co_ente.id_ente')
                ->where('salidaunidad.usuario_ing', $id)
                ->where('salidaunidad.estado', 'P')
                ->select(['co_ente.nombre_completo', 'ct_vehiculos.PlacaVehiculo', 'salidaunidad.id', 'salidaunidad.kilometraje', 'salidaunidad.fecha_ing', 'salidaunidad.idunidad'])->get();
            return response()->json(['status' => 'ok', 'datos' =>  $dataSalida]);
        } catch (\Throwable $th) {
            Log::error($th->getMessage());
            return response()->json(['status' => 'error', 'message' => 'Problemas a grabarla información.!!']);
        }
    }
    public function CreateNovedad(Request $r)
    {
        try {
            if ($r->archivo1 == null) {

                return response()->json(['status' => 'error', 'message' => 'Debe Agregar una imagen.!!']);
            }
            $damefecha = Carbon::now()->subHour(5);
            $path1 = $r->file('archivo1')->store('public/documentos/archivos');
            $newNovedad = new Novedades();
            $newNovedad->id_asignacion_fk = $r->idasignacion;
            $newNovedad->descripcion = $r->observacion;
            $newNovedad->rutaimagen = $path1;
            $newNovedad->estado = 'A';
            $newNovedad->valorcobrado = $r->valorcobrado;
            $newNovedad->fecha = $damefecha;
            $newNovedad->save();

            return response()->json(['status' => 'ok', 'message' => 'Novedades Enviadas con exito.!!']);
        } catch (\Throwable $th) {
            return response()->json(['status' => 'error', 'message' => 'Configuracion Modificada con exito.!!']);
        }
    }
    public function GrabaConfiguracion(Request $r)
    {
        if ($r->idconfiguracion != 0) {
            ConfiguracionApp::where('id', $r->idconfiguracion)->update(['rangokilometraje' =>  $r->kilometraje, 'tarifa' => $r->tarifa]);
            return response()->json(['status' => 'ok', 'message' => 'Configuracion Modificada con exito.!!']);
        }
        //SalidadUnidad::where('id', $r->idsalida)->update(['rangokilometraje' =>  'F','rangokilometraje' =>  'F']);
        $newConfiguracion = new ConfiguracionApp();
        $newConfiguracion->rangokilometraje = $r->kilometraje;
        $newConfiguracion->tarifa = $r->tarifa;
        $newConfiguracion->propietario = $r->idsocio;
        $newConfiguracion->estado = 'A';
        $newConfiguracion->save();
        return response()->json(['status' => 'ok', 'message' => 'Configuracion Creado con exito.!!']);
    }
    public function ConfiguracionApp($idusuario)
    {
        $dataConfi =  ConfiguracionApp::where('propietario', $idusuario)->first();
        return response()->json(['status' => 'ok', 'datos' => $dataConfi]);
    }
    public function KilometrajeValido($idunidad, $kilometraje)
    {
        $valkilometraje = HtKilometraje::where('id_unidad_fk', $idunidad)->orderBy('id', 'DESC')->first();
        if ($valkilometraje != null) {
            if (floatval($kilometraje) <= floatval($valkilometraje->kilometraje)) {
                return false;
            }
        }
        return true;
    }

    public function listarAsignacion(Request $r)
    {
        try {
            Log::info($r);
            $newLista = [];
            $datos = DB::table('asignacion')
                ->join('ct_vehiculos', 'asignacion.id_unidad_fk', 'ct_vehiculos.IdVehiculos')
                ->join('co_chofer', 'co_chofer.IdChofer', 'asignacion.id_chofer_fk')
                ->join('co_ente', 'co_chofer.IdEnte', 'co_ente.id_ente')
                ->where('asignacion.id_usuario_ing', $r->idusuario)
                ->where('asignacion.id_chofer_fk', $r->idchofer)
                ->where('asignacion.estado', $r->tipo)
                ->whereBetween('asignacion.fechaIngreso', [$r->fechadesde, $r->fechahasta])
                ->select(['co_ente.nombre_completo', 'ct_vehiculos.PlacaVehiculo', 'asignacion.*'])->get();
            foreach ($datos as $key => $value) {
                if ($r->tipo == 'E') {
                    $valorFinalGuardia = Guardias::where('id_asignacion_fk', $value->id)->sum('valcobrado');
                    $value->valorgeneral = $valorFinalGuardia;
                } else {
                    $value->valorgeneral = $value->canthoras;
                }
            }
            if (count($datos)) {
                array_push($newLista, $value);
            }


            return response()->json(['status' => 'ok', 'datos' => $newLista]);
        } catch (\Throwable $th) {
            return response()->json(['status' => 'error', 'message' => $th->getMessage()]);
        }
    }
    public function listarAsignacionPendientes($idusuario)
    {
        try {
            $newLista = [];
            $datos = DB::table('asignacion')
                ->join('ct_vehiculos', 'asignacion.id_unidad_fk', 'ct_vehiculos.IdVehiculos')
                ->join('co_chofer', 'co_chofer.IdChofer', 'asignacion.id_chofer_fk')
                ->join('co_ente', 'co_chofer.IdEnte', 'co_ente.id_ente')
                ->where('asignacion.id_usuario_ing', $idusuario)
                ->where('asignacion.estado', 'E')
                ->where('asignacion.tipoAsignacion', 'P')
                ->select(['co_ente.nombre_completo', 'ct_vehiculos.PlacaVehiculo', 'asignacion.*'])->get();
            foreach ($datos as $key => $value) {
                $valorFinalGuardia = Guardias::where('id_asignacion_fk', $value->id)->sum('valcobrado');
                $value->valorgeneral = $valorFinalGuardia;
                array_push($newLista, $value);
            }
            return response()->json(['status' => 'ok', 'datos' => $newLista]);
        } catch (\Throwable $th) {
            return response()->json(['status' => 'error', 'message' => $th->getMessage()]);
        }
    }

    public function CrearGuardia(Request $r)
    {
        try {
            Log::info($r);
            $dataAsignacion = Asignacion::where('id', $r->idasignacion)->first();
            $dataSalida = SalidadUnidad::where('idunidad', $dataAsignacion->id_unidad_fk)
                ->where('idchofer', $dataAsignacion->id_chofer_fk)
                ->where('estado', 'P')->first();
            $kilometrajeValido = $this->KilometrajeValido($dataSalida->idunidad, $r->kilometraje);
            if (!$kilometrajeValido) {
                return response()->json(['status' => 'error', 'message' => 'El kilometraje no puede ser menor al anterior.!!']);
            }
            $damefecha = Carbon::now()->subHour(5);
            $dataGuardia = new Guardias();
            $dataGuardia->id_asignacion_fk = $r->idasignacion;
            $dataGuardia->valcobrado = $r->montocobrado;
            $dataGuardia->fechaIngreso = $damefecha;
            $dataGuardia->id_usuario_ing = $r->idusuario;
            // $dataGuardia->id_usuario_ing = $r->idusuario;
            $dataGuardia->estado = 'A';
            $dataGuardia->observacion = $r->observacion;
            $dataGuardia->save();
            //buscar asignacion

            $modeloKilometraje = new HtKilometraje();
            $modeloKilometraje->id_unidad_fk = $dataSalida->idunidad;
            $modeloKilometraje->kilometraje = $r->kilometraje;
            $modeloKilometraje->fechaIngreso = $damefecha;
            $modeloKilometraje->estado = 'A';
            $modeloKilometraje->save();
            return response()->json(['status' => 'ok', 'message' => 'Datos grabados con exito.!!']);
        } catch (\Throwable $th) {
            Log::error($th->getMessage());
            return response()->json(['status' => 'error', 'message' => 'Problemas al grabar la información.!!']);
        }
    }

    public function informeGuardias(Request $r)
    {
        try {
            $newLista = [];
            $datos = DB::table('guardias')
                ->join('asignacion', 'asignacion.id', 'guardias.id_asignacion_fk')
                ->join('ct_vehiculos', 'asignacion.id_unidad_fk', 'ct_vehiculos.IdVehiculos')
                ->join('co_chofer', 'co_chofer.IdChofer', 'asignacion.id_chofer_fk')
                ->join('co_ente', 'co_chofer.IdEnte', 'co_ente.id_ente')
                ->where('guardias.id_usuario_ing', $r->idusuario)
                ->where('asignacion.id_chofer_fk', $r->idchofer)
                ->whereBetween('asignacion.fechaIngreso', [$r->fechadesde, $r->fechahasta])
                ->select(['co_ente.nombre_completo', 'ct_vehiculos.PlacaVehiculo', 'guardias.*'])->get();


            return response()->json(['status' => 'ok', 'datos' => $datos]);
        } catch (\Throwable $th) {
            return response()->json(['status' => 'error', 'message' => $th->getMessage()]);
        }
    }
    public function informeNovedades(Request $r)
    {
        try {
            $newLista = [];
            $datos = DB::table('novedades')
                ->join('asignacion', 'asignacion.id', 'novedades.id_asignacion_fk')
                ->join('ct_vehiculos', 'asignacion.id_unidad_fk', 'ct_vehiculos.IdVehiculos')
                ->join('co_chofer', 'co_chofer.IdChofer', 'asignacion.id_chofer_fk')
                ->join('co_ente', 'co_chofer.IdEnte', 'co_ente.id_ente')
                ->where('asignacion.id_usuario_ing', $r->idusuario)
                ->where('asignacion.id_chofer_fk', $r->idchofer)
                ->whereBetween('novedades.fecha', [$r->fechadesde, $r->fechahasta])
                ->select(['co_ente.nombre_completo', 'ct_vehiculos.PlacaVehiculo', 'novedades.*'])->get();
            return response()->json(['status' => 'ok', 'datos' => $datos]);
        } catch (\Throwable $th) {
            return response()->json(['status' => 'error', 'message' => $th->getMessage()]);
        }
    }
}
