/*-
 * ~~~~~~licensing~~~~~~
 * schema-soap
 * ==========
 * 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.esb.platform.runtime.core.infrastructure.schema.soap;

import ru.entaxy.esb.platform.runtime.core.infrastructure.schema.api.ResourceService;
import ru.entaxy.esb.platform.runtime.core.infrastructure.schema.api.entity.Resource;
import ru.entaxy.esb.platform.runtime.core.infrastructure.schema.api.entity.ResourceInfo;
import ru.entaxy.esb.platform.runtime.core.infrastructure.schema.soap.cxf.*;
import ru.entaxy.esb.platform.runtime.core.infrastructure.schema.soap.mapper.ResourceMapper;

import java.util.Optional;

public class RegistrySchemaServiceImpl implements RegistrySchemaService {

    private ResourceService resourceService;
    private ResourceMapper resourceMapper;

    @Override
    public String loadResource(LoadResourceType request, String header) {
        try {
            Resource resource = resourceMapper.toResource(request);
            resource.setCreatedBy(header);
            return String.valueOf(resourceService.loadResource(resource));
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public String reloadResource(ResourceType request, String header) {
        try {
            Resource resource = resourceMapper.toEditedResource(request);
            resource.setEditedBy(header);
            return String.valueOf(resourceService.reloadResource(resource));
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public String removeResource(long request) {
        try {
            resourceService.removeResource(request);
            return String.valueOf(request);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public FullResourceType getResource(long id) {
        try {
            Optional<Resource> resource = resourceService.getResource(id);
            return resource.map(value -> resourceMapper.toFullResourceType(value)).orElse(null);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public String loadResourceInfo(ResourceInfoType request, String header) {
        try {
            request.setPath(preparePath(request.getPath()));
            ResourceInfo resourceInfo = resourceMapper.toResourceInfo(request);
            resourceInfo.setCreatedBy(header);
            return String.valueOf(resourceService.loadResourceInfo(resourceInfo));
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public String editResourceInfo(EditedResourceInfoFullType request, String header) {
        try {
            request.setPath(preparePath(request.getPath()));
            ResourceInfo resourceInfo = resourceMapper.editedResourceInfoFullTypeResourceInfo(request);
            resourceInfo.setEditedBy(header);
            return String.valueOf(resourceService.editResourceInfo(resourceInfo));
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public String removeResourceInfo(String request) {
        try {
            resourceService.removeResourceInfo(Long.valueOf(request));
            return request;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public ResourceInfoFullType getResourceInfo(String id) {
        try {
            Optional<ResourceInfo> resource = resourceService.getResourceInfo(Long.valueOf(id));
            return resource.map(value -> resourceMapper.toResourceInfoFullType(value)).orElse(null);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public GetResourceInfoList getResourceInfoList(GetResourceInfoListRequest request) {
        try {
            GetResourceInfoList list = new GetResourceInfoList();
            for (ResourceInfo resourceInfo : resourceService.getListResourceInfo()) {
                list.getResourceInfoFullType().add(resourceMapper.toResourceInfoFullType(resourceInfo));
            }
            return list;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public GetResourceInfoList getResourceInfoListByName(GetResourceInfoListByNameRequest request) {
        try {
            GetResourceInfoList list = new GetResourceInfoList();
            for (ResourceInfo resourceInfo : resourceService.getListResourceInfoByName(request.getName())) {
                list.getResourceInfoFullType().add(resourceMapper.toResourceInfoFullType(resourceInfo));
            }
            return list;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public GetResourceInfoList getResourceInfoListByFullName(GetResourceInfoListByFullNameRequest request) {
        try {
            GetResourceInfoList list = new GetResourceInfoList();
            for (ResourceInfo resourceInfo : resourceService.getResourceInfoByFullName(request.getFullName())) {
                list.getResourceInfoFullType().add(resourceMapper.toResourceInfoFullType(resourceInfo));
            }
            return list;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public GetResourceInfoList getResourceInfoListByPath(GetResourceInfoListByPathRequest request) {
        try {
            GetResourceInfoList list = new GetResourceInfoList();
            for (ResourceInfo resourceInfo : resourceService.getResourceInfoByPath(request.getPath())) {
                list.getResourceInfoFullType().add(resourceMapper.toResourceInfoFullType(resourceInfo));
            }
            return list;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public GetResourceInfoList getResourceInfoListByFullPath(GetResourceInfoListByFullPathRequest request) {
        try {
            GetResourceInfoList list = new GetResourceInfoList();
            for (ResourceInfo resourceInfo : resourceService.getResourceInfoByFullPath(preparePath(request.getPath()))) {
                list.getResourceInfoFullType().add(resourceMapper.toResourceInfoFullType(resourceInfo));
            }
            return list;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    @Override
    public GetResourceInfoList getResourceInfoListByNamespace(GetResourceInfoListByNamespaceRequest request) {
        try {
            GetResourceInfoList list = new GetResourceInfoList();
            for (ResourceInfo resourceInfo : resourceService.getListResourceInfoByNamespace(request.getNamespace())) {
                list.getResourceInfoFullType().add(resourceMapper.toResourceInfoFullType(resourceInfo));
            }
            return list;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    public String preparePath(String path) {
        if (path != null && !path.isEmpty() && !(path.charAt(path.length() - 1) == '/')) {
            path = path + "/";
        }
        return path;
    }

    public void setResourceService(ResourceService resourceService) {
        this.resourceService = resourceService;
    }

    public void setResourceMapper(ResourceMapper resourceMapper) {
        this.resourceMapper = resourceMapper;
    }
}
