package com.hepl.tunefortwo.repository;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
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.Aggregation;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.hepl.tunefortwo.dto.OrderTrackerDto;
import com.hepl.tunefortwo.entity.Form;
import com.mongodb.client.result.UpdateResult;

@Repository
public interface FormRepository extends MongoRepository<Form, String> {

	static final String COLLECTION_NAME = "Form";

	Form findTopByOrderByCreatedDateDesc();

	Optional<Form> findFirstByOrderByCreatedDateDesc();

	@Query("{'orderPosition': ?0}")
	List<Form> findByOrderPosition(String orderPosition);

	@Query("{ $text: { $search: :#{#query} } }")
	List<Form> findAllByTextSearch(@Param("query") String query, Sort sort);

	@Aggregation({
        "{ $addFields: { lastOrderPosition: { $arrayElemAt: [ '$orderPosition', -1 ] } } }",
        "{ $match: { 'lastOrderPosition.orderPosition': ?0 } }"
    })
    List<Form> findFormsByLastOrderPosition(String lastOrderPosition, Sort sort);
//	@Aggregation(pipeline = { "{$match: { 'phonenumber': ?0, 'orderNumber': ?1 }}",
//			"{$project: { 'orderPosition': 1, '_id': 0 }}" })
//	List<String> findOrderPositionByPhonenumberAndOrderNumber(String phonenumber, String orderNumber);
    @Aggregation(pipeline = {
            "{$match: { 'phonenumber': ?0, 'orderNumber': ?1 }}",
            "{$project: { 'orderPosition': 1, '_id': 0 }}"
        })
        List<Object> findOrderPositionByPhonenumberAndOrderNumber(String phonenumber, String orderNumber);
    
	Optional<Form> findByPhonenumber(String number);

	Optional<Form> findByOrderNumber(String number);

	Optional<Form> findById(int id);
	

	default UpdateResult updateReview(int id,String review,int rating, String image,String video, MongoTemplate mongoTemplate) {
		org.springframework.data.mongodb.core.query.Query query = new org.springframework.data.mongodb.core.query.Query()
				.addCriteria(Criteria.where("_orderNumber").is(id));
		org.springframework.data.mongodb.core.query.Update update = new org.springframework.data.mongodb.core.query.Update();
		update.set("review", review);
        update.set("rating",rating);
        update.set("image",image);
        update.set("video",video);
		return mongoTemplate.updateFirst(query, update, COLLECTION_NAME);
	}

	Optional<Form> findByPhonenumberAndOrderNumber(String number, String orderId);

//	    @Query("UPDATE Form f SET f.comments = :comments, f.deliveryDate = :deliveryDate WHERE f.orderId = :orderId")
//	    int updateCommentsAndDeliveryDateByOrderNumber(@Param("comments") String comments, @Param("deliveryDate") LocalDate deliveryDate, @Param("orderId") String orderId);

	List<Form> findByActiveStatus(String activestatus);
	
	List<Form> findByCreatedDateBetween(LocalDate startDate, LocalDate endDate);
}
