package com.prudas.app.service;

import com.prudas.app.dto.TestimonialRequest;
import com.prudas.app.dto.TestimonialResponse;
import com.prudas.app.entity.Testimonial;
import com.prudas.app.exception.ResourceNotFoundException;
import com.prudas.app.repository.TestimonialRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class TestimonialService {

    private final TestimonialRepository repository;

    public List<TestimonialResponse> findAll() {
        return repository.findAllByOrderByDisplayOrderAsc().stream().map(this::toResponse).toList();
    }

    @Transactional
    public TestimonialResponse create(TestimonialRequest request) {
        Testimonial entity = Testimonial.builder()
                .quote(request.quote()).authorName(request.authorName())
                .authorTitle(request.authorTitle()).displayOrder(request.displayOrder())
                .build();
        return toResponse(repository.save(entity));
    }

    @Transactional
    public TestimonialResponse update(Long id, TestimonialRequest request) {
        Testimonial entity = repository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Testimonial not found: " + id));
        entity.setQuote(request.quote());
        entity.setAuthorName(request.authorName());
        entity.setAuthorTitle(request.authorTitle());
        entity.setDisplayOrder(request.displayOrder());
        return toResponse(repository.save(entity));
    }

    @Transactional
    public void delete(Long id) {
        if (!repository.existsById(id)) {
            throw new ResourceNotFoundException("Testimonial not found: " + id);
        }
        repository.deleteById(id);
    }

    private TestimonialResponse toResponse(Testimonial e) {
        return new TestimonialResponse(e.getId(), e.getQuote(), e.getAuthorName(), e.getAuthorTitle(), e.getDisplayOrder());
    }
}
