<?php

namespace Sigma\Flatlab\Traits;

use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Storage;

trait SubirArchivos
{
    public static $documentos_permitidos = ['doc', 'docx', 'pdf', 'odt', 'xlsx'];
    public static $imagenes_permitidas = ['jpg', 'jpeg', 'png', 'gif'];

    public function shortname()
    {
        return (new \ReflectionClass($this))->getShortName();
    }
    public function getRutaAdjuntoAttribute()
    {
        return public_path() . '/storage/' . $this->modelFolder() . '/' . $this->getTipo($this->getExt($this->adjunto)) . '/' . $this->adjunto;
    }
    private function getTipo($ext)
    {
        if (in_array($ext, self::$imagenes_permitidas)) {
            return 'fotos';
        }
        if (in_array($ext, self::$documentos_permitidos)) {
            return 'documentos';
        }
    }

    public function storage_path($filename)
    {
        return public_path() . '/storage/' . $this->modelFolder() . '/' . $this->getTipo($this->getExt($filename)) . '/' . $filename;
    }

    public function storage_folder($filename)
    {
        $carpeta = $this->modelFolder();
        $tipo = $this->getTipo($this->getExt($filename));
        return "/public/$carpeta/$tipo";
    }

    public function modelFolder()
    {
        return strtolower($this->shortname()) . 's';
    }

    public function getExt($filename)
    {
        return pathinfo($filename, PATHINFO_EXTENSION);
    }

    public function getMaxSize()
    {
        return (int)ini_get('upload_max_filesize') * 1000;
    }

    public function getPermitidos()
    {
        $all_extensions = array_merge(self::$documentos_permitidos, self::$imagenes_permitidas);
        return implode(',', $all_extensions);
    }

    public function uploadArchivo()
    {
        $validator = Validator::make(request()->all(), [
            'archivo' => 'required|file|mimes:' . $this->model->getPermitidos() . '|max:' . $this->model->getMaxSize()
        ]);
        if ($validator->fails()) {
            return response()->json(['errors' => $validator->errors()], 403);
        } else {
            $nombre = request()->nombre;
            $archivo = request()->archivo->store($this->model->storage_folder($nombre));
            return response()->json(['errors' => false, 'mensaje' => 'Archivo subido correctamente', 'archivo' => basename($archivo)], 201);
        }
    }

    public function borrarArchivo()
    {
        $nombre = request()->nombre;
        $ruta = $this->model->storage_folder($nombre);
        $archivo = "$ruta/$nombre";
        if (Storage::exists($archivo)) {
            if (Storage::delete($archivo)) {
                return response()->json(['mensaje' => 'Archivo Borrado'], 200);
            } else {
                return response()->json(['mensaje' => 'El archivo no pudo borrarse'], 404);
            }
        } else {
            return response()->json(['Archivo no encontrado'], 404);
        }
    }
}
