package zimu.common.sites;

import java.io.RandomAccessFile;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.HashMap;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import zimu.util.HtHttpUtil;
import zimu.util.MyFileUtil;
import zimu.util.StringUtil;

public class ShooterCommon {
	static final Log logger = LogFactory.get();
	private final static int BUFFER_SIZE = 4096;
	
	public static void main(String[] args) throws Exception {
		String fileName = "E:/_tmp/mov/downsizing.2017.720p.bluray.x264-geckos.mkv";
		//fileName = "H:/_tmp/MOV/超人特工队.720p.国英台粤.mkv";
	
		JSONArray list = DownList(fileName);
		System.out.println(list.toJSONString(8));
		
		String url = list.getJSONObject(0).getJSONArray("Files").getJSONObject(0).getStr("Link");
		//HtHttpUtil.http.debug = true;
		MyFileUtil.fileWrite("E:/_tmp/mov/a.ass", HtHttpUtil.http.get(url, null,null, "https://www.shooter.cn/api/subapi.php"), "UTF-8", "");
		
	}
	public static JSONArray DownList(String fileName) throws Exception {
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("filehash", getHash(fileName));
		paramMap.put("pathinfo", StringUtil.basename(fileName));
		paramMap.put("format", "json");
		paramMap.put("lang", "Chn");
		byte[] result = HtHttpUtil.http.postBytes("https://www.shooter.cn/api/subapi.php", paramMap);
		if(result == null || result.length==0 || result[0] == -1) {
			logger.error("未查询到结果");
			return null;
		}
		return JSONUtil.parseArray(new String(result));
	}
	
	public static String getHash(String filePath) throws Exception{
		
		RandomAccessFile file = new RandomAccessFile(filePath, "r");
		long fileLength = file.length();
		
		
		long[] positions = new long[]{4096, fileLength / 3 * 2, fileLength / 3, fileLength - 8192};
		StringBuilder stringBuilder = new StringBuilder();
		for (long position : positions) {
			byte[] buffer = new byte[BUFFER_SIZE];
			if(fileLength < position) {
				file.close();
				return stringBuilder.toString();
			}
			file.seek(position);
			int realBufferSize = file.read(buffer);
			buffer = Arrays.copyOfRange(buffer, 0, realBufferSize);
			stringBuilder.append(bytesToMD5(buffer));
			stringBuilder.append(";");
		}
		file.close();
		stringBuilder.deleteCharAt(stringBuilder.length() - 1);
		return stringBuilder.toString();
	}
	
	private static String bytesToString(byte[] bytes){
		StringBuilder stringBuilder = new StringBuilder();
		for (byte b : bytes) {
			int bias = (b & 0xf0) >>> 4;
			stringBuilder.append(Integer.toHexString(bias));
			bias = b & 0xf;
			stringBuilder.append(Integer.toHexString(bias));
		}
		return stringBuilder.toString();
	}
	
	
	private static String bytesToMD5(byte[] bytes) throws Exception{
		MessageDigest messageDigest = MessageDigest.getInstance("MD5");
		byte[] buffer = messageDigest.digest(bytes);
		return bytesToString(buffer);
	}
}