<?php

declare(strict_types=1);

namespace OCA\PrideFlags\Controller;

use OCA\PrideFlags\Settings\AppSettings;

use Closure;
use OCP\IRequest;
use OCP\IConfig;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting;

class SettingsController extends Controller {

	public function __construct($appName, IRequest $request, private AppSettings $appSettings, private $userId) {
		parent::__construct($appName, $request);
	}

	#[NoAdminRequired]
	#[NoCSRFRequired]
	public function get(): JSONResponse {
		return $this->makeJSONResponse(fn () => $this->appSettings->getAll($this->userId));
	}

	#[NoAdminRequired]
	public function set(string $folderVariant, string $buttonVariant): JSONResponse {
		$this->appSettings->set($this->userId, $folderVariant, $buttonVariant);
		return $this->makeJSONResponse(fn () => $this->appSettings->getAll($this->userId));
	}

	#[AuthorizedAdminSetting]
	public function setGlobal(string $folderVariant, string $buttonVariant): JSONResponse {
		$this->appSettings->setGlobal($folderVariant, $buttonVariant);
		return $this->makeJSONResponse(fn () => $this->appSettings->getGlobal());
	}

	#[NoCSRFRequired]
	public function getGlobal(): JSONResponse {
		return $this->makeJSONResponse(fn () => $this->appSettings->getGlobal());
	}

	protected function makeJSONResponse(Closure $closure): JSONResponse {
		try {
			return new JSONResponse($closure(), HTTP::STATUS_OK);
		} catch (Exception $e) {
			return new JSONResponse(['message' => $e->getMessage()], HTTP::INTERNAL_SERVER_ERROR);
		}
	}
}