package com.hepl.tunefortwo.service.impl;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.core.io.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;

import com.hepl.tunefortwo.dto.GenericData;
import com.hepl.tunefortwo.dto.GenericResponse;
import com.hepl.tunefortwo.dto.WelcomeVideoDto;
import com.hepl.tunefortwo.entity.FileType;
import com.hepl.tunefortwo.entity.WelcomeVideo;
import com.hepl.tunefortwo.repository.WelcomeVideoRepository;
import com.hepl.tunefortwo.service.FileService;
import com.hepl.tunefortwo.service.WelcomeVideoService;
import com.hepl.tunefortwo.utils.AppMessages;

import jakarta.mail.MessagingException;

@Service
public class WelcomeVideoServiceImpl implements WelcomeVideoService {

	private final WelcomeVideoRepository welcomeVideoRepository;
	private final FileService fileService;
	private final FileServiceImpl fileServiceImpl;

	public WelcomeVideoServiceImpl(WelcomeVideoRepository welcomeVideoRepository, FileService fileService,FileServiceImpl fileServiceImpl) {
		this.welcomeVideoRepository = welcomeVideoRepository;
		this.fileService = fileService;
		this.fileServiceImpl = fileServiceImpl;
	}

	@Override
	public GenericResponse addWelcomeVideo(WelcomeVideoDto newWelcomeVideo) {

		WelcomeVideo newVideo = new WelcomeVideo();
		newVideo.setVideoFlag(newWelcomeVideo.isVideoFlag());
		newVideo.setVideoLink(newWelcomeVideo.getVideoLink());
		newVideo.setVideoName(newWelcomeVideo.getVideoName());
		newVideo.setVideoType(newWelcomeVideo.getVideoType());

		WelcomeVideo savedVideo = welcomeVideoRepository.save(newVideo);
		List<WelcomeVideo> welcomeVideoList = new ArrayList();
		welcomeVideoList.add(savedVideo);
		int videoCount = welcomeVideoList.size();
		GenericResponse response = new GenericResponse(true);
		GenericData data = new GenericData();
		Map<String, Object> videoMap = new HashMap<>();
		videoMap.put("count", videoCount);
		videoMap.put("welcomeVideos", welcomeVideoList);
		data.setWelcomeVideoResponse(videoMap);
		response.setData(data);
		response.setMessage("Welcome Video Added Successfully");
		return response;

	}

	@Override
	public GenericResponse updateWelcomeVideo(WelcomeVideoDto updatesToBeMade, String id) throws IOException, MessagingException {
		GenericResponse response = new GenericResponse(true);
		GenericData data = new GenericData();
		WelcomeVideo foundVideo = welcomeVideoRepository.findById(id).orElseThrow(
				() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Welcome Video with ID: " + id + " not found"));
		foundVideo.setVideoFlag(updatesToBeMade.isVideoFlag());
		if (updatesToBeMade.getVideoLink() != null) {
			foundVideo.setVideoLink(updatesToBeMade.getVideoLink());
		}
		if(updatesToBeMade.getVideoType() !=null) {
			foundVideo.setVideoType(updatesToBeMade.getVideoType());
		}
		if (updatesToBeMade.getVideoName() != null) {
			foundVideo.setVideoName(id);
		}
		if (updatesToBeMade.getVideoClip() != null) {
			String originalFilename = updatesToBeMade.getVideoClip().getOriginalFilename();
			if (originalFilename != null) {
				String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
				List<String> allowedExtensions = Arrays.asList("mp4", "mov", "wmv", "avi", "mkv");
				if (!allowedExtensions.contains(fileExtension)) {
					throw new MessagingException("Only MP4, MOV, AVI, MKV, and WMV files are allowed");
				}
			}

			String filename = fileService.uploadFile(updatesToBeMade.getVideoClip(), FileType.WELCOMEVIDEO);
			Resource file = fileService.loadAsResource(filename, FileType.WELCOMEVIDEO);
			updatesToBeMade.setVideoName(filename);
			Path filePath = Paths.get(file.getURI());
			foundVideo.setVideoName(filename);
			
		}
		
		WelcomeVideo updatedData = welcomeVideoRepository.save(foundVideo);
		if(id!=null) {
			List<WelcomeVideo> videos = welcomeVideoRepository.findAll();
			for(WelcomeVideo video : videos) {
				video.setVideoFlag(updatesToBeMade.isVideoFlag());
				welcomeVideoRepository.save(video);
			}
		}
		
		
		List<WelcomeVideo> welcomeVideoList = new ArrayList();
		welcomeVideoList.add(updatedData);
		int videoCount = welcomeVideoList.size();
		Map<String, Object> updateVideoMap = new HashMap<>();
		updateVideoMap.put("count", videoCount);
		updateVideoMap.put("welcomeVideos", welcomeVideoList);
		data.setWelcomeVideoResponse(updateVideoMap);
		response.setData(data);
		response.setMessage("Welcome Video Details Updated Successfully");
		return response;
	}

	@Override
	public GenericResponse removeAWelcomeVideo(WelcomeVideoDto videoToBeRemoved) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public GenericResponse getWelcomeVideos() {

		GenericResponse response = new GenericResponse(true);
		GenericData data = new GenericData();

		List<WelcomeVideo> allVideos = welcomeVideoRepository.findAll();
		if (allVideos.size() > 0) {
			int videoCount = allVideos.size();
			Map<String, Object> videoListMap = new HashMap<>();
			videoListMap.put("count", videoCount);
			videoListMap.put("welcomeVideos", allVideos);
			data.setWelcomeVideoResponse(videoListMap);
			response.setData(data);
			response.setMessage("Welcome Videos Found");
			return response;

		}

		response.setMessage("No welcome videos found");
		response.setStatus(false);
		return response;

	}

	@Override
	public GenericResponse serveVideo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public GenericResponse getMobileVideo() {
		GenericResponse response = new GenericResponse(true);
		GenericData data = new GenericData();
		
		List<WelcomeVideo> allVideos = welcomeVideoRepository.findByVideoType("Mobile");
		if (allVideos.size() > 0) {
			int videoCount = allVideos.size();
			Map<String, Object> videoListMap = new HashMap<>();
			videoListMap.put("count", videoCount);
			videoListMap.put("welcomeVideos", allVideos);
			data.setWelcomeVideoResponse(videoListMap);
			response.setData(data);
			response.setMessage("Welcome Videos Found");
			return response;

		}

		response.setMessage("No welcome videos found");
		response.setStatus(false);
		return response;

	}

	@Override
	public GenericResponse getWelcomeVideoById(String id) {
		GenericResponse response = new GenericResponse(true);
		GenericData data = new GenericData();
		
		WelcomeVideo foundVideo = welcomeVideoRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Welcome Video Not Found for the given Id"));
		List<WelcomeVideo> videoList = new ArrayList<>();
		videoList.add(foundVideo);
		int videoCount = videoList.size();
		Map<String, Object> videoListMap = new HashMap<>();
		videoListMap.put("count", videoCount);
		videoListMap.put("welcomeVideos", foundVideo);
		data.setWelcomeVideoResponse(videoListMap);
		response.setData(data);
		response.setMessage("Welcome Videos Found");
		return response;
		
	}

}
