<?php

namespace App\Http\Controllers;


use App\Mail\MailClaveUsuario;
use App\Models\CoDocumentoPersona;
use App\Models\CoEnte;
use App\Models\CoSocios;
use App\Models\Nacionalidad;
use App\Models\User;
use Illuminate\Http\Request;
use Carbon\Carbon;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use App\Imports\SociosImport;
use Excel;
use App\Models\Parametros;
use PDF;
use Spatie\Permission\Models\Role;

class SocioController extends Controller
{
    public $valorGeneral = [];
    public $valorFiltros;
    public function __contruct()
    {
        $this->middleware('auth');
    }

    public function CrearUsuarioIndex()
    {
        $listaRoles = Role::get();
        return view('Mantenimiento.Items.crearUsuarios', ['roles' => $listaRoles]);
    }
    public function InformeSocioIndex()
    {
        return view('Mantenimiento.socio.infSocios');
    }

    public function ListarUsuarios()
    {
        try {
            return datatables(
                DB::table('model_has_roles')->join('users', 'model_has_roles.model_id', 'users.id')
                    ->select('users.*', 'model_has_roles.role_id')
                    ->get()
            )->toJson();
        } catch (\Throwable $th) {
            Log::error($th);
            return datatables(
                []
            )->toJson();
        }
    }

    public function GrabaUsuario(Request $r)
    {
        try {




            if ($r->id_usuario <= 0) {
                $consultaUsuario = User::where('cedula', $r->identificacion)->get();
                if (count($consultaUsuario) > 0) {
                    return response()->json([
                        'status' => 'error',
                        'success' => false,
                        'message' => 'El numero de cedula ingresado ya se encuentra registrado.!',
                    ]);
                }
                $consultaCorreo = User::where('email', $r->p_correo)->get();
                if (count($consultaCorreo) > 0) {
                    return response()->json([
                        'status' => 'error',
                        'success' => false,
                        'message' => 'El correo ingresado ya se encuentra registrado.!',
                    ]);
                }
                $dameNombres =  explode(" ", $r->nombre);
                if (count($dameNombres) < 4) {
                    return response()->json([
                        'status' => 'error',
                        'success' => false,
                        'message' => 'Los dos nombres y dos apellidos son obligatorios.!',
                    ]);
                }
                User::create([
                    'name' => $r->nombre,
                    'email' => $r->correo,
                    'cedula' => $r->identificacion,
                    'password' => Hash::make($r->clave),
                    'subnombre' => $dameNombres[2] . ' ' . $dameNombres[0]
                ])->assignRole($r->idrol);
            } else {

                try {

                    $dataUser = User::where('id', $r->id_usuario)->first();
                    $dataUser->name = $r->nombre;
                    $dataUser->email = $r->correo;
                    $dataUser->password = Hash::make($r->clave);

                    DB::beginTransaction();
                    $dataUser->save();
                    DB::commit();
                } catch (\Throwable $th) {

                    DB::rollback();
                    return response()->json([
                        'status' => 'error',
                        'message' => 'problemas al actualizar el usuario.!!',
                    ]);
                }
            }

            return response()->json([
                'status' => 'ok',
                'message' => ($r->id_usuario <= 0 ? 'Usuario Creado con Éxito.!!' : 'Usuario Modificado con Éxito.!!'),
            ]);
        } catch (\Throwable $th) {

            return response()->json([
                'status' => 'error',
                'success' => false,
                'message' => 'Se presentaron inconvenientes al guardar la información',
                'logo' => 0,
                'firma' => 0,
            ]);
        }
    }

    public function ConsultaInformeSocio(Request $r)
    {

        try {
            $r->session()->forget('filtros');
            $r->session()->forget('informacion');
            $r->session()->put('filtros', ['estado' => $r->estado]);
            // $r->session()->put('filtros', ['fechadesde' => $r->fechadesde, 'fechahasta' => $r->fechahasta, 'estado' => $r->estado]);
            $dataEnte = DB::table('co_ente')
                ->join('co_socios', 'co_socios.IdEnte', 'co_ente.id_ente')
                ->join('pa_nacionalidad', 'co_ente.p_nacionalidad', 'pa_nacionalidad.id_codigo')
                ->select([
                    'co_ente.id_ente', 'co_ente.nombre_completo', 'co_ente.num_docum_iden', 'co_ente.p_primer_nombre',
                    'co_ente.p_segundo_nombre', 'co_ente.p_primer_apellido', 'co_ente.p_segundo_apellido',  'co_ente.p_sexo', 'co_ente.p_estado_civil', 'co_ente.p_fecha_nacimiento',
                    'pa_nacionalidad.nombre', 'co_ente.p_direccion', 'co_ente.p_telefono', 'co_ente.p_celular', 'co_ente.p_correo', 'co_ente.tipolicencia'
                ])
                //  ->whereBetween('aud_ing_fecha_hora'[$r->fechadesde,$r->fechahasta])->get();
                //->whereBetween('aud_ing_fecha_hora', [$r->fechadesde, $r->fechahasta])
                // ->whereBetween(DB::raw('DATE_FORMAT(co_ente.aud_ing_fecha_hora, "%Y-%m-%d")'), [$r->fechadesde, $r->fechahasta])
                ->where('co_ente.activo', $r->estado)->get();

            $r->session()->put('informacion', $dataEnte);

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

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


    public function CrearSocioIndex()
    {
        $dataNacionalida = Nacionalidad::where('estado', 'A')->get();
        return view('Mantenimiento.socio.crearsocio', ['nacionalidad' => $dataNacionalida]);
    }
    public function ConsultarChoferes()
    {
        try {
            return datatables(
                DB::table('co_ente as a')
                    ->join('co_socios as b', 'a.id_ente', 'b.IdEnte')
                    ->select(['a.id_ente', 'b.emilicencia', 'b.cadulicencia', 'a.nombre_completo', 'a.num_docum_iden', 'a.actividad', 'a.pagina_web', 'a.observacion', 'a.verificado', 'a.activo', 'a.tipo_ente', 'a.p_primer_nombre', 'a.p_segundo_nombre', 'a.p_primer_apellido', 'a.p_segundo_apellido', 'a.p_apellido_casada', 'a.p_nombres_aux', 'a.p_nombre_compl_aux', 'a.p_sexo', 'a.p_estado_civil', 'a.p_conyuge_id', 'a.p_conyuge_nombre', 'a.p_fecha_nacimiento', 'a.p_ciudad_nacimiento', 'a.p_nacionalidad', 'a.p_profesion', 'a.c_represent_id', 'a.c_represent_nombre', 'a.c_contrib_especial', 'a.aud_ing_usuario', 'a.aud_ing_estacion', 'a.aud_ing_fecha_hora', 'a.aud_mod_usuario', 'a.aud_mod_estacion', 'a.aud_mod_fecha_hora', 'a.userCode', 'a.mobileCode', 'a.stamp', 'a.p_direccion', 'a.p_telefono', 'a.p_celular', 'a.p_correo', 'a.tipolicencia'])
                    ->get()
            )->toJson();
        } catch (\Throwable $th) {
        }
    }
    public function CreateSocio(Request $r)
    {
        $dameFecha = Carbon::now()->subHour(5);
        try {

            $validator = Validator::make($r->all(), [
                'id_socio' => 'required',
                'identificacion' => 'required',
                'nombre' => 'required',
                'apellido' => 'required',
                'nacionalidad' => 'required',
                'estadocivil' => 'required',
                'telefono' => 'required',
                'celular' => 'required',
                'fechanacimiento' => 'required',
                'sexo' => 'required',
                'estado' => 'required',
                'correo' => 'required',
                'direccion' => 'required',
            ]);
            if ($validator->fails()) {
                return response()->json([
                    'status' => 'error',
                    'success' => false,
                    'message' => 'Debe llenar todos los campos son obligatorio.!!',
                ]);
            }
            if ($r->id_socio == 0) {
                if ($r->archivo1 == null || $r->archivo2 == null || $r->archivo3 == null) {
                    return response()->json([
                        'status' => 'error',
                        'success' => false,
                        'message' => 'Los 3 Documentos son Obligatorios!!',
                    ]);
                }
            }
            if ($r->id_socio == 0) {
                $consultaUsuario = User::where('cedula', $r->identificacion)->get();
                if (count($consultaUsuario) > 0) {
                    return response()->json([
                        'status' => 'error',
                        'success' => false,
                        'message' => 'El numero de cedula ingresado ya se encuentra registrado.!',
                    ]);
                }
                $consultaCorreo = User::where('email', $r->p_correo)->get();
                if (count($consultaCorreo) > 0) {
                    return response()->json([
                        'status' => 'error',
                        'success' => false,
                        'message' => 'El correo ingresado ya se encuentra registrado.!',
                    ]);
                }
            }

            // Primero Graba Ente
            $dataCoente = new CoEnte();
            if ($r->id_socio != 0) {
                $dataCoente = CoEnte::where('id_ente', $r->id_socio)->first();
            }

            $r->nombre = strtoupper($r->nombre);
            $r->apellido = strtoupper($r->apellido);

            $dataCoente->nombre_completo = $r->nombre . ' ' . $r->apellido;
            $dataCoente->num_docum_iden = $r->identificacion;
            $dataCoente->p_primer_nombre = $r->nombre;
            $dataCoente->p_segundo_nombre = '';
            $dataCoente->p_primer_apellido = $r->apellido;
            $dataCoente->p_segundo_apellido = '';
            $dataCoente->p_sexo = $r->sexo;
            $dataCoente->activo = $r->estado;
            $dataCoente->p_estado_civil = $r->estadocivil;
            $dataCoente->p_fecha_nacimiento = $r->fechanacimiento;
            $dataCoente->p_nacionalidad = $r->nacionalidad;
            $dataCoente->observacion = $r->observacion;
            $dataCoente->actividad = '';
            $dataCoente->pagina_web = '';
            $dataCoente->verificado = $r->estado;
            $dataCoente->tipo_ente = 'S';
            $dataCoente->stamp = $dameFecha;
            $dataCoente->aud_ing_fecha_hora = $dameFecha;
            $dataCoente->aud_ing_usuario = '1';
            $dataCoente->p_direccion = $r->direccion;
            $dataCoente->p_telefono = $r->telefono;
            $dataCoente->p_celular = $r->celular;
            $dataCoente->p_correo = $r->correo;
            $dataCoente->tipolicencia = $r->idtipolicencia;
            DB::beginTransaction();
            $dataCoente->save();
            $datSocio = new CoSocios();
            if ($r->id_socio != 0) {
                $datSocio = CoSocios::where('IdEnte', $r->id_socio)->first();
            }
            $datSocio->IdEnte = $dataCoente->id_ente;
            $datSocio->Activo = $r->estado;
            $datSocio->UsuarioCreacion = '1';
            $datSocio->tipoLicencia = $r->idtipolicencia;
            $datSocio->FechaCreacion = $dameFecha;
            $datSocio->emilicencia = $r->emilicencia;
            $datSocio->cadulicencia = $r->cadulicencia;
            if ($r->id_socio == 0) {
                $datSocio->FechaModificacion = '0';
            }

            $datSocio->save();
            if ($r->id_socio == 0) {
                if ($r->archivo1 != null && $r->archivo2 != null && $r->archivo3 != null) {
                    //Tercera Graba DOcumentos locales
                    $path1 = $r->file('archivo1')->store('public/documentos/archivos');
                    $path2 = $r->file('archivo2')->store('public/documentos/archivos');
                    $path3 = $r->file('archivo3')->store('public/documentos/archivos');

                    // Cuarto Graba Rutas en base de dataSocio
                    $dataDocumentoPersona = new CoDocumentoPersona();
                    $dataDocumentoPersona->IdPersona = $dataCoente->id_ente;
                    $dataDocumentoPersona->RutaIdentificacion = $path1;
                    $dataDocumentoPersona->RutaLicencia = $path2;
                    $dataDocumentoPersona->RutaAntecedentes = $path3;
                    $dataDocumentoPersona->Estado = $r->estado;
                    $dataDocumentoPersona->UsuarioCreacion = '1';
                    $dataDocumentoPersona->FechaCreacion = $dameFecha;
                    $dataDocumentoPersona->save();
                }
            } else {

                $dataDocumentoPersona =  CoDocumentoPersona::where('IdPersona', $dataCoente->id_ente)->first();
                Log::info($dataDocumentoPersona);
                if ($r->archivo1 != null) {
                    $path1 = $r->file('archivo1')->store('public/documentos/archivos');
                    $dataDocumentoPersona->RutaIdentificacion = $path1;
                }
                if ($r->archivo2 != null) {
                    $path2 = $r->file('archivo2')->store('public/documentos/archivos');

                    $dataDocumentoPersona->RutaLicencia = $path2;
                }
                if ($r->archivo3 != null) {
                    $path3 = $r->file('archivo3')->store('public/documentos/archivos');

                    $dataDocumentoPersona->RutaAntecedentes = $path3;
                }
                $dataDocumentoPersona->save();
            }


            if ($r->id_socio == 0) {
                $dameNombres =  explode(" ", $r->nombre);
                $dameApellidos = explode(" ", $r->apellido);


                // sexto crear usuario y clave solo si es ingreso nuevo
                User::create([
                    'cedula' => $r->identificacion,
                    'name' => $dameApellidos[0] . ' ' . $dameNombres[0],
                    'email' => $r->correo,
                    'password' => Hash::make('clave'),
                    'passworapp' => Hash::make($r->identificacion),
                ]);
            }

            //])->assignRole('Prop');
            // Quinto Envia Gorreo Electronico
            $details = [
                'descripcion' => 'Hola ' . $r->nombre . ' se te a generado las siguientes credenciales para que puedas acceder a la aplicación movil.',
                'usuario' => $r->identificacion,
                'clave' => $r->identificacion,
            ];
            if ($r->id_socio == 0) {
                $detallesEnviado = new MailClaveUsuario($details);
                Mail::to($r->correo)->send($detallesEnviado);
            }
            // Fin de la instruccion
            DB::commit();
            if ($r->id_socio != 0) {
                return response()->json([
                    'status' => 'ok',
                    'success' => false,
                    'message' => $r->nombre . ' ' . 'fue actualizada con exito.!!',
                ]);
            }
            return response()->json([
                'status' => 'ok',
                'success' => false,
                'message' => $r->nombre . ' ' . 'fue creado con exito.!!',
            ]);
        } catch (\Throwable $th) {
            DB::rollback();


            return response()->json([
                'status' => 'error',
                'success' => false,
                'message' => 'Se presentaron inconvenientes al guardar la información',
                'logo' => 0,
                'firma' => 0,
            ]);
        }
    }
    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', 'co_ente.nombre_completo'])
            ->get();
        return response()->json($dataSocio);
    }
    public function MuestraTodosSocios()
    {
        $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 response()->json($dataSocio);
    }

    public function CargarSocioIndex()
    {
        return view('Mantenimiento.socio.cargaSocioExcel');
    }

    public function GrabarSocioExcelIndex(Request $request)
    {
        try {
            $dameFecha = Carbon::now()->subHour(5);
            $validator = Validator::make($request->all(), [
                'select_file'  => 'required|mimes:xls,xlsx'
            ]);
            if ($validator->fails()) {
                return response()->json([
                    'status' => 'error',
                    'success' => false,
                    'message' => 'Debe adjuntar el documento en excel.!!',
                ]);
            }
            $array = Excel::toArray(new SociosImport, $request->file('select_file'));
            // $collection = Excel::toCollection(new SociosImport, $request->file('select_file'));
            if (count($array) == 0) {
                return response()->json([
                    'status' => 'error',
                    'success' => false,
                    'message' => 'Documento sin Datos.!!',
                ]);
            }
            DB::beginTransaction();
            foreach ($array as $key => $row) {
                foreach ($row as $Subjson => $valueSubjson) {
                    if ($valueSubjson[0] != NULL && $valueSubjson[1] != NULL && $valueSubjson[0] != 'nombre') {
                        $dataCoente = new CoEnte();
                        $dataCoente->nombre_completo = $valueSubjson[0] . ' ' . $valueSubjson[1];
                        $dataCoente->num_docum_iden = $valueSubjson[2];
                        $dataCoente->p_primer_nombre = $valueSubjson[0];
                        $dataCoente->p_segundo_nombre = '';
                        $dataCoente->p_primer_apellido = $valueSubjson[1];
                        $dataCoente->p_segundo_apellido = '';
                        $dataCoente->p_sexo = 'M'; //$valueSubjson['sexo'];
                        $dataCoente->activo = 'I';
                        $dataCoente->p_estado_civil = 'Soltero'; //$valueSubjson['estadocivil'];
                        $dataCoente->p_fecha_nacimiento = $dameFecha; //$valueSubjson['fechanacimiento'];
                        $dataCoente->p_nacionalidad = 1; //$valueSubjson['nacionalidad'];
                        $dataCoente->observacion = '';
                        $dataCoente->p_telefono = '0';
                        $dataCoente->p_celular = '0';
                        $dataCoente->p_correo = 'NA';
                        $dataCoente->actividad = '';
                        $dataCoente->pagina_web = '';
                        $dataCoente->verificado = 'S';
                        $dataCoente->tipo_ente = 'S';
                        $dataCoente->stamp = $dameFecha;
                        $dataCoente->aud_ing_fecha_hora = $dameFecha;
                        $dataCoente->aud_ing_usuario = '1';
                        $dataCoente->save();
                        //crear datos en la tabla socio
                        $datSocio = new CoSocios();
                        $datSocio->IdEnte = $dataCoente->id_ente;
                        $datSocio->Activo = '';
                        $datSocio->UsuarioCreacion = '1';
                        $datSocio->FechaCreacion = $dameFecha;
                        $datSocio->save();

                        $splitNombres = "";
                        $splitApellidos = "";
                    }
                }
            }

            DB::commit();
            return response()->json([
                'status' => 'ok',
                'success' => false,
                'message' => 'Se insertaron Socios correctamente',
            ]);
        } catch (\Throwable $th) {
            DB::rollback();

            return response()->json([
                'status' => 'error',
                'success' => false,
                'message' => 'Se presentaron inconvenientes al guardar la información',
            ]);
        }
    }
    public function VerPdfSocios($idarchivo, $tipodoc)
    {
        $rutaArchivo = '';
        Log::info($idarchivo);
        $dameArchivo = DB::table('co_documento_persona')
            ->select(['RutaIdentificacion',  'RutaLicencia', 'RutaAntecedentes'])
            ->where('IdPersona', $idarchivo)
            // ->where('Estado', 'A')
            ->get();

        //  $dameArchivo = DB::table('documentosvehiculos')->where('id_vehiculos', $idarchivo)->get();
        //Log::info($dameArchivo);
        if ($tipodoc == 1) {
            $rutaArchivo = $dameArchivo[0]->RutaIdentificacion;
        } else if ($tipodoc == 2) {
            $rutaArchivo = $dameArchivo[0]->RutaLicencia;
        } else if ($tipodoc == 3) {
            $rutaArchivo = $dameArchivo[0]->RutaAntecedentes;
        }
        //  Log::info($dameArchivo);
        $path = storage_path('app' . '/' . $rutaArchivo);
        $header = [
            'Content-Type' => 'application/pdf',
            'Content-Disposition' => 'inline; filename="' . $rutaArchivo . '"'
        ];
        return response()->file($path, $header);
    }

    public function SocioVerPdf()
    {
        $dataParametros = Parametros::first();
        $data = [
            'parametros' => $dataParametros,
            'datos' => session('filtros'),
            'socios' => session('informacion'),
        ];

        return Pdf::loadView('pdf.infSocioPdf', $data)->setPaper('a4', 'landscape')->stream('informe_socio.pdf');
    }
}
