<?php

namespace App\Models\Presupuestos;

class PresupuestoFicheroModel extends \App\Models\BaseModel
{
    protected $table = "presupuesto_ficheros";


    /**
     * Whether primary key uses auto increment.
     *
     * @var bool
     */
    protected $useAutoIncrement = true;


    protected $allowedFields = ["presupuesto_id", "nombre", "file_path", "upload_by", "upload_at"];
    protected $returnType = "App\Entities\Presupuestos\PresupuestoFicheroEntity";

    protected $useTimestamps = false;
    protected $useSoftDeletes = false;

    public static $labelField = "nombre";


    public function saveFileInBBDD($presupuesto_id, $filename, $extension ,$user_id) {
        try{
            $new_filename = $this->generateFileHash($filename) . '.' . $extension;
            
            $this->db->table($this->table . " t1")
                ->set('presupuesto_id', $presupuesto_id)
                ->set('nombre', $filename)
                ->set('file_path', WRITEPATH . 'uploads/presupuestos/' . $new_filename)
                ->set('upload_by', $user_id)
                ->set('upload_at', date('Y-m-d H:i:s'))
                ->insert();

            return $new_filename;
        } catch (\Exception $e) {
            return null;
        }
    }

    public function deleteFiles($presupuesto_id, $old_files = []){

        $files = $this->db
            ->table($this->table . " t1")
            ->where('presupuesto_id', $presupuesto_id)->get()->getResult();
        if($files){
            foreach($files as $file){

                // se comprueba que el $file->nombre no sea igual a ninguno de los elementos del array $old_files
                if (!in_array($file->nombre, $old_files)) {
                    if (file_exists($file->file_path)) {
                        unlink($file->file_path);
                    }

                    $this->db
                        ->table($this->table . " t1")
                        ->where('presupuesto_id', $presupuesto_id)
                        ->where('nombre', $file->nombre)
                        ->delete();
                }
            }
        }
    }


    public function getFiles($presupuesto_id){
        return $this->db
            ->table($this->table . " t1")
            ->where('presupuesto_id', $presupuesto_id)->get()->getResult();
    }
    

    /**
    * Función para convertir el nombre y extensión de un fichero en un hash único
    * usando cifrado simétrico.
    *
    * @param string $filename Nombre del fichero con extensión
    * @return string Hash encriptado del fichero
    */
    private function generateFileHash($filename) {
        return hash('sha256', $filename);
    }


}
