/*
 Copyright (C) 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/

import { isResourceInRequest, makeAppFSResourceException } from "../../lib-common/manifest-utils";

export type GetAppFSResourceFor = (
	resourceAppDomain: string|null|undefined, resourceName: string,
	requestingApp: string, requestingComponent: string,
) => ReturnType<web3n.shell.GetFSResource>;

export function getFSResourceCAP(
	appDomain: string, component: string,
	capsReq: web3n.caps.ShellCAPsSetting['fsResource'],
	getAppFSResourceFor: GetAppFSResourceFor
): {
	cap: web3n.shell.ShellCAPs['getFSResource'];
}|undefined {
	if (!capsReq?.otherApps && !capsReq?.thisApp) { return; }
	return {
		cap: (resourceApp, resourceName) => {
			if (resourceApp === appDomain) {
				resourceApp = undefined
			}
			if (isResourceInRequest(capsReq, resourceApp, resourceName)) {
				return getAppFSResourceFor(
					resourceApp, resourceName, appDomain, component
				);
			} else {
				throw makeAppFSResourceException(
					(!resourceApp ? appDomain : resourceApp),
					resourceName,
					appDomain, component, { notAllowed: true }
				);
			}
		}
	};
}


Object.freeze(exports);