package com.style24.core.biz.thirdparty;

import java.net.URI;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import com.google.gson.Gson;
import com.style24.persistence.domain.KollusResult;

import lombok.extern.slf4j.Slf4j;

/**
 * CATENOID 동영상 업로드 API (Kollus)
 * 
 * @author gagamel
 * @since 2021. 4. 15
 */
@Component
@Slf4j
public class KollusApi {

	// URL
	private String apiUrl = "https://upload.kr.kollus.com/api/v1/create_url?access_token=50oytl7t11315o5l";

	// Media URL
	public static String mediaUrl = "//v.kr.kollus.com";

	@Autowired
	private RestTemplate restTemplate;

	// 카테고리
	public enum Category {
		Goods("vdv5kp67vw2y6u0k"),	// 상품
		GoodsDesc("neshlntwgt9s4bsn"),	// 상품상세
		Review("hhria1fyl0oayoi4"),	// 리뷰
		Display("fgauvtaa18pdphzu");// 전시

		private String value;

		private Category(String value) {
			this.value = value;
		}

		public String value() {
			return value;
		}
	}

	@PostConstruct
	public void init() {
		log.info("\n\n---- CATENOID Kollus initialization started ----");
		log.info("apiUrl: [{}]", apiUrl);
		log.info("\n--- CATENOID Kollus initialization completed ----\n");
	}

	/**
	 * 일회성 동영상 업로드 URL 조회
	 * @param cateNm - 카테고리명(상품:Goods, 리뷰:Review, 전시:Display)
	 * @return 동영상 업로드 URL 정보
	 * @author gagamel
	 * @since 2021. 4. 15
	 */
	public KollusResult getVideoUploadUrl(String cateNm) {
		String cateKey = KollusApi.Category.Goods.value();
		if (cateNm.equals(KollusApi.Category.GoodsDesc.name())) {
			cateKey = KollusApi.Category.GoodsDesc.value();
		} else if (cateNm.equals(KollusApi.Category.Review.name())) {
			cateKey = KollusApi.Category.Review.value();
		} else if (cateNm.equals(KollusApi.Category.Display.name())) {
			cateKey = KollusApi.Category.Display.value();
		}

		// Parameter
		MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
//		params.add("expire_time", "600");			// 만료시간. 값의 범위는 0 < expire_time <= 21600. 빈값을 보내거나 항목 자체를 제거하면 기본 600초로 설정
		params.add("category_key", cateKey);		// 업로드할 파일이 속할 카테고리키
//		params.add("title", "");					// 입력한 제목을 컨텐츠의 제목으로 강제 지정. 이 값을 보내지 않거나 빈 값으로 보내면 기본적으로 파일명이 제목으로 사용됨. is_passthrough를 1로 설정 시 원본파일명으로 지정됨.
		params.add("is_encryption_upload", "0");	// 0은 일반업로드, 1은 암호화업로드. 암호화 업로드 시 파일이 암호화 되어 Kollus의 전용 플레이어로만 재생됨.
		params.add("is_audio_upload", "0");			// 0은 비디오 업로드, 1은 음원파일 업로드
//		params.add("is_multipart_upload", "0");		// 파일의 분할 업로드를 지원하기 위한 값. 현재는 동작하지 않으며 추후 제공될 기능
		params.add("is_passthrough", "0");			// 1은 passthrough 업로드, 0은 일반 업로드
//		params.add("profile_key", "");				// is_passthrough가 1인 경우 의미가 있음. (profile_key={계정명}-pc-high). 설정->고급기능->인코딩 프로파일에서 확인 가능
//		params.add("selected_profile_key", "");		// 파일라이브의 업로드 경우에만 사용. 값 : (서비스계정키)-filelive. kollus 라이브의 파일라이브가 활성화 상태에만 유효
		log.info("params: {}", params);

		// Header
		HttpHeaders headers = new HttpHeaders();
//		headers.add("Accept", "application/xml; charset=utf-8");
//		headers.add("Content-Type", "application/xml; charset=utf-8");
		headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

		HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(params, headers);
		URI url = URI.create(apiUrl);

		// POST방식으로 호출
		ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
		log.info("responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());

		String responseJson = responseEntity.getBody();
		log.info("responseEntity.getBody(): {}", responseJson);

		if (!responseEntity.getStatusCode().equals(HttpStatus.OK)) {
			return null;
		}

		Gson gson = new Gson();
		return gson.fromJson(responseJson, KollusResult.class);
	}

}
