<?php

require_once __DIR__.'/../../vendor/autoload.php';

abstract class BaseProcedureTest extends PHPUnit\Framework\TestCase
{
    protected $app = null;
    protected $admin = null;
    protected $manager = null;
    protected $user = null;

    protected $adminUserId = 0;
    protected $managerUserId = 0;
    protected $userUserId = 0;

    protected $projectName = '';
    protected $projectId = 0;
    protected $taskTitle = 'My task';
    protected $taskId = 0;
    protected $subtaskId = 0;

    protected $groupName1 = 'My Group A';
    protected $groupName2 = 'My Group B';
    protected $groupId1;
    protected $groupId2;

    protected $username = 'test-user';
    protected $userId;

    protected function setUp(): void
    {
        $this->setUpAppClient();
        $this->setUpAdminUser();
        $this->setUpManagerUser();
        $this->setUpStandardUser();
    }

    public function setUpAppClient()
    {
        $this->app = new JsonRPC\Client(API_URL);
        $this->app->authentication('jsonrpc', API_KEY);
        $this->app->getHttpClient()->withDebug()->withTimeout(10);
    }

    public function setUpAdminUser()
    {
        $this->adminUserId = $this->getUserId('superuser');

        if (! $this->adminUserId) {
            $this->adminUserId = $this->app->createUser('superuser', 'password', 'Admin User', 'user@localhost', 'app-admin');
            $this->assertNotFalse($this->adminUserId);
        }

        $this->admin = new JsonRPC\Client(API_URL);
        $this->admin->authentication('superuser', 'password');
        $this->admin->getHttpClient()->withDebug();
    }

    public function setUpManagerUser()
    {
        $this->managerUserId = $this->getUserId('manager');

        if (! $this->managerUserId) {
            $this->managerUserId = $this->app->createUser('manager', 'password', 'Manager User', 'user@localhost', 'app-manager');
            $this->assertNotFalse($this->managerUserId);
        }

        $this->manager = new JsonRPC\Client(API_URL);
        $this->manager->authentication('manager', 'password');
        $this->manager->getHttpClient()->withDebug();
    }

    public function setUpStandardUser()
    {
        $this->userUserId = $this->getUserId('user');

        if (! $this->userUserId) {
            $this->userUserId = $this->app->createUser('user', 'password', 'Standard User', 'user@localhost', 'app-user');
            $this->assertNotFalse($this->userUserId);
        }

        $this->user = new JsonRPC\Client(API_URL);
        $this->user->authentication('user', 'password');
        $this->user->getHttpClient()->withDebug();
    }

    public function getUserId($username)
    {
        $user = $this->app->getUserByName($username);

        if (! empty($user)) {
            return $user['id'];
        }

        return 0;
    }

    public function assertCreateTeamProject()
    {
        $this->projectId = $this->app->createProject($this->projectName, 'Description');
        $this->assertNotFalse($this->projectId);
    }

    public function assertCreateUser()
    {
        $this->userId = $this->app->createUser($this->username, 'password');
        $this->assertNotFalse($this->userId);
    }

    public function assertCreateGroups()
    {
        $this->groupId1 = $this->app->createGroup($this->groupName1);
        $this->groupId2 = $this->app->createGroup($this->groupName2, 'External ID');
        $this->assertNotFalse($this->groupId1);
        $this->assertNotFalse($this->groupId2);
    }

    public function assertCreateTask()
    {
        $this->taskId = $this->app->createTask(array('title' => $this->taskTitle, 'project_id' => $this->projectId));
        $this->assertNotFalse($this->taskId);
    }

    public function assertCreateSubtask()
    {
        $this->subtaskId = $this->app->createSubtask(array(
            'task_id' => $this->taskId,
            'title' => 'subtask #1',
        ));

        $this->assertNotFalse($this->subtaskId);
    }
}
