<?php

namespace OCA\OrganizationFolders\Controller;

use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;

use OCA\OrganizationFolders\OrganizationProvider\OrganizationProviderManager;

class OrganizationController extends BaseController {
	use Errors;

	public function __construct(
		private OrganizationProviderManager $oganizationProviderManager,
    ) {
		parent::__construct();
	}

    #[NoAdminRequired]
	public function getOrganizationProviders(): JSONResponse {
		return $this->handleErrors(function () {
			return array_keys($this->oganizationProviderManager->getOrganizationProviders());
		});
	}

	#[NoAdminRequired]
    public function getOrganization(string $organizationProviderId, int $organizationId): JSONResponse {
		return $this->handleErrors(function () use ($organizationProviderId, $organizationId) {
			$organizationProvider = $this->oganizationProviderManager->getOrganizationProvider($organizationProviderId);

			return $organizationProvider->getOrganization($organizationId);
		});
    }

	#[NoAdminRequired]
	public function getTopLevelOrganizations(string $organizationProviderId): JSONResponse {
		return $this->handleErrors(function () use ($organizationProviderId) {
			$organizationProvider = $this->oganizationProviderManager->getOrganizationProvider($organizationProviderId);

			return $organizationProvider->getSubOrganizations();
		});
    }

	#[NoAdminRequired]
    public function getSubOrganizations(string $organizationProviderId, int $parentOrganizationId): JSONResponse {
		return $this->handleErrors(function () use ($organizationProviderId, $parentOrganizationId) {
			$organizationProvider = $this->oganizationProviderManager->getOrganizationProvider($organizationProviderId);

			return $organizationProvider->getSubOrganizations($parentOrganizationId);
		});
    }

	#[NoAdminRequired]
	public function getRoles(string $organizationProviderId, int $organizationId): JSONResponse {
		return $this->handleErrors(function () use ($organizationProviderId, $organizationId) {
			$organizationProvider = $this->oganizationProviderManager->getOrganizationProvider($organizationProviderId);

			return $organizationProvider->getRolesOfOrganization($organizationId);
		});
	}
}