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.dto.InstrumentRequestDto;
import com.hepl.tunefortwo.dto.LanguageRequestDto;
import com.hepl.tunefortwo.entity.Instrument;
import com.hepl.tunefortwo.entity.Language;
import com.hepl.tunefortwo.repository.LanguageRepository;
import com.hepl.tunefortwo.service.LanguageService;
import com.hepl.tunefortwo.utils.AppMessages;

import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class LanguageServiceImplement implements LanguageService {
	
	private final MongoTemplate mongoTemplate;
	private final LanguageRepository languageRepository;
	
	public LanguageServiceImplement(LanguageRepository languageRepository, MongoTemplate mongoTemplate) {
		super();
		this.languageRepository = languageRepository;
		this.mongoTemplate = mongoTemplate;
	}
    @Override
	public Language saveLanugae(LanguageRequestDto data) {
		log.info("save Language");
		Language existingLanguage = languageRepository.findByName(data.getName());
		if(existingLanguage != null) {
			throw new IllegalArgumentException(AppMessages.LANGUAGE_ALREADY_EXISTED + "name :" + data.getName());
		}
		Language language = new Language();
		language.setName(data.getName());
	    language.setPrice(data.getPrice());
		return languageRepository.save(language);
	}
    
    @Override
	public java.util.List<Language> getAllLanguage() {
		log.info("Get all Language");
		return languageRepository.findAll();
	}
	
	@Override
	public java.util.List<Language> getAllLanguageByActive() {
		log.info("Get all Language");
		return languageRepository.findActiveLanguage();
	}
	
	@Override
	public Language getLanguageById(String id) {
		log.info("");
		Language language = languageRepository.findById(id)
				.orElseThrow(() -> new ResponseStatusException(HttpStatus.BAD_REQUEST, AppMessages.RESOURCE_NOT_FOUND));
		return language;
	}
	
	@Override
	public void updateActionControlStatus(AccessControlStatus status, String id) {
		log.info("Change action status .. {}", id);
		languageRepository.updateAccessControlStatus(id, status.toString(), mongoTemplate);
	}
	
	@Override
	public void updateLanguage(LanguageRequestDto requestDto, String id) {
		log.info("Updating instrument with ID: {}", id);
		Language existingLanguage = languageRepository.findById(id)
				.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND,
						AppMessages.LANGUAGE_NOT_FOUND + "with ID: " + id));
		if (!existingLanguage.getName().equals(requestDto.getName())) {
			Language languageWithSameName = languageRepository.findByName(requestDto.getName());
			if (languageWithSameName != null && !languageWithSameName.getId().equals(id)) {
				throw new ResponseStatusException(HttpStatus.BAD_REQUEST,
						AppMessages.LANGUAGE_ALREADY_EXISTED + "name :" + requestDto.getName());
			}
		}
		existingLanguage.setName(requestDto.getName());
		existingLanguage.setPrice(requestDto.getPrice());
		languageRepository.save(existingLanguage);
	}
	@Override
	public void deleteLanguage(String id) {
		log.info("Delete Language");
		languageRepository.deleteById(id);
	}
	
	@Override
	public void deleteAllLanguage(List<String> ids) {
	    log.info("Delete all language");
	    for (String id : ids) {
	    	languageRepository.deleteById(id);
	    }
	}

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

}
