<?php

namespace Lc\SovBundle\Command;


use Lc\SovBundle\Model\User\UserInterface;
use Lc\SovBundle\Doctrine\EntityManager;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class CreateUserCommand extends Command
{
        private $passwordEncoder;
        private $em;

        public function __construct(UserPasswordEncoderInterface $passwordEncoder, EntityManager $entityManager)
        {
                parent::__construct();

                $this->passwordEncoder = $passwordEncoder;
                $this->em = $entityManager;
        }

        /**
         * {@inheritdoc}
         */
        protected function configure()
        {
                $this
                        ->setName('user:create')
                        ->setDescription('Create a user.')
                       ->setDefinition(array(
                                new InputArgument('email', InputArgument::REQUIRED, 'The email'),
                                new InputArgument('password', InputArgument::REQUIRED, 'The password'),
                                new InputArgument('role', InputArgument::REQUIRED, 'ROLE'),
                        ))
                        ->setHelp('');
        }

        /**
         * {@inheritdoc}
         */
        protected function execute(InputInterface $input, OutputInterface $output)
        {

                $email = $input->getArgument('email');
                $password = $input->getArgument('password');
                $role = $input->getArgument('role');

                $user = $this->em->new(UserInterface::class);
                $user->setEmail($email);
                $user->setRoles(array($role));

                $password = $this->passwordEncoder->encodePassword($user, $password);

                $user->setPassword($password);

                $this->em->create($user);
                $this->em->flush();

                $output->writeln(sprintf('Created user <comment>%s</comment>', $email));
                return Command::SUCCESS;
        }

        /**
         * {@inheritdoc}
         */
        protected function interact(InputInterface $input, OutputInterface $output)
        {
                $questions = array();

                if (!$input->getArgument('email')) {
                        $question = new Question('Email : ');
                        $question->setValidator(function ($password) {
                                if (empty($password)) {
                                        throw new \Exception('Email can not be empty');
                                }

                                return $password;
                        });
                        $questions['email'] = $question;
                }

                if (!$input->getArgument('password')) {
                        $question = new Question('Password : ');
                        $question->setValidator(function ($password) {
                                if (empty($password)) {
                                        throw new \Exception('Password can not be empty');
                                }

                                return $password;
                        });
                        $question->setHidden(true);
                        $questions['password'] = $question;
                }

                if (!$input->getArgument('role')) {
                        $question = new Question('Rôle [admin/superadmin/user] : ');
                        $question->setValidator(function ($role) {
                                if ($role == 'admin') {
                                        $role = 'ROLE_ADMIN';
                                } else if ($role == 'superadmin') {
                                        $role = 'ROLE_SUPER_ADMIN';
                                } else if ($role == 'user') {
                                        $role = 'ROLE_USER';
                                } else {
                                        throw new \Exception('Choose a role');

                                }
                                return $role;
                        });
                        $questions['role'] = $question;
                }


                foreach ($questions as $name => $question) {
                        $answer = $this->getHelper('question')->ask($input, $output, $question);
                        $input->setArgument($name, $answer);
                }
        }
}
