package com.feeyo.net.http.util;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.List;

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

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.LifecycleRule;
import com.aliyun.oss.model.LifecycleRule.StorageTransition;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.SetBucketLifecycleRequest;
import com.feeyo.HlsCtx;

public class OssUtil {

	private final Logger LOGGER = LoggerFactory.getLogger(OssUtil.class);

	private OSSClient ossClient;
	
	private String accessKeyId;
	private String accessKeySecret;
	private String endpoint;
	private String bucketName;

	public OssUtil() {
		
		
		accessKeyId = HlsCtx.INSTANCE().getServerMap().get("oss_accessKeyId");
		accessKeySecret = HlsCtx.INSTANCE().getServerMap().get("oss_accessKeySecret");
		endpoint = HlsCtx.INSTANCE().getServerMap().get("oss_endpoint");
		bucketName = HlsCtx.INSTANCE().getServerMap().get("oss_bucketName");
		
		
		
		ossClient = new OSSClient(endpoint, accessKeyId,
				accessKeySecret);
	}

	/**
	 * 本地文件上传至oss,并删除本地文件
	 */
	public boolean uploadObject(String filePath, String fileName, long streamId) {
		boolean result = false;
		File file = new File(filePath + File.separator + fileName);
		if (file.exists()) {
			// 文件上传至阿里云OSS
			ossClient.putObject(bucketName, String.valueOf(streamId) + "/" + fileName, file);
			// 删除本地文件
			file.delete();
			result = true;
		}
		return result;
	}

	/**
	 * 上传byte数组
	 */
	public void uploadObject(byte[] mp3, String fileName, long streamId) {
		// 文件上传至阿里云OSS
		ossClient.putObject(bucketName, String.valueOf(streamId) + "/" + fileName, new ByteArrayInputStream(mp3));
	}

	/**
	 * 获取OSS Object输入流
	 */
	public InputStream readObject(String fileName, long streamId) {
		OSSObject ossObject = ossClient.getObject(bucketName, String.valueOf(streamId) + "/" + fileName);
		InputStream inputStream = ossObject.getObjectContent();
		return inputStream;
	}

	/**
	 * 删除文件
	 */
	public void deleteObject(String fileName, long streamId) {
		ossClient.deleteObject(bucketName, String.valueOf(streamId) + "/" + fileName);
	}

	/**
	 * 判断object在OSS上是否存在
	 */
	public boolean doesObjectExist(String fileName, long streamId) {
		return ossClient.doesObjectExist(bucketName, String.valueOf(streamId) + "/" + fileName);
	}

	/**
	 * 获取object的大小
	 */
	public long getObjectLength(String fileName, long streamId) {
		ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucketName,
				String.valueOf(streamId) + "/" + fileName);
		return objectMetadata.getContentLength();
	}

	/**
	 * 获取object头信息
	 */
	public ObjectMetadata getObjectMetadata(String fileName, long streamId) {
		ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucketName,
				String.valueOf(streamId) + "/" + fileName);
		return objectMetadata;
	}

	/**
	 * 更新生命周期
	 */
	public void updateExpirationDays(int days) {
		// 获取生命周期规则列表
		List<LifecycleRule> list = ossClient.getBucketLifecycle(bucketName);
		if (list.size() > 0) {
			LifecycleRule lifecycleRule = list.get(0);
			List<StorageTransition> storageTransitionList = lifecycleRule.getStorageTransition();
			if (storageTransitionList.size() > 0) {
				StorageTransition storageTransition = storageTransitionList.get(0);

				// 如果原转换到归档存储的时间 与设定时间不一样,则更新
				if (storageTransition.getExpirationDays() != days) {
					storageTransition.setExpirationDays(days);

					SetBucketLifecycleRequest setBucketLifecycleRequest = new SetBucketLifecycleRequest(bucketName);
					setBucketLifecycleRequest.setLifecycleRules(list);
					ossClient.setBucketLifecycle(setBucketLifecycleRequest);
					LOGGER.info("oss life cycle set expir : " + days + " days");
				}
			}
		}
	}


	public void closeOSSClient() {
		if (ossClient != null) {
			ossClient.shutdown();
		}
	}
}