package com.hepl.tunefortwo.repository;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;

import com.hepl.tunefortwo.entity.Instrument;
import com.mongodb.client.result.UpdateResult;

@Repository
public interface InstrumentRepository extends MongoRepository<Instrument, String> {

	static final String COLLECTION_NAME = "instrument_master";

	Instrument findByName(String name);

	default UpdateResult updateAccessControlStatus(String id, String status, MongoTemplate mongoTemplate) {
		org.springframework.data.mongodb.core.query.Query query = new org.springframework.data.mongodb.core.query.Query()
				.addCriteria(Criteria.where("_id").is(id));
		org.springframework.data.mongodb.core.query.Update update = new org.springframework.data.mongodb.core.query.Update();
		update.set("status", status);

		return mongoTemplate.updateFirst(query, update, COLLECTION_NAME);
	}

	@Query("{ 'status': 'ACTIVE' }")
	List<Instrument> findActiveInstruments(Sort sort);
	
	 default List<Instrument> findActiveInstrumentsSortedByPrice(Sort.Direction direction) {
	        Sort sort = Sort.by(direction, "price");
	        return findAll(sort).stream()
	                .sorted(Comparator.comparing(Instrument::getPrice, direction == Sort.Direction.ASC ? Comparator.naturalOrder() : Comparator.reverseOrder()))
	                .collect(Collectors.toList());
	    }

}
