<?php

namespace core\services\user;

use core\entities\user\User;
use core\forms\user\UserForm;
use core\repositories\user\UserRepository;
//use shop\services\newsletter\Newsletter;
use core\services\RoleManager;
use core\services\TransactionManager;

class UserManageService
{
    private $repository;
    private $roles;
    private $transaction;
    /**
     * @var //Newsletter
     */
    //private $newsletter;

	/**
	 * UserManageService constructor.
	 *
	 * @param UserRepository $repository
	 * @param RoleManager $roles
	 * @param TransactionManager $transaction
	 */
    public function __construct(
        UserRepository $repository,
        RoleManager $roles,
        TransactionManager $transaction
        //Newsletter $newsletter
    )
    {
        $this->repository = $repository;
        $this->roles = $roles;
        $this->transaction = $transaction;
        //$this->newsletter = $newsletter;
    }

    public function create(UserForm $form): User
    {
        $user = User::create(
            $form->username,
            $form->email,
            $form->password
        );
        $this->transaction->wrap(function () use ($user, $form) {
            $this->repository->save($user);
            $this->roles->assign($user->id, $form->role);
            //$this->newsletter->subscribe($user->email);
        });
        return $user;
    }

    public function edit($id, UserForm $form): void
    {
        $user = $this->repository->get($id);
        $user->edit(
            $form->username,
            $form->email,
            $form->password
        );
        $this->transaction->wrap(function () use ($user, $form) {
            $this->repository->save($user);
            $this->roles->assign($user->id, $form->role);
        });
    }

    public function assignRole($id, $role): void
    {
        $user = $this->repository->get($id);
        $this->roles->assign($user->id, $role);
    }

    public function remove($id): void
    {
        $user = $this->repository->get($id);
        $this->repository->remove($user);
        //$this->newsletter->unsubscribe($user->email);
    }
}