<?php

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

namespace Irstea\FileUploadBundle\Form\DataTranformer;

use Irstea\FileUploadBundle\Entity\UploadedFile;
use Irstea\FileUploadBundle\Service\FileManagerInterface;
use Rhumsaa\Uuid\Uuid;
use Symfony\Component\Form\DataTransformerInterface;
use Traversable;

/**
 * Description of UploadedFileTransformer
 */
class UploadedFileTransformer implements DataTransformerInterface
{
    /**
     *
     * @var boolean
     */
    private $multiple;

    /**
     *
     * @var FileManagerInterface
     */
    private $fileManager;

    public function __construct(FileManagerInterface $fileManager, $multiple = false)
    {
        $this->fileManager = $fileManager;
        $this->multiple = $multiple;
    }

    /**
     * {@inheritdoc}
     */
    public function reverseTransform($value)
    {
        if(!$this->multiple) {
            return $this->reverseTransformFile($value);
        }
        $result = [];
        if(is_array($value) || $value instanceof Traversable) {
            foreach($value as $index => $file) {
                $result[$index] = $this->reverseTransformFile($file);
            }
        }
        return array_filter($result);
    }

    /**
     * {@inheritdoc}
     */
    public function transform($value)
    {
        if(!$this->multiple) {
            return $this->transformFile($value);
        }
        $result = [];
        if(is_array($value) || $value instanceof Traversable) {
            foreach($value as $index => $file) {
                $result[$index] = $this->transformFile($file);
            }
        }
        return array_filter($result);
    }

    /**
     *
     * @param mixed $value
     * @return mixed
     */
    protected function transformFile($value)
    {
        return $value instanceof UploadedFile ? $value : null;
    }

    /**
     *
     * @param mixed $value
     * @return UploadedFile
     */
    protected function reverseTransformFile($value)
    {
        if(is_string($value) && Uuid::isValid($value)) {
            $value = $this->fileManager->get($value);
        }
        if($value instanceof UploadedFile) {
            if($value->isOrphelin()) {
                $value->setEtat(UploadedFile::ETAT_NORMAL);
            }
            return $value;
        }
        return null;
    }
}