<?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 setBackendLanguage($language): void
    {
        if (in_array($language, array_keys(\Yii::$app->params['backendTranslatedLanguages']))) {
            $user                   = $this->repository->get(\Yii::$app->user->id);
            $user->backend_language = $language;
            $this->repository->save($user);
        }
    }

    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);
    }
}