<?php

namespace App\Http\Controllers;

use App\Adjunto;
use App\Estado_Radicado;
use App\Http\Controllers\Controller;
use App\Parametro;
use App\Radicado;
use App\Tipo_Tramite;
use App\Tramite;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Date;
use Illuminate\Support\Facades\File;
use PDF;
use Sujip\Guid\Guid;

class RadicadoController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function ReadRadicados(Request $request)
    {
        try {
            $soloactivos = true;

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

                if ($request->SoloActivos == 'false') {
                    $soloactivos = false;
                }
            }

            $estados = [];
            if ($soloactivos) {
                $estados = Estado_Radicado::where('esfinal', 0)->pluck('id')->toArray();

            }

            if (\Auth::user()->id_perfil == 1 || \Auth::user()->id_perfil == 3) {
                if (!$soloactivos) {
                    $rads = Radicado::select('radicado.*',
                        'tipo_radicado.nombre as TipoRadicado',
                        'users.name  as NombreUsuario',
                        'area.nombre as NombreArea',
                        'estado_radicado.nombre as NombreEstado',
                        'estado_radicado.color',
                        'estado_radicado.esfinal',
                        \DB::raw('fnSolicitantes(radicado.id) as solicitantes'),
                        \DB::raw('IF(radicado.pausado=0, fnFechaLimite(radicado.created_at, radicado.id_tipo_radicado), NULL) as FechaLimite'))

                        ->join('tipo_radicado', 'radicado.id_tipo_radicado', '=', 'tipo_radicado.id')
                        ->join('users', 'radicado.id_usuario', '=', 'users.id')
                        ->join('area', 'radicado.id_area', '=', 'area.id')
                        ->join('estado_radicado', 'radicado.id_estado', '=', 'estado_radicado.id')

                        ->orderBy('radicado.created_at', 'DESC')
                        ->get();
                } else {
                    $rads = Radicado::select('radicado.*',
                        'tipo_radicado.nombre as TipoRadicado',
                        'users.name  as NombreUsuario',
                        'area.nombre as NombreArea',
                        'estado_radicado.nombre as NombreEstado',
                        'estado_radicado.color',
                        'estado_radicado.esfinal',
                        \DB::raw('fnSolicitantes(radicado.id) as solicitantes'),
                        \DB::raw('IF(radicado.pausado=0, fnFechaLimite(radicado.created_at, radicado.id_tipo_radicado), NULL) as FechaLimite'))

                        ->join('tipo_radicado', 'radicado.id_tipo_radicado', '=', 'tipo_radicado.id')
                        ->join('users', 'radicado.id_usuario', '=', 'users.id')
                        ->join('area', 'radicado.id_area', '=', 'area.id')
                        ->join('estado_radicado', 'radicado.id_estado', '=', 'estado_radicado.id')

                        ->orderBy('radicado.created_at', 'DESC')

                        ->whereIn('id_estado', $estados)
                        ->get();
                }

            } else {
                $areas = \Auth::user()->Areas;

                $fa = [];

                foreach ($areas as $a) {

                    $fa[] = $a->id;

                }

                if (!$soloactivos) {
                    $rads = Radicado::select('radicado.*',
                        'tipo_radicado.nombre as TipoRadicado',
                        'users.name  as NombreUsuario',
                        'area.nombre as NombreArea',
                        'estado_radicado.nombre as NombreEstado',
                        'estado_radicado.color',
                        'estado_radicado.esfinal',
                        \DB::raw('fnSolicitantes(radicado.id) as solicitantes'),
                        \DB::raw('IF(radicado.pausado=0, fnFechaLimite(radicado.created_at, radicado.id_tipo_radicado), NULL) as FechaLimite'))

                        ->join('tipo_radicado', 'radicado.id_tipo_radicado', '=', 'tipo_radicado.id')
                        ->join('users', 'radicado.id_usuario', '=', 'users.id')
                        ->join('area', 'radicado.id_area', '=', 'area.id')
                        ->join('estado_radicado', 'radicado.id_estado', '=', 'estado_radicado.id')
                        ->whereIn('id_area', $fa)
                        ->orderBy('created_at', 'DESC')
                        ->get();
                } else {
                    $rads = Radicado::select('radicado.*',
                        'tipo_radicado.nombre as TipoRadicado',
                        'users.name  as NombreUsuario',
                        'area.nombre as NombreArea',
                        'estado_radicado.nombre as NombreEstado',
                        'estado_radicado.color',
                        'estado_radicado.esfinal',
                        \DB::raw('fnSolicitantes(radicado.id) as solicitantes'),
                        \DB::raw('IF(radicado.pausado=0, fnFechaLimite(radicado.created_at, radicado.id_tipo_radicado), NULL) as FechaLimite'))

                        ->join('tipo_radicado', 'radicado.id_tipo_radicado', '=', 'tipo_radicado.id')
                        ->join('users', 'radicado.id_usuario', '=', 'users.id')
                        ->join('area', 'radicado.id_area', '=', 'area.id')
                        ->join('estado_radicado', 'radicado.id_estado', '=', 'estado_radicado.id')
                        ->whereIn('id_area', $fa)
                        ->whereIn('id_estado', $estados)
                        ->orderBy('created_at', 'DESC')
                        ->get();
                }
            }

            //die(print_r($rads));

            $radicados = [];

            return (new Response($rads, 200));
        } catch (\Exception $e) {
            return $e->getMessage();
        }

    }

    public function CargaInicial($idRadicado)
    {
        try {
            $rad = new Radicado();

            $guid = sha1("sivuba-radicado" . time());

            if ($idRadicado != 0) {
                $rad = Radicado::find($idRadicado);
                $rad->solicitantes = $rad->solicitantes;
                $rad->adjuntos = $rad->adjuntos;
                $guid = $rad->codigo;
            }

            $final = Parametro::where('clave', 'estado_final')->get()->first();

            $path = public_path() . '/tmpDocs/' . $guid;

            $result = [
                'actual' => $rad,
                'final' => $final,
                'guid' => $guid,
                'ahora' => Date::now(),
            ];

            if (!file_exists($path)) {
                File::makeDirectory($path);
            }

            return (new Response($result, 200));

        } catch (\Exception $e) {
            return $e->getMessage();
        }

    }
    public function CargaRadicado($idRadicado)
    {
        try {
            $rad = new Radicado();

            $guid = sha1("sivuba-radicado" . time());

            if ($idRadicado != 0) {
                $rads = Radicado::where('id', $idRadicado)
                    ->with('solicitantes')
                    ->with('adjuntos')
                /* ->with('Tramites') */
                    ->with('TipoRadicado')
                    ->with('Area')
                    ->with('Estado')
                    ->with('Usuario')
                    ->get();

                //$rad->solicitantes = $rad->solicitantes;
                //$rad->adjuntos = $rad->adjuntos;
                //$rad->Tramites = $rad->Tramites;
                //$rad->TipoRadicado = $rad->TipoRadicado;
                //$rad->Area = $rad->Area;
                //$rad->Estado = $rad->Estado;
                //$rad->Usuario = $rad->Usuario;

                $rad = $rads[0];
            }

            $path = public_path() . '/tmpDocs/' . $guid;
            $final = Parametro::where('clave', 'estado_final')->get()->first();
            $result = [
                'actual' => $rad,
                'guid' => $guid,
                'final' => $final,
                'ahora' => Date::now(),
            ];

            if (!file_exists($path)) {
                File::makeDirectory($path);
            }

            return (new Response($result, 200));

        } catch (\Exception $e) {
            return $e->getMessage();
        }

    }

    public function Guardar(Request $request)
    {
        try {
            $datos = $request->datos;

            $rad = new Radicado();

            if ($datos['id'] == 0) {
                $estado = Parametro::where('clave', 'estado_inicial')->get()->first();

                $rad->id_estado = $estado->valor;
                $rad->codigo = $this->GeneraCodigo();

            } else {
                $rad = Radicado::find($datos['id']);
            }

            $rad->asunto = $datos['asunto'];
            $rad->descripcion = html_entity_decode($datos['descripcion'], ENT_QUOTES, 'UTF-8');
            $rad->id_tipo_radicado = $datos['id_tipo_radicado'];
            $rad->id_area = $datos['id_area'];
            $rad->id_usuario = Auth::user()->id;
            

            $rad->save();

            if (isset($datos['id_areaTraslado'])) {
                if ($datos['id_areaTraslado'] != 0) {

                    $traslado = Parametro::where('clave', 'TRAMITE_TRASLADO')->get()->first();

                    $tipo = Tipo_Tramite::find($traslado->valor);

                    $tramite = new Tramite();

                    $tramite->id_radicado = $rad->id;
                    $tramite->id_tipo_tramite = $tipo->id;
                    $tramite->id_usuario = Auth::user()->id;

                    $tramite->id_area_origen = $rad->id_area;
                    $tramite->id_area_destino = $datos['id_areaTraslado'];
                    $rad->id_area =  $datos['id_areaTraslado'];

                    $tramite->id_estado = $tipo->id_estado_cambia;

                    $tramite->nota = '';
            
                    $tramite->save();
                    $rad->save();

                }
            }

            //die (print_r($datos['Idsolicitantes']));

            $rad->solicitantes()->detach();

            $sol = $datos['Idsolicitantes']; //explode(',', $datos['Idsolicitantes']);

            foreach ($sol as $s) {
                if ($s) {
                    $rad->solicitantes()->attach($s);
                }
            }

            //Guardar adjuntos
            $archivos = scandir(public_path() . '/tmpDocs/' . $datos['guid']);

            if (!file_exists(public_path() . '/../../public_html' . '/uploads/' . $rad->codigo . '/')) {
                mkdir(public_path() . '/../../public_html' . '/uploads/' . $rad->codigo . '/', 0777, true);
            }

            foreach ($archivos as $a) {
                if ($a != '.' && $a != '..') {

                    $partes_ruta = pathinfo(public_path() . '/tmpDocs/' . $datos['guid'] . '/' . $a);

                    $adjunto = new Adjunto();
                    $adjunto->denominacion = $a;
                    $adjunto->ruta = public_path() . '/../../public_html' . '/uploads/' . $rad->codigo . '/' . $a;
                    $adjunto->url = '/uploads/' . $rad->codigo . '/' . $adjunto->denominacion;
                    $adjunto->extension = $partes_ruta['extension'];

                    copy(public_path() . '/tmpDocs/' . $datos['guid'] . '/' . $a, public_path() . '/../../public_html' . '/uploads/' . $rad->codigo . '/' . $a);

                    $adjunto->save();

                    //die (print_r($adjunto));

                    $rad->adjuntos()->attach($adjunto->id);

                }
            }

            return (new Response($rad, 200));

        } catch (\Exception $e) {
            return $e->getMessage();
        }

    }

    public function NuevoRadicado()
    {
        $rad = new Radicado();

        $final = Parametro::where('clave', 'estado_final')->get()->first();

        $guid = sha1("sivuba-radicado" . time());

        $path = public_path() . '/tmpDocs/' . $guid;

        File::makeDirectory($path);
    }

    public function EditarRadicado($id)
    {
        $rad = Radicado::find($id);
        $final = Parametro::where('clave', 'estado_final')->get()->first();
        $guid = guid();

        $path = public_path() . '/tmpDocs/' . $guid;

        File::makeDirectory($path);

        return \View::make('Radicado/Radicado')
            ->with('url', route('GuardarEditarRegistro'))
            ->with('operacion', "Editar Radicado")
            ->with('actual', $rad)
            ->with('final', $final)
            ->with('guid', $guid);
    }

    public function GuardarNuevoRegistro(Request $request)
    {

        $estado = Parametro::where('clave', 'estado_inicial')->get()->first();

        $r = new Radicado();
        $r->asunto = $request->asunto;
        $r->descripcion = html_entity_decode($request->descripcion, ENT_QUOTES, 'UTF-8');
        $r->id_tipo_radicado = $request->id_tipo_radicado;
        $r->id_area = $request->id_area;
        $r->id_usuario = Auth::user()->id;
        $r->id_estado = $estado->valor;

        $r->codigo = $this->GeneraCodigo();

        $r->save();

        $sol = explode(',', $request->hddSol);

        foreach ($sol as $s) {
            $r->solicitantes()->attach($s);
        }
/*
if (isset($_FILES['adjuntos'])) {

foreach ($request->file('adjuntos') as $f) {

$adjunto = new Adjunto();
$adjunto->denominacion = $f->getClientOriginalName();
$adjunto->ruta = base_path() . '/public/uploads/' . $f->getClientOriginalName();
$adjunto->url = '/uploads/' . $adjunto->denominacion;
$adjunto->extension = $f->getClientOriginalExtension();

$f->move(
base_path() . '/public_html/uploads/', $f->getClientOriginalName()
);

$adjunto->save();

$r->adjuntos()->attach($adjunto->id);

}

}*/

        $archivos = scandir(public_path() . '/tmpDocs/' . $request->hddguid);

        foreach ($archivos as $a) {
            if ($a != '.' && $a != '..') {

                $partes_ruta = pathinfo(public_path() . '/tmpDocs/' . $request->hddguid . '/' . $a);

                $adjunto = new Adjunto();
                $adjunto->denominacion = $a;
                $adjunto->ruta = public_path() . '/uploads/' . $a;
                $adjunto->url = '/uploads/' . $adjunto->denominacion;
                $adjunto->extension = $partes_ruta['extension'];

                copy(public_path() . '/tmpDocs/' . $request->hddguid . '/' . $a, public_path() . '/uploads/' . $a);

                $adjunto->save();

                //die (print_r($adjunto));

                $r->adjuntos()->attach($adjunto->id);

            }
        }

        return redirect('getRadicado');
    }

    public function GuardarEditarRegistro(Request $request)
    {
        $r = Radicado::find($request->hddID);
        $r->asunto = $request->asunto;
        $r->descripcion = html_entity_decode($request->descripcion, ENT_QUOTES, 'UTF-8');
        $r->id_tipo_radicado = $request->id_tipo_radicado;
        $r->id_area = $request->id_area;
        $r->id_usuario = Auth::user()->id;
        $r->id_estado = 1;

        if ($r->codigo == null || $r->codigo == "") {
            $r->codigo = $this->GeneraCodigo();
        }

        $r->save();

        $sol = explode(',', $request->hddSol);
        $sac = $r->solicitantes;

        foreach ($sac as $a) {
            $encontro = false;

            foreach ($sol as $s) {
                if ($a->id == $s) {
                    $encontro = true;
                    break;
                }
            }

            if (!$encontro) {
                $r->solicitantes()->detach($a->id);
            }

        }

        $sac = $r->solicitantes;

        foreach ($sol as $s) {
            $encontro = false;
            foreach ($sac as $a) {

                if ($a->id == $s) {
                    $encontro = true;
                    break;
                }

            }
            if (!$encontro) {
                $r->solicitantes()->attach($s);
            }
        }

        /*
        if (isset($_FILES['adjuntos'])) {

        foreach ($request->file('adjuntos') as $f) {

        $adjunto = new Adjunto();
        $adjunto->denominacion = $f->getClientOriginalName();
        $adjunto->ruta = base_path() . '/public/uploads/' . $f->getClientOriginalName();
        $adjunto->url = '/uploads/' . $adjunto->denominacion;
        $adjunto->extension = $f->getClientOriginalExtension();

        $f->move(
        base_path() . '/public/uploads/', $f->getClientOriginalName()
        );

        $adjunto->save();

        $r->adjuntos()->attach($adjunto->id);

        }

        }*/

        $archivos = scandir(public_path() . '/tmpDocs/' . $request->hddguid);

        foreach ($archivos as $a) {
            if ($a != '.' && $a != '..') {

                $partes_ruta = pathinfo(public_path() . '/tmpDocs/' . $request->hddguid . '/' . $a);

                $adjunto = new Adjunto();
                $adjunto->denominacion = $a;
                $adjunto->ruta = public_path() . '/uploads/' . $a;
                $adjunto->url = '/uploads/' . $adjunto->denominacion;
                $adjunto->extension = $partes_ruta['extension'];

                copy(public_path() . '/tmpDocs/' . $request->hddguid . '/' . $a, public_path() . '/uploads/' . $a);

                $adjunto->save();

                $r->adjuntos()->attach($adjunto->id);
            }
        }

        return redirect('getRadicado');
    }

    private function GeneraCodigo()
    {
        $generado = "";

        $posibles = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        $ultimo = "";

        for ($i = 1; $i <= 10; $i++) {
            $r = rand(0, strlen($posibles) - 1);
            $letra = substr($posibles, $r, 1);
            if ($letra == $ultimo) {
                $i = $i - 1;
            } else {
                $ultimo = $letra;
                $generado .= $letra;
            }
        }

        $sql = "SELECT * FROM radicado WHERE codigo ='$generado'";

        $otros = Radicado::where('codigo', $generado);

        $existe = false;

        foreach ($otros as $d) {
            $existe = true;
        }

        if ($existe) {
            $generado = $this->GeneraCodigo();
        }

        return $generado;
    }

    public function downloadPDF($id)
    {

        $ancho = "19.4cm";

        $tramites = Tramite::where('id_radicado', $id)
            ->orderBy('created_at', 'desc')
            ->get();

        $radicado = Radicado::find($id);

        $radicado->tramites = $tramites;

        $pdf = PDF::loadView('Radicado.pdf', compact('radicado'), compact('ancho'), array('tramites' => $tramites))
            ->setPaper('letter', 'portrait');
        return $pdf->download('Radicado.pdf');

    }

    public function PDFRecibido($id)
    {

        $ancho = "19.4cm";

        $tramites = Tramite::where('id_radicado', $id)
            ->orderBy('created_at', 'desc')
            ->get();

        $radicado = Radicado::find($id);

        $radicado->tramites = $tramites;

        $pdf = PDF::loadView('Radicado.pdfR', compact('radicado'), compact('ancho'), array('tramites' => $tramites))
            ->setPaper('letter', 'portrait');
        return $pdf->download('Radicado.pdf');

    }

    public function PDFPlanilla($fInicial, $fFinal, $Areas, $Usuarios, $Nplanilla)
    {

        ini_set('memory_limit', -1);

        if ($Areas == '0') {

            if ($Usuarios == '0') {
                $rads = Radicado::where('created_at', '>=', $fInicial . '000000')
                    ->where('created_at', '<=', $fFinal . '235959')
                    ->orderBy('created_at', 'DESC')
                    ->get();
            } else {
                $rads = Radicado::where('created_at', '>=', $fInicial . '000000')
                    ->where('created_at', '<=', $fFinal . '235959')
                    ->whereIn('id_usuario', explode(",", $Usuarios))
                    ->orderBy('created_at', 'DESC')
                    ->get();
            }
        } else {

            if ($Usuarios == '0') {
                $rads = Radicado::where('created_at', '>=', $fInicial . '000000')
                    ->where('created_at', '<=', $fFinal . '235959')
                    ->whereIn('id_area', explode(",", $Areas))
                    ->orderBy('created_at', 'DESC')
                    ->get();
            } else {
                $rads = Radicado::where('created_at', '>=', $fInicial . '000000')
                    ->where('created_at', '<=', $fFinal . '235959')
                    ->whereIn('id_area', explode(",", $Areas))
                    ->whereIn('id_usuario', explode(",", $Usuarios))
                    ->orderBy('created_at', 'DESC')
                    ->get();
            }

        }

        $ancho = "30cm";

        $planilla = $Nplanilla;

        $pdf = PDF::loadView('Radicado.planilla', compact('rads', 'planilla', 'ancho'))
            ->setPaper('legal', 'landscape');

        return $pdf->download('Planilla.pdf');
    }

}
