<?php declare(strict_types=1);
namespace openvk\VKAPI\Handlers;
use openvk\Web\Models\Entities\User;
use openvk\Web\Models\Repositories\Users as UsersRepo;

final class Friends extends VKAPIRequestHandler
{
	function get(int $user_id, string $fields = "", int $offset = 0, int $count = 100): object
    {
        $i = 0;
        $offset++;
        $friends = [];

        $users = new UsersRepo;

        $this->requireUser();
        
        foreach ($users->get($user_id)->getFriends($offset, $count) as $friend) {
            $friends[$i] = $friend->getId();
            $i++;
        }

        $response = $friends;

        $usersApi = new Users($this->getUser());

        if (!is_null($fields)) {
        	$response = $usersApi->get(implode(',', $friends), $fields, 0, $count, true);  // FIXME
        }

        return (object) [
            "count" => $users->get($user_id)->getFriendsCount(),
            "items" => $response
        ];
    }

    function getLists(): object
    {
    	$this->requireUser();

    	return (object) [
    		"count" => 0,
    		"items" => (array)[]
    	];
    }

    function deleteList(): int
    {
    	$this->requireUser();

    	return 1;
    }

    function edit(): int
    {
    	$this->requireUser();

    	return 1;
    }

    function editList(): int
    {
    	$this->requireUser();

    	return 1;
    }

    function add(string $user_id): int
    {
    	$this->requireUser();

    	$users = new UsersRepo;

    	$user = $users->get(intval($user_id));

    	switch ($user->getSubscriptionStatus($this->getUser())) {
    		case 0:
    			$user->toggleSubscription($this->getUser());
    			return 1;
    			break;

    		case 1:
    			$user->toggleSubscription($this->getUser());
    			return 2;
    			break;

    		case 3:
    			return 2;
    			break;
    		
    		default:
    			return 1;
    			break;
    	}
    }

    function delete(string $user_id): int
    {
    	$this->requireUser();

    	$users = new UsersRepo;

    	$user = $users->get(intval($user_id));

    	switch ($user->getSubscriptionStatus($this->getUser())) {
    		case 3:
    			$user->toggleSubscription($this->getUser());
    			return 1;
    			break;
    		
    		default:
    			fail(15, "Access denied: No friend or friend request found.");
    			break;
    	}
    }

    function areFriends(string $user_ids): array
    {
    	$this->requireUser();

    	$users = new UsersRepo;

    	$friends = explode(',', $user_ids);

    	$response = [];

    	for ($i=0; $i < sizeof($friends); $i++) { 
    		$friend = $users->get(intval($friends[$i]));

    		$status = 0;
    		switch ($friend->getSubscriptionStatus($this->getUser())) {
    			case 3:
    			case 0:
    				$status = $friend->getSubscriptionStatus($this->getUser());
    				break;
    			
    			case 1:
    				$status = 2;
    				break;

    			case 2:
    				$status = 1;
    				break;
    		}

    		$response[] = (object)[
    			"friend_status" => $friend->getSubscriptionStatus($this->getUser()),
    			"user_id" => $friend->getId()
    		];
    	}

    	return $response;
    }
}