<?php

/*
 * Copyright (C) 2015 IRSTEA
 * All rights reserved.
 */

namespace Irstea\FileUploadBundle\Listener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Gaufrette\Filesystem;
use Irstea\FileUploadBundle\Entity\UploadedFile;

/**
 * Listener qui traite les opérations sur les fichiers uploadés.
 */
class UploadedFileListener
{
    /**
     *
     * @var Filesystem
     */
    private $filesystem;

    /**
     *
     * @param Filesystem $filesystem
     */
    public function __construct(Filesystem $filesystem)
    {
        $this->filesystem = $filesystem;
    }

    /** Passe le filesystem à l'entité.
     *
     * @param UploadedFile $file
     * @param LifecycleEventArgs $event
     */
    public function postLoad(UploadedFile $file, LifecycleEventArgs $event)
    {
        $file->setFilesystem($this->filesystem);
    }

    /** Renomme le fichier disque lorsque l'on change l'attribut 'path'.
     *
     * @param UploadedFile $file
     * @param LifecycleEventArgs $event
     */
    public function postUpdate(UploadedFile $file, LifecycleEventArgs $event)
    {
        $changes = $event->getEntityManager()->getUnitOfWork()->getEntityChangeSet($file);

        if(!isset($changes['path'])) {
            return;
        }

        $this->filesystem->rename($changes['path'][0], $changes['path'][1]);
    }

    /** Supprime le fichier disque lorsque l'on supprime l'entité.
     *
     * @param UploadedFile $file
     * @param LifecycleEventArgs $event
     */
    public function postRemove(UploadedFile $file, LifecycleEventArgs $event)
    {
        $this->filesystem->delete($file->getPath());
    }
}