package com.prudas.app.service;

import com.prudas.app.dto.TieUpPartnerRequest;
import com.prudas.app.dto.TieUpPartnerResponse;
import com.prudas.app.entity.TieUpPartner;
import com.prudas.app.exception.ResourceNotFoundException;
import com.prudas.app.repository.TieUpPartnerRepository;
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 TieUpPartnerService {

    private final TieUpPartnerRepository repository;

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

    @Transactional
    public TieUpPartnerResponse create(TieUpPartnerRequest request) {
        TieUpPartner entity = TieUpPartner.builder().name(request.name()).logoUrl(request.logoUrl()).displayOrder(request.displayOrder()).build();
        return toResponse(repository.save(entity));
    }

    @Transactional
    public TieUpPartnerResponse update(Long id, TieUpPartnerRequest request) {
        TieUpPartner entity = repository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Partner not found: " + id));
        entity.setName(request.name());
        entity.setLogoUrl(request.logoUrl());
        entity.setDisplayOrder(request.displayOrder());
        return toResponse(repository.save(entity));
    }

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

    private TieUpPartnerResponse toResponse(TieUpPartner e) {
        return new TieUpPartnerResponse(e.getId(), e.getName(), e.getLogoUrl(), e.getDisplayOrder());
    }
}
