package com.microservices.pms.productLibrary.service;

import com.microservices.pms.productLibrary.domain.PmsProductLibraryComponent;
import com.microservices.pms.productLibrary.domain.vo.*;

import java.util.List;

/**
 * 制品库-制品Service接口
 *
 * @author otto
 * @date 2024-06-27
 */
public interface IPmsProductLibraryComponentService {
    /**
     * 查询制品库-制品
     *
     * @param id 制品库-制品主键
     * @return 制品库-制品
     */
    public PmsProductLibraryComponent selectPmsProductLibraryComponentById(Long id);

    /**
     * 查询制品库-制品列表
     *
     * @param enterpriseIdentifier 组织表示
     * @param componentSearchVo    制品库-制品
     * @param isProduct
     * @return 制品库-制品集合
     */
    public NexusComponentResultVo<List<NexusResultDataVo>> selectPmsProductLibraryComponentListByNexus(String enterpriseIdentifier, ComponentSearchVo componentSearchVo, boolean isProduct);

    /**
     * 修改制品库-制品
     *
     * @param pmsProductLibraryComponent 制品库-制品
     * @return 结果
     */
    public int updatePmsProductLibraryComponent(PmsProductLibraryComponent pmsProductLibraryComponent);

    /**
     * 创建Maven制品
     *
     * @param componentMavenInputVo Maven制品输入对象
     * @return 结果
     */
    Boolean insertMavenComponent(ComponentMavenInputVo componentMavenInputVo);


    /**
     * 创建Npm制品
     *
     * @param componentInputVo Npm制品输入对象
     * @return 结果
     */
    Boolean insertNpmComponent(ComponentInputVo componentInputVo);

    Boolean insertPypiComponent(ComponentInputVo componentInputVo);

    Boolean insertRawComponent(ComponentRawInputVo componentRawInputVo);

    /**
     * 获取制品文件详情
     *
     * @param enterpriseIdentifier 组织标识
     * @param repoName             制品库标识
     * @param assetId              制品文件标识
     * @param isProduct 是否产品库
     * @return 制品文件详情
     */
    NexusComponentResultVo<NexusAssetResultDataVo> getAssetDetailByAssetId(String enterpriseIdentifier, String repoName, String snapshotName, String assetId, boolean isProduct);

    /**
     * 获取制品详情
     *
     * @param enterpriseIdentifier 组织标识
     * @param repoName             制品库标识
     * @param componentId          制品标识
     * @param isProduct 是否产品库
     * @return 制品详情
     */
    NexusComponentResultVo<NexusComponentResultDataVo> getComponentDetailByComponentId(String enterpriseIdentifier, String repoName, String snapshotName, String componentId, boolean isProduct);

    /**
     * 获取制品文件夹是否能删除状态
     *
     * @param enterpriseIdentifier 组织标识
     * @param componentSearchVo    文件夹查询条件
     * @param isProduct 是否产品库
     * @return 能否删除状态
     */
    NexusComponentResultVo<Boolean> getCanDeleteFolderByNode(String enterpriseIdentifier, ComponentSearchVo componentSearchVo, boolean isProduct);

    NexusComponentResultVo<Boolean> getCanDeleteComponentByComponentId(String enterpriseIdentifier, String repoName, String snapshotName, String componentId, boolean isProduct);

    NexusComponentResultVo<Boolean> getCanDeleteAssetByAssetId(String enterpriseIdentifier, String repoName, String snapshotName, String assetId, boolean isProduct);

    /**
     * 删除制品
     *
     * @param enterpriseIdentifier 组织标识
     * @param repoName             制品库标识
     * @param snapshotName
     * @param assetId              制品文件
     * @param isProduct            是否产品库
     * @return 删除文件列表
     */
    NexusComponentResultVo<List<String>> deleteAssetByAssetId(String enterpriseIdentifier, String repoName, String snapshotName, String assetId, boolean isProduct);

    NexusComponentResultVo<List<String>> deleteComponentByComponentId(String enterpriseIdentifier, String repoName, String snapshotName, String componentId, boolean isProduct);

    NexusComponentResultVo<Object> deleteFolderByNode(String enterpriseIdentifier, ComponentSearchVo componentSearchVo, boolean isProduct);



    /**
     * 在数据库中查找制品文件列表
     *
     * @return 制品文件列表
     */
    List<PmsProductLibraryComponent> selectPmsProductLibraryComponentListByDatabase(Long repoId);

    /**
     * 批量锁定制品，防止重复移入
     *
     * @param productRepoId   产品库Id
     * @param componentIdList 制品Id列表
     */
    void lockComponentList(Long productRepoId, List<String> componentIdList);

    void unlockComponentList(Long productRepoId, List<String> componentIdList);

    boolean getLockComponentStatus(Long productRepoId, String assetId);
}
