<?php

namespace App\Http\Controllers;

use App\Models\CoDocumentoVehiculo;
use App\Models\CoSocios;
use App\Models\CtVehiculos;
use App\Models\PaItemCatalogo;
use App\Models\Parametros;
use PDF;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use JeroenNoten\LaravelAdminLte\View\Components\Form\Select;

class VehiculoController extends Controller
{
    public function ListarVehiculosSocio(Request $r)
    {
        try {
            $Choferes = DB::table('ct_vehiculos As c')
                //->join('co_ente As e', 'c.idEnte', '=', 'e.id_ente')
                ->where('c.Estado', $r->estado)
                ->where('c.PerteneceVehiculo', $r->aud_ing_usuario)
                ->whereRaw('c.FechaIngreso = DATE_FORMAT("' . $r->aud_ing_fecha . '", "%Y-%m-%d")')
                ->select("c.*")
                ->get();
            return response()->json([
                'status' => 'ok',
                'success' => true,
                'object' => $Choferes
            ]);
        } catch (\Throwable $th) {
            return response()->json([
                'status' => 'error',
                'success' => false,
                'data' => null
            ]);
        }
    }
    //
    public function ConsultarVehiculos()
    {
        //

        try {

            // $ListVehiculos2 =  DB::table('ct_vehiculos as a')
            //     ->join('co_socios as b', 'b.IdSocios', 'a.IdSocio')
            //     ->join('co_ente as c', 'c.id_ente', 'b.IdEnte')
            //     ->where('a.Estado', 'A')
            //     ->select(['a.IdVehiculos', 'a.PlacaVehiculo', 'a.FechaIngreso', 'a.CodigoMarca', 'a.CodigoModelo', 'a.AnioVehiculo', 'a.TipoCombustible', 'a.ColorVehiculo', 'a.IdMarca', 'a.IdModelo', 'a.AmbienteOperacion', 'a.ClaseTransporte', 'a.Estado', 'a.PerteneceVehiculo', 'a.FechaCaducidadLicencia', 'a.FechaCaducidadMatricula','a.Chasis',DB::raw("CONCAT(c.p_primer_apellido,c.p_primer_nombre) AS Socio")])
            //     ->get();

            // Log::info($ListVehiculos2);

            // return datatables(
            //     DB::table('ct_vehiculos')
            //         ->where('ct_vehiculos.Estado', 'A')
            //         ->select(['IdVehiculos', 'PlacaVehiculo', 'FechaIngreso','emisionLicencia', 'CodigoMarca', 'CodigoModelo', 'AnioVehiculo', 'TipoCombustible', 'ColorVehiculo', 'IdMarca', 'IdModelo', 'AmbienteOperacion', 'ClaseTransporte', 'Estado', 'PerteneceVehiculo', 'FechaCaducidadLicencia', 'FechaCaducidadMatricula', 'Chasis'])
            //         ->get()
            // )->toJson();

            return datatables(
                DB::table('ct_vehiculos as a')
                    ->join('co_socios as b', 'b.IdSocios', 'a.IdSocio')
                    ->join('co_ente as c', 'c.id_ente', 'b.IdEnte')
                    ->where('a.Estado', 'A')
                    ->select(['a.IdVehiculos', 'a.PlacaVehiculo', 'a.FechaIngreso', 'a.emisionLicencia', 'a.CodigoMarca', 'a.CodigoModelo', 'a.AnioVehiculo', 'a.TipoCombustible', 'a.ColorVehiculo', 'a.IdMarca', 'a.IdModelo', 'a.AmbienteOperacion', 'a.ClaseTransporte', 'a.Estado', 'a.PerteneceVehiculo', 'a.FechaCaducidadLicencia', 'a.FechaCaducidadMatricula', 'a.Chasis', DB::raw("CONCAT(c.p_primer_apellido,' ',c.p_primer_nombre) AS Socio")])
                    ->get()
            )->toJson();
        } catch (\Throwable $th) {
        }
    }

    public function Mantenimiento()
    {
        $socios = $this->MuestraSocioSinUnidad();
        $marcas = $this->CargarMarcas();
        return view('Mantenimiento.Vehiculos.vehiculo', ['marcas' => $marcas], ['socios' => $socios]);
    }

    public function InformeVehiculoIndex()
    {
        $socios = $this->MuestraSocios();
        return view('Mantenimiento.Vehiculos.infVehiculos', ['socios' => $socios]);
    }

    public function MuestraSociosActivo()
    {
        $dataSocio = DB::table('co_socios')
            ->join('co_ente', 'co_socios.IdEnte', 'co_ente.id_ente')
            ->where('co_socios.Activo', 'A')
            ->select(['co_socios.IdSocios', 'co_socios.IdEnte', DB::raw('concat(co_ente.p_primer_nombre," ",co_ente.p_primer_apellido) as nombre_completo')])
            ->get();
        return $dataSocio;
    }

    public function MuestraSocios()
    {
        $dataSocio = DB::table('co_socios')
            ->join('co_ente', 'co_socios.IdEnte', 'co_ente.id_ente')
            ->select(['co_socios.IdSocios', 'co_socios.IdEnte', DB::raw('concat(co_ente.p_primer_nombre," ",co_ente.p_primer_apellido) as nombre_completo')])
            ->get();
        return $dataSocio;
    }

    public function CargarMarcas()
    {
        $items = DB::table('pa_catalogo')
            ->join('pa_item_catalogo', 'pa_item_catalogo.IdCatalogo', '=', 'pa_catalogo.IdCatalogo')
            ->where('pa_catalogo.NombreCatalogo', 'CO_MARCAS')
            ->where('pa_catalogo.Estado', 'A')
            ->get();

        return $items;
    }

    public function CargarModelos(Request $idPadre)
    {


        $items = PaItemCatalogo::join('pa_catalogo', 'pa_catalogo.IdCatalogo', '=', 'pa_item_catalogo.IdCatalogo')
            ->where('pa_item_catalogo.IdPadre', $idPadre->id)
            ->get();


        return response()->json([
            'status' => 'ok',
            'success' => true,
            'object' => $items
        ]);
    }
    public function MuestraSocioSinUnidad()
    {
        $dataSocio = DB::table('co_socios')
            ->join('co_ente', 'co_socios.IdEnte', 'co_ente.id_ente')
            ->where('co_socios.Activo', 'A')
            ->where('co_socios.FechaModificacion', '0')
            ->select(['co_socios.IdSocios', 'co_socios.IdEnte', DB::raw('concat(co_ente.p_primer_nombre," ",co_ente.p_primer_apellido) as nombre_completo')])
            ->get();
        return $dataSocio;
    }
    public function CargarModelosPorDetCatalogo(Request $detCatalogo)
    {

        $CodigoCatalogo = PaItemCatalogo::join('pa_catalogo', 'pa_catalogo.IdCatalogo', '=', 'pa_item_catalogo.IdCatalogo')
            ->where('pa_item_catalogo.IdDetcatalogo', $detCatalogo->id)
            ->select('pa_item_catalogo.CodigoCatalogo')
            ->get();

        $items = PaItemCatalogo::join('pa_catalogo', 'pa_catalogo.IdCatalogo', '=', 'pa_item_catalogo.IdCatalogo')
            ->where('pa_item_catalogo.IdPadre', $CodigoCatalogo[0]->CodigoCatalogo)
            ->where('pa_item_catalogo.Estado', 'A')
            ->select('pa_item_catalogo.*')
            ->get();


        return response()->json([
            'status' => 'ok',
            'success' => true,
            'object' => $items
        ]);
    }

    public function CreateVehiculo(Request $r)
    {
        $dameFecha = Carbon::now()->subHour(5);

        try {
            $r->validate([
                'id_vehiculo' => 'required',
                'idPlaca' => 'required',
                'anioVehiculo' => 'required',
                'tipoCombustible' => 'required',
                'colorVehiculo' => 'required',
                'marca' => 'required',
                'modelo' => 'required',
                'operacion' => 'required',
                'claseTransporte' => 'required',
                'estado' => 'required',
                'pertenece' => 'required',
                'emiLicencia' => 'required',
                'caduLicencia' => 'required',
                'matricula' => 'required',
                'Chasis' => 'required'
                //'certMatriculacion' => 'required', 
                //'permisoOperacion' => 'required'
            ]);
        } catch (\Throwable $th) {
            return response()->json([
                'status' => 'error',
                'success' => false,
                'message' => 'Debe llenar todos los campos son obligatorio.!!',
            ]);
        }

        try {
            $dateLicencia = Carbon::createFromFormat('d/m/Y', $r['caduLicencia']);
            $dateMatricula = Carbon::createFromFormat('d/m/Y', $r['matricula']);
            $dateEmiLicencia = Carbon::createFromFormat('d/m/Y', $r['emiLicencia']);

            //verifica que no se encuentre registrado
            if ($r->id_vehiculo <= 0) {
                $contDataUsers = CtVehiculos::where('PlacaVehiculo', trim($r->idPlaca))->where('Estado', 'A')->count();
                if ($contDataUsers > 0) {
                    return response()->json([
                        'status' => 'error',
                        'success' => false,
                        'message' => 'el numero de identificacion ' . $r->idPlaca . 'ya se encuentra registrada.!',
                    ]);
                }
            }

            $anioMaximo = date("Y");
            $anioMinimo = 1900;
            $anio = $r->anioVehiculo;
            if ($anio < $anioMinimo or $anio > $anioMaximo) {
                return response()->json([
                    'status' => 'error',
                    'success' => false,
                    'message' => 'Debe especificar un año valido.!',
                ]);
            }


            //if ($r->id_vehiculo <= 0) {
            if ($r->id_vehiculo > 0) {
                $splitLICEN = explode("/", $r['caduLicencia']);
                $splitMATRI = explode("/", $r['matricula']);
                $splitEmiLice = explode("/", $r['emiLicencia']);

                $fecha_actual = date("Y/m/d");
                $fecha_cert_licen = date("Y/m/d", strtotime($splitLICEN[2] . "-" . $splitLICEN[1] . "-" . $splitLICEN[0]));
                $fecha_cert_matri = date("Y/m/d", strtotime($splitMATRI[2] . "-" . $splitMATRI[1] . "-" . $splitMATRI[0]));
                $fecha_emi_licencia = date("Y/m/d", strtotime($splitEmiLice[2] . "-" . $splitEmiLice[1] . "-" . $splitEmiLice[0]));
                if ($fecha_emi_licencia >= $fecha_actual) {
                    return response()->json(['status' => 'error', 'success' => false, 'message' => 'La fecha de Emisión de Licencia debe ser menor a la de hoy!']);
                }

                if ($fecha_cert_licen <= $fecha_actual) {
                    return response()->json(['status' => 'error', 'success' => false, 'message' => 'La fecha de caducidad de la LICENCIA debe ser mayor a la de hoy!']);
                }

                if ($fecha_cert_matri <= $fecha_actual) {
                    return response()->json(['status' => 'error', 'success' => false, 'message' => 'La fecha de caducidad de la MATRICULA debe ser mayor a la de hoy!']);
                }
            }

            //Obtener codigo Marca
            $ObjMarca = PaItemCatalogo::join('pa_catalogo', 'pa_catalogo.IdCatalogo', '=', 'pa_item_catalogo.IdCatalogo')
                ->where('pa_catalogo.NombreCatalogo', 'CO_MARCAS')
                //->where('pa_item_catalogo.CodigoCatalogo', $r->marca)
                ->where('pa_item_catalogo.IdDetcatalogo', $r->marca)
                ->first();

            $ObjModelo = PaItemCatalogo::join('pa_catalogo', 'pa_catalogo.IdCatalogo', '=', 'pa_item_catalogo.IdCatalogo')
                ->where('pa_catalogo.NombreCatalogo', 'CO_MODELOS')
                //->where('pa_item_catalogo.IdPadre', $ObjMarca->IdDetcatalogo)
                ->where('pa_item_catalogo.CodigoCatalogo', $r->modelo)
                ->where('pa_item_catalogo.IdPadre', $ObjMarca->CodigoCatalogo)
                ->first();

            //Guardar Vehiculo
            $dataPropietario = new CtVehiculos();

            if ($r->id_vehiculo > 0) {
                $dataPropietario = CtVehiculos::where('Estado', 'A')
                    ->where('IdVehiculos', $r->id_vehiculo)
                    ->first();

                if ($dataPropietario == null) {
                    return response()->json([
                        'status' => 'error',
                        'success' => true,
                        'message' => 'No se encuentra vehiculo con placa ' . $r->idPlaca
                    ]);
                }
                $dataPropietario->FechaModificacion = $dameFecha;
                $dataPropietario->UsuarioModificacion = 'ADMIN';
            } else {
                $dataPropietario->FechaIngreso = $dameFecha;
                $dataPropietario->FechaCreacion = $dameFecha;
                $dataPropietario->UsuarioCreacion = 'ADMIN';
            }
            $dataPropietario->PlacaVehiculo = str_replace("_", "", $r->idPlaca);
            $dataPropietario->emisionLicencia = $dateEmiLicencia->format('Y-m-d');
            $dataPropietario->IdSocio = $r->pertenece;
            $dataPropietario->AnioVehiculo = $r->anioVehiculo;
            $dataPropietario->TipoCombustible = $r->tipoCombustible;
            $dataPropietario->ColorVehiculo = $r->colorVehiculo;
            $dataPropietario->IdMarca = $r->marca;
            $dataPropietario->CodigoMarca = $ObjMarca->Descricion;
            $dataPropietario->IdModelo = $r->modelo;
            $dataPropietario->CodigoModelo = $ObjModelo->Descricion;
            $dataPropietario->AmbienteOperacion = $r->operacion;
            $dataPropietario->ClaseTransporte = $r->claseTransporte;
            $dataPropietario->Estado = $r->estado;
            $dataPropietario->EstacionCreacion = 'L';
            $dataPropietario->PerteneceVehiculo = $r->pertenece;
            $dataPropietario->FechaCaducidadLicencia = $dateLicencia->format('Y-m-d');
            $dataPropietario->FechaCaducidadMatricula =  $dateMatricula->format('Y-m-d');
            $dataPropietario->Chasis = strtoupper($r->Chasis);


            DB::beginTransaction();
            $dataPropietario->save();

            if ($r->id_vehiculo > 0) {
                if ($r->certMatriculacion != null && $r->permisoOperacion != null) {
                    $path1 = $r->file('certMatriculacion')->store('public/documentos/archivos');
                    $path2 = $r->file('permisoOperacion')->store('public/documentos/archivos');
                }
            } else {
                if ($r->certMatriculacion == null && $r->permisoOperacion == null) {
                    return response()->json([
                        'status' => 'error',
                        'success' => true,
                        'message' => 'Documentos no Cargados!..'
                    ]);
                }

                $path1 = $r->file('certMatriculacion')->store('public/documentos/archivos');
                $path2 = $r->file('permisoOperacion')->store('public/documentos/archivos');
            }



            if ($r->certMatriculacion != null && $r->permisoOperacion != null) {
                if ($r->id_vehiculo > 0) {
                    $ObjDoc = CoDocumentoVehiculo::where('co_documento_vehiculo.IdVehiculo', $r->id_vehiculo)
                        ->first();

                    $ObjDoc->Estado = 'I';
                    $ObjDoc->FechaModificacion = $dameFecha;
                    $ObjDoc->UsuarioModificacion = 'ADMIN';
                    $ObjDoc->save();
                }
                // guarda documentos
                $dataDocumentos = new CoDocumentoVehiculo();
                $dataDocumentos->IdVehiculo = $dataPropietario->IdVehiculos;
                $dataDocumentos->RutaMatricula = $path1;
                $dataDocumentos->RutaPermiso = $path2;
                $dataDocumentos->Estado = $r->estado;
                $dataDocumentos->UsuarioCreacion = 'user';
                $dataDocumentos->FechaCreacion = $dameFecha;
                $dataDocumentos->save();
            }

            CoSocios::where('IdSocios', $r->pertenece)->update(['FechaModificacion' => '1']);

            DB::commit();

            //fin de la instruccion
            return response()->json([
                'status' => 'ok',
                'success' => true,
                'message' => 'El vehiculo ' . str_replace("_", "", $r->idPlaca) . ' fue ' . ($r->id_vehiculo > 0 ? 'Modificado' : 'Creado') . ' con exito.!!',
            ]);
        } catch (\Throwable $th) {
            DB::rollback();
            Log::error($th->getMessage());
            //  $name = $r->file('archivo1')->getClientOriginalName();
            // $file_extension = $r->archivo1->getClientOriginalExtension();
            return response()->json([
                'status' => 'error',
                'success' => false,
                'message' => 'Se presentaron inconvenientes al guardar la información',
            ]);
        }
    }

    public function VerPdfVehiculos($idarchivo, $tipodoc)
    {
        try {
            $rutaArchivo = '';
            $dameArchivo = DB::table('co_documento_vehiculo')
                ->select(['RutaMatricula',  'RutaPermiso'])
                ->where('IdVehiculo', $idarchivo)
                ->where('Estado', 'A')
                ->get();
            //  $dameArchivo = DB::table('documentosvehiculos')->where('id_vehiculos', $idarchivo)->get();
            if ($tipodoc == 1) {
                $rutaArchivo = $dameArchivo[0]->RutaMatricula;
            } else if ($tipodoc == 2) {
                $rutaArchivo = $dameArchivo[0]->RutaPermiso;
            }
            //  Log::info($dameArchivo);
            $path = storage_path('app' . '/' . $rutaArchivo);
            $header = [
                'Content-Type' => 'application/pdf',
                'Content-Disposition' => 'inline; filename="' . $rutaArchivo . '"',
            ];
            return response()->file($path, $header);
        } catch (\Throwable $th) {
            return view('sindocumento');
        }
    }

    public function ListarUnidadSinAsignacion($idusuario)
    {
    }
    public function ListarUnidadxSocio($idusuario)
    {
        $dataSocio = CoSocios::where('IdEnte', $idusuario)->first();
        $dataVehiculos = CtVehiculos::where('IdSocio', $dataSocio->IdSocios)->select(['IdSocio', 'IdVehiculos', 'AnioVehiculo', 'TipoCombustible', 'ColorVehiculo', 'PerteneceVehiculo', 'ClaseTransporte', 'PlacaVehiculo', 'FechaIngreso', 'emisionLicencia', 'FechaCaducidadLicencia', 'FechaCaducidadMatricula', 'Estado', 'IdMarca', 'CodigoMarca', 'IdModelo', 'CodigoModelo', 'Chasis',  'FechaCreacion',])->get();
        return $dataVehiculos;
    }

    public function ConsultaInformeVehiculos(Request $r)
    {

        try {
            $r->session()->forget('filtrosVehiculos');
            $r->session()->forget('informacionVehiculo');
            $r->session()->put('filtrosVehiculos', ['fechadesde' => $r->fechadesde, 'fechahasta' => $r->fechahasta, 'estado' => $r->estado]);

            if ($r->usuario == 'T') {
                $dataVehiculo = DB::table('ct_vehiculos As v')
                    ->join('co_socios As s', 's.IdSocios', 'v.IdSocio')
                    ->join('co_ente As e', 'e.id_ente', 's.IdEnte')
                    ->where('v.Estado', $r->estado)
                    ->whereBetween('v.FechaIngreso', [$r->fechadesde, $r->fechahasta])
                    ->select(['v.*', DB::raw('concat(e.p_primer_nombre," ",e.p_primer_apellido) as nombre_completo')])
                    ->get();
            } else {
                $dataVehiculo = DB::table('ct_vehiculos As v')
                    ->join('co_socios As s', 's.IdSocios', 'v.IdSocio')
                    ->join('co_ente As e', 'e.id_ente', 's.IdEnte')
                    ->where('v.Estado', $r->estado)
                    ->where('v.IdSocio', $r->usuario)
                    //->whereBetween('v.FechaIngreso', [$r->fechadesde, $r->fechahasta])
                    ->whereBetween(DB::raw('DATE_FORMAT(v.FechaIngreso, "%Y-%m-%d")'), [$r->fechadesde, $r->fechahasta])
                    ->select(['v.*', DB::raw('concat(e.p_primer_nombre," ",e.p_primer_apellido) as nombre_completo')])
                    ->get();
            }

            //Log::info($dataVehiculo);

            $r->session()->put('informacionVehiculo', $dataVehiculo);

            return response()->json([
                'status' => 'ok',
                'dataVehiculo' => $dataVehiculo,
            ]);
        } catch (\Throwable $th) {

            return response()->json([
                'status' => 'error',
                'message' => 'Se presentaron inconvenientes al procesar la información',
            ]);
        }
    }


    public function VehiculosVerPdf()
    {
         $dataParametros = Parametros::first();
        $data = [
            'parametros' => $dataParametros,
            'datos' => session('filtrosVehiculos'),
            'Vehiculos' => session('informacionVehiculo'),
        ];
        //$pdf = PDF::loadView('pdf.infSocioPdf', ['filtros' => session('filtros'),])->setPaper('a4', 'portrait');
      //  $pdf = PDF::loadView('pdf.infVehiculoPdf', $data)->setPaper('a4', 'landscape');
        return Pdf::loadView('pdf.infVehiculoPdf', $data)->setPaper('a4', 'landscape')->stream('Informe_vehiculo.pdf');
    
       // return $pdf->download('InformeVehiculo.pdf');
    }
    public function ListarVehiculoDisponibles($idusuario)
    {
        $dataSocio = CoSocios::where('IdEnte', $idusuario)->first();
        $dataVehiculos = CtVehiculos::where('IdSocio', $dataSocio->IdSocios)
            ->where('EstacionCreacion', 'L')
            ->select([
                'IdSocio', 'IdVehiculos', 'AnioVehiculo', 'TipoCombustible',
                'ColorVehiculo', 'PerteneceVehiculo', 'ClaseTransporte', 'PlacaVehiculo',
                'FechaIngreso', 'emisionLicencia', 'FechaCaducidadLicencia',
                'FechaCaducidadMatricula', 'Estado', 'IdMarca', 'CodigoMarca',
                'IdModelo', 'CodigoModelo', 'Chasis',  'FechaCreacion'
            ])->get();
        return $dataVehiculos;
    }
}
