package com.hepl.tunefortwo.service.impl;

import java.util.List;

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;

import com.hepl.tunefortwo.dto.AccessControlStatus;
import com.hepl.tunefortwo.entity.Mood;
import com.hepl.tunefortwo.repository.MoodRepository;
import com.hepl.tunefortwo.service.MoodService;
import com.hepl.tunefortwo.utils.AppMessages;

import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class MoodServiceImpl implements  MoodService {
	
	private final MoodRepository moodRepository;
	
	private final MongoTemplate mongoTemplate;
	
	public MoodServiceImpl(MoodRepository moodRepository, MongoTemplate mongoTemplate) {
		this.moodRepository = moodRepository;
		this.mongoTemplate = mongoTemplate;
	}
    @Override
    public Mood saveMood(String name) {
		log.info("save Mood");
		Mood mood = new Mood(); 
		Mood existingMood =	moodRepository.findByName(name);
		if(existingMood !=null) {
			throw new IllegalArgumentException(AppMessages.MOOD_ALREADY_EXISTED + "name :" + existingMood.getName());
		}
		if(name != null) {
			mood.setName(name);
		}
		return moodRepository.save(mood);
	}
    
    @Override
	public Mood getMoodById(String id) {
		log.info("Get mood by id");
		Mood mood = moodRepository.findById(id)
				.orElseThrow(() -> new ResponseStatusException(HttpStatus.BAD_REQUEST, AppMessages.RESOURCE_NOT_FOUND));
		return mood;
	}
    
    @Override
	public List<Mood> getAllMoods() {
		log.info("Get all mood");
		return moodRepository.findAll();
	}
	
	@Override
	public List<Mood> getAllMoodsByActive() {
		log.info("Get all mood");
		return moodRepository.findActiveMood();
	}
	
	@Override
	public void updateMood(String requestDto, String id) {
		log.info("Updating mood with ID: {}", id);
		Mood existingMood = moodRepository.findById(id)
				.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND,
						AppMessages.MOOD_NOT_FOUND + "with ID: " + id));
		if (!existingMood.getName().equals(requestDto)) {
			Mood moodWithSameName = moodRepository.findByName(requestDto);
			if (moodWithSameName != null && !moodWithSameName.getId().equals(id)) {
				throw new ResponseStatusException(HttpStatus.BAD_REQUEST,
						AppMessages.MOOD_ALREADY_EXISTED + "name :" + requestDto);
			}
		}
		existingMood.setName(requestDto);
		moodRepository.save(existingMood);
	}
	
	@Override
	public void updateActionControlStatus(AccessControlStatus status, String id) {
		log.info("Change action status .. {}", id);
		moodRepository.updateAccessControlStatus(id, status.toString(), mongoTemplate);
	}
	
	@Override
	public void deleteMood(String id) {
		log.info("Delete mood");
		moodRepository.deleteById(id);
	}
	
	@Override
	public void deleteAllMood(List<String> ids) {
	    log.info("Delete all mood");
	    for (String id : ids) {
	    	moodRepository.deleteById(id);
	    }
	}

	@Override
	public void updateAllActionControlStatus(AccessControlStatus status, List<String> ids) {
		log.info("Change action status .. {} "+ ids);
		for(String id : ids) {
			moodRepository.updateAccessControlStatus(id, status.toString(), mongoTemplate);
		}
		
	}
	

}
