/*-
 * ~~~~~~licensing~~~~~~
 * resource-based-storage
 * ==========
 * Copyright (C) 2020 - 2025 EmDev LLC
 * ==========
 * You may not use this file except in accordance with the License Terms of the Copyright
 * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
 * rights to the Software and any copies are the property of the Copyright Holder. Unless
 * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
 * Software for commercial purposes to provide services to third parties.
 * 
 * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
 * Under no circumstances does the Copyright Holder guarantee or promise that the
 * Software provided by him will be suitable or not suitable for the specific purposes
 * of the User, that the Software will meet all commercial and personal subjective
 * expectations of the User, that the Software will work properly, without technical
 * errors, quickly and uninterruptedly.
 * 
 * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
 * to the User for any direct or indirect losses of the User, his expenses or actual
 * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
 * or damage to data, property, etc.
 * ~~~~~~/licensing~~~~~~
 */
package ru.entaxy.platform.integration.applications.storage.resource.impl;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ru.entaxy.platform.integration.applications.ApplicationStorage.ApplicationImportContent;
import ru.entaxy.platform.integration.applications.EntaxyApplication;
import ru.entaxy.platform.integration.applications.EntaxyApplicationProject;
import ru.entaxy.platform.integration.applications.exceptions.ApplicationException;
import ru.entaxy.platform.integration.applications.exceptions.ProjectException;
import ru.entaxy.platform.integration.applications.exceptions.StorageException;
import ru.entaxy.platform.integration.applications.storage.resource.impl.application.ApplicationComponent;
import ru.entaxy.platform.integration.applications.storage.resource.impl.project.ProjectComponent;

public class StorageComponent extends AbstractResourceComponent<StorageData> {

    private static final Logger log = LoggerFactory.getLogger(StorageComponent.class);

    String storageName;

    protected ProjectStorageComponent projectStorageComponent;

    protected ApplicationStorageComponent applicationStorageComponent;

    /*
    public StorageComponent(EntaxyResourceService entaxyResourceService, String storageName, String rootFolderUrl) {
        super(entaxyResourceService);
        this.storageName = storageName;
        this.rootResourceFolderUrl = rootFolderUrl;
        projectStorageComponent = new ProjectStorageComponent(entaxyResourceService, rootResourceFolderUrl);
        applicationStorageComponent = new ApplicationStorageComponent(entaxyResourceService, rootResourceFolderUrl);
    }
    */

    public StorageComponent(ResourceContext resourceContext, String storageName) {
        super(resourceContext);
        this.storageName = storageName;
        projectStorageComponent = new ProjectStorageComponent(resourceContext);
        applicationStorageComponent = new ApplicationStorageComponent(resourceContext);
    }

    @Override
    public String getComponentKey() {
        return storageName;
    }

    @Override
    public void init() {
        super.init();
        projectStorageComponent.init();
        applicationStorageComponent.init();
    }

    @Override
    protected Class<StorageData> getDataObjectClass() {
        return StorageData.class;
    }

    @Override
    protected String getRootResourceName() {
        return ".storage";
    }

    @Override
    protected StorageData createDataObject() {
        return new StorageData(storageName);
    }

    public boolean applicationExists(String applicationName) {
        return applicationStorageComponent.applicationExists(applicationName);
    }

    public List<ApplicationComponent> getApplications() {
        return applicationStorageComponent.getApplications();
    }

    public ApplicationComponent getApplication(String applicationName) {
        return applicationStorageComponent.getApplication(applicationName);
    }

    public void addApplication(EntaxyApplication application) throws ApplicationException, StorageException {
        applicationStorageComponent.addApplication(application);
    }

    public void removeApplication(EntaxyApplication application)
            throws ApplicationException, StorageException {
        applicationStorageComponent.removeApplication(application);
    }

    public ApplicationComponent createApplication(String applicationName)
            throws ApplicationException, StorageException {
        return applicationStorageComponent.createApplication(applicationName);
    }

    public ApplicationComponent createApplication(ApplicationImportContent importContent)
            throws ApplicationException, StorageException {
        return applicationStorageComponent.createApplication(importContent);
    }

    public boolean projectExists(String projectName) {
        return projectStorageComponent.projectExists(projectName);
    }

    public List<ProjectComponent> getProjects() {
        return projectStorageComponent.getProjects();
    }

    public ProjectComponent getProject(String projectName) {
        return projectStorageComponent.getProject(projectName);
    }

    public void addProject(EntaxyApplicationProject project) throws ProjectException, StorageException {
        projectStorageComponent.addProject(project);
    }

    public void removeProject(EntaxyApplicationProject project)
            throws ProjectException, StorageException {
        projectStorageComponent.removeProject(project);
    }

    public ProjectComponent createProject(String projectName)
            throws ProjectException, StorageException {
        return projectStorageComponent.createProject(projectName);
    }


}
