package com.bocloud.ims.interfaces.resource;

import com.alibaba.fastjson.JSONObject;
import com.bocloud.cmp.model.BatchUpdateImageParam;
import com.bocloud.cmp.model.ImgBean;
import com.bocloud.common.model.BocloudResult;
import com.bocloud.common.model.GridBean;
import com.bocloud.common.model.Pager;
import com.bocloud.common.model.RequestContext;
import com.bocloud.ims.entity.resource.CloudServer;
import com.bocloud.ims.entity.resource.Image;
import com.bocloud.ims.entity.resource.Volume;

import java.util.List;

/**
 * 镜像实现类接口
 *
 * @author DZG
 * @since V1.0 2016年9月12日
 */
public interface ImageService {

	/**
	 * 查询镜像列表
	 *
	 * @param page
	 * @param rows
	 * @param params
	 * @param sorter
	 * @param simple
	 * @param condition
	 * @param user
	 * @return
	 */
	BocloudResult list(Pager pager, RequestContext context);

	/**
	 * 详情
	 *
	 * @param id
	 * @return
	 */
	BocloudResult<Image> detail(Long id);

	/**
	 * 删除
	 *
	 * @param id
	 * @param user
	 * @return
	 */
	BocloudResult remove(Long id, RequestContext context);

	/**
	 * 修改
	 *
	 * @param bean
	 * @param userId
	 * @return
	 */
	BocloudResult modify(ImgBean bean, Long userId);

	/**
	 * 修改,只针对数据
	 *
	 * @param bean
	 * @param userId
	 * @return
	 */
	BocloudResult update(ImgBean bean, Long userId);

	/**
	 * 创建镜像
	 *
	 * @param bean
	 * @param context
	 * @return
	 */
	BocloudResult create(Image bean, RequestContext context);

	/**
	 * 查询指定数据存储下的镜像
	 *
	 * @param storeId
	 * @return
	 */
	BocloudResult listByStoreId(Long storeId);

	/**
	 * 查询云平台下的镜像
	 *
	 * @param vendorId
	 * @return
	 */
	BocloudResult listByVendor(Long vendorId);

	/**
	 * 根据租户查询
	 *
	 * @param params
	 * @param user
	 * @return
	 */
	BocloudResult listByTenant(String params, RequestContext context);

	/**
	 * 申请创建镜像
	 *
	 * @param params
	 * @param user
	 * @return
	 */
	BocloudResult apply(String params, RequestContext context);

	/**
	 * 更新我的镜像到期时间
	 *
	 * @param resId
	 * @param months
	 * @param context
	 * @return
	 */
	BocloudResult updateExpriedTime(Long resId, Integer months, RequestContext context);

	/**
	 * 批量删除
	 *
	 * @param params
	 * @param user
	 * @return
	 */
	BocloudResult batchRemove(List<Long> ids, RequestContext context);

	/**
	 * 根据命名规则查询镜像(仅限于openstack,深交所专用)
	 *
	 * @param reg
	 * @param vendorId
	 * @return
	 */
	BocloudResult listByReg(String reg, Long vendorId);

	/**
	 * 汇总镜像数量
	 *
	 * @param userId
	 * @param projectId
	 * @param tenantId
	 * @return
	 */
	BocloudResult count(Long userId, Long projectId, Long tenantId);

	/**
	 * 判断物理机镜像是否存在
	 *
	 * @param osType
	 * @param osVersion
	 * @return
	 */
	BocloudResult imageExist(String osType, String osVersion);

	/**
	 * 根据osType跟osVersion删除物理机镜像
	 *
	 * @param osType
	 * @param osVersion
	 * @param userId
	 * @return
	 */
	BocloudResult remove(String osType, String osVersion, Long userId);

	/**
	 * 批量更新
	 *
	 * @param params
	 * @param user
	 * @return
	 */
	BocloudResult batchUpdate(BatchUpdateImageParam params, RequestContext context);

	/**
	 * 镜像共享
	 *
	 * @param params
	 * @param user
	 * @return
	 */
	BocloudResult shareImage(String params, RequestContext context);

	/**
	 * 镜像跨地域复制
	 *
	 * @param params
	 * @param user
	 * @return
	 */
	BocloudResult syncImages(String params, RequestContext context);

	/**
	 * 镜像部分修改
	 *
	 * @param id
	 * @param params
	 * @param user
	 * @param action
	 * @return
	 */
	BocloudResult patch(Long id, JSONObject params, RequestContext context, String action);

	/**
	 * 下载镜像
	 *
	 * @param id
	 * @return
	 */
	BocloudResult download(Long id);

	public BocloudResult<List<Volume>> listVolumeByImage(long imageId);

	public BocloudResult<GridBean<CloudServer>> listServerByImage(long imageId, Pager pager);

	default BocloudResult isoList() {
		return new BocloudResult(false, ImageService.class.getSimpleName() + "的isoList方法未实现");
	}

	BocloudResult condition(String condition, RequestContext context);

	/***
	 * 镜像复制
	 * @param bean
	 * @param context
	 * @return
	 */
	BocloudResult copy(Image bean, RequestContext context);
}
