package com.prudas.app.service;

import com.prudas.app.dto.CoreValueRequest;
import com.prudas.app.dto.CoreValueResponse;
import com.prudas.app.entity.CoreValue;
import com.prudas.app.exception.ResourceNotFoundException;
import com.prudas.app.repository.CoreValueRepository;
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 CoreValueService {

    private final CoreValueRepository repository;

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

    @Transactional
    public CoreValueResponse create(CoreValueRequest request) {
        CoreValue entity = CoreValue.builder().title(request.title()).description(request.description()).displayOrder(request.displayOrder()).build();
        return toResponse(repository.save(entity));
    }

    @Transactional
    public CoreValueResponse update(Long id, CoreValueRequest request) {
        CoreValue entity = repository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Core value not found: " + id));
        entity.setTitle(request.title());
        entity.setDescription(request.description());
        entity.setDisplayOrder(request.displayOrder());
        return toResponse(repository.save(entity));
    }

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

    private CoreValueResponse toResponse(CoreValue e) {
        return new CoreValueResponse(e.getId(), e.getTitle(), e.getDescription(), e.getDisplayOrder());
    }
}
