package com.prudas.app.service;

import com.prudas.app.dto.CaseStudyRequest;
import com.prudas.app.dto.CaseStudyResponse;
import com.prudas.app.entity.CaseStudy;
import com.prudas.app.exception.ResourceNotFoundException;
import com.prudas.app.repository.CaseStudyRepository;
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 CaseStudyService {

    private final CaseStudyRepository repository;

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

    @Transactional
    public CaseStudyResponse create(CaseStudyRequest request) {
        CaseStudy entity = CaseStudy.builder()
                .title(request.title()).summary(request.summary())
                .imageUrl(request.imageUrl()).videoUrl(request.videoUrl())
                .displayOrder(request.displayOrder())
                .build();
        return toResponse(repository.save(entity));
    }

    @Transactional
    public CaseStudyResponse update(Long id, CaseStudyRequest request) {
        CaseStudy entity = repository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Case study not found: " + id));
        entity.setTitle(request.title());
        entity.setSummary(request.summary());
        entity.setImageUrl(request.imageUrl());
        entity.setVideoUrl(request.videoUrl());
        entity.setDisplayOrder(request.displayOrder());
        return toResponse(repository.save(entity));
    }

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

    private CaseStudyResponse toResponse(CaseStudy e) {
        return new CaseStudyResponse(e.getId(), e.getTitle(), e.getSummary(), e.getImageUrl(), e.getVideoUrl(), e.getDisplayOrder());
    }
}
