package com.bocloud.ims.interfaces.resource.hmc;

import com.bocloud.cmp.model.hmc.sdk.module.TrunkAdapters;
import com.bocloud.cmp.model.hmc.sdk.module.VirtualFibreChannelMappings;
import com.bocloud.cmp.model.hmc.sdk.module.VirtualIOServer;
import com.bocloud.cmp.model.hmc.sdk.module.VirtualSCSIMappings;
import com.bocloud.common.model.*;
import com.bocloud.ims.entity.resource.hmc.HmcPartition;
import com.bocloud.ims.entity.resource.hmc.HmcVirtualDisk;
import com.bocloud.ims.entity.resource.hmc.params.*;

import java.util.List;

/**
 * @author Shaolong_tan
 */
public interface HmcPartitionService {
    /**
     * 列表
     * @param pager
     * @param context
     * @return
     */
    public BocloudResult<GridBean<Long>> list(Pager pager, RequestContext context);

    /**
     * 查看HMC分区详细信息
     *
     * @param id HMC分区ID
     * @return 操作结果
     */
    public BocloudResult<HmcPartition> detail(Long id);

    /**
     * 创建HMC分区
     *
     * @param
     * @return 操作结果
     */
    public BocloudResult create(HmcPartition par, RequestContext context);

    /**
     * 修改HMC分区
     *
     * @param
     * @return 操作结果
     */
    public BocloudResult modify(HmcPartition partition, RequestContext context);

    /**
     * 更新HMC逻辑分区
     * <p>
     * 不支持vios
     *
     * @param lparId
     */
    public BocloudResult updateLpar(Long lparId, RequestContext context);

    /**
     * 删除HMC分区
     *
     * @param id the id
     * @param id the context id
     * @return the result
     */
    public BocloudResult remove(Long id, List<Long> vds, List<Long> vfcs, RequestContext context);


    /**
     * HMC逻辑分区开机（激活）
     *
     * @param id     HMC逻辑分区ID
     * @param context 操作用户唯一标识
     * @return 操作结果
     * @author sxp
     * @since Jun 12, 2018
     */
    BocloudResult powerOn(Long id, RequestContext context);

    /**
     * HMC逻辑分区关机
     *
     * @param id     HMC逻辑分区ID
     * @param context 操作用户唯一标识
     * @return 操作结果
     * @author sxp
     * @since Jun 12, 2018
     */
    BocloudResult powerOff(Long id, RequestContext context);

    /**
     * 分区重新启动
     *
     * @param id     HMC逻辑分区ID
     * @param context 操作用户唯一标识
     * @return 操作结果
     */
    BocloudResult restart(Long id, RequestContext context);

    /**
     * 更新逻辑分区的状态
     *
     * @param lpar          HMC逻辑分区
     * @param vendorUuid    云平台的uuid
     * @param description   任务描述
     * @param operateResult 操作结果
     * @return 操作结果
     * @author sxp
     * @since Jun 14, 2018
     */
    void updateStatus(HmcPartition lpar, String vendorUuid, String description, OperateResult operateResult)
           ;

    /**
     * 更新逻辑分区的状态
     *
     * @param partition     HMC逻辑分区
     * @param vendorUuid    云平台的uuid
     * @param description   任务描述
     * @param operateResult 操作结果
     * @param syncAllInfo   是否仅仅同步hmc_partition的数据
     * @return 操作结果
     */
    void syncPartition(HmcPartition partition, String vendorUuid, String description, OperateResult operateResult,
                       Boolean syncAllInfo, long userId);

    /**
     * 更新virtual scsi adapter信息
     *
     * @param partition
     * @param vendorId
     */
    public void updateVirtualScsiAdapterForLpar(HmcPartition partition, Long vendorId);

    /**
     * 更新virtual scsi adapter信息
     *
     * @param partition
     * @param vendorId
     */
    public void updateVirtualScsiAdapterForVios(HmcPartition partition, VirtualSCSIMappings virtualSCSIMappings)
           ;

    /**
     * 更新vfcMapping 只能同步非vios的
     * <p>
     * vfcMapping数据是在方法实现中通过接口查询得到的，会保存数据库，同时同步更新HmcPartition这个参数实体
     * <p>
     * 前提：lpar的uuid和id不能为空
     *
     * @param lpar     逻辑分区信息
     * @param vendorId 平台id
     */
    public void updateVirtualFibreChannelMappingForLpar(HmcPartition lpar, Long vendorId);

    /**
     * 同步vfcMapping 只能同步vios的
     * <p>
     * vfcMapping数据是通过VirtualFibreChannelMappings参数传过来的，会保存数据库，同时同步更新HmcPartition这个参数实体
     * VirtualFibreChannelMappings数据是获取的vios数据中的一部分
     *
     * @param vios     vios信息
     * @param mappings vfcMapping适配信息
     */
    public void updateVirtualFibreChannelMappingForVios(HmcPartition vios, VirtualFibreChannelMappings mappings)
           ;

    /**
     * 更新virtual scsi adapter信息
     *
     * @param partition
     * @param vendorId
     */
    public void updateNetworkAdapterForLpar(HmcPartition partition, Long vendorId);

    /**
     * 更新virtual scsi adapter信息
     *
     * @param partition
     * @param vendorId
     */
    public void updateNetworkAdapterForVios(HmcPartition partition, TrunkAdapters trunkAdapters);


// 2019-08-15 : 去掉自动获取槽号的相关功能，这个接口不需要了。暂时屏蔽。 详见PBSM-5039
//    /**
//     * 获取逻辑分区空闲的槽号
//     *
//     * @param partitionId
//     * @return
//     */
//    public BocloudResult getEmptyAdapterId(long partitionId, List<Integer> slots);

    /**
     * 获取虚拟scsi磁盘
     *
     * @param partitionId
     * @param adapterId
     * @return
     */
    public BocloudResult<List<HmcVirtualDisk>> getScsiDisk(long partitionId, int adapterId);

    /**
     * 将lpar的虚拟scsi磁盘
     *
     * @param partitionId
     */
    public void updateCloudServerDiskOfLpar(long partitionId);

    /**
     * 将vios分配的IO磁盘
     *
     * @param partitionId
     */
    public void updateCloudServerDiskOfVios(long partitionId);

    /**
     * 根据HmcPartition表更新CloudServer表
     *
     * @param partitionId
     * @return
     */
    public BocloudResult updateCloudServerByHmcPartition(long partitionId, long userId);

    /**
     * 同步vios的物理以太网适配器
     *
     * @param lpar
     * @param vios
     */
    public void updatePhysicalEthernetAdapter(HmcPartition lpar, VirtualIOServer vios);

    /**
     * 同步vios的共享以太网适配器（SEA）
     *
     * @param lpar
     * @param vios
     */
    public void updateShareEthernetAdapter(HmcPartition lpar, VirtualIOServer vios);

    /**
     * 制作HMC高可用
     * @param params
     * @param context
     * @return
     */
    public BocloudResult ha(HmcPartitionHaParams params, RequestContext context);

    /**
     * 创建VG
     * @param params
     * @param context
     * @return
     */
    public BocloudResult createVG(HmcPartitionCreateVGParams params, RequestContext context);

    /**
     * 创建LV
     * @param params
     * @param context
     * @return
     */
    public BocloudResult createLV(HmcPartitionCreateLVParams params, RequestContext context);

    /**
     * 删除VG
     * @param params
     * @param context
     * @return
     */
    public BocloudResult removeVG(HmcPartitionRemoveVGParams params, RequestContext context);

    /**
     * 删除LV
     * @param params
     * @param context
     * @return
     */
    public BocloudResult removeLV(HmcPartitionRemoveLVParams params, RequestContext context);
}
