package com.sn.sowsysrestapi.domain.service;

import com.sn.sowsysrestapi.domain.entity.NextPeriodTask;
import com.sn.sowsysrestapi.domain.entity.Report;
import com.sn.sowsysrestapi.domain.exception.EntityInUseException;
import com.sn.sowsysrestapi.domain.exception.NextPeriodTaskNotFoundException;
import com.sn.sowsysrestapi.domain.repository.NextPeriodTaskRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Service;

@Service
public class NextPeriodTaskService {

    public static final String MSG_ENTITY_IN_USE = "Next Period Task with ID %d can't be deleted." +
            " Reason: Other entity is using this entity.";

    @Autowired
    private NextPeriodTaskRepo nextPeriodTaskRepo;

    @Autowired
    private ReportService reportService;

    public NextPeriodTask save(Long reportId, NextPeriodTask nextPeriodTask) {

        Report report = reportService.findOrFail(reportId);

        nextPeriodTask.setReport(report);

        return nextPeriodTaskRepo.save(nextPeriodTask);

    }

    public void delete(Long id) {

        try {
            nextPeriodTaskRepo.deleteById(id);
            nextPeriodTaskRepo.flush();

        } catch (EmptyResultDataAccessException e) {
            throw new NextPeriodTaskNotFoundException(id);

        } catch (DataIntegrityViolationException e) {
            throw new EntityInUseException(
                    String.format(MSG_ENTITY_IN_USE, id));
        }

    }

    public NextPeriodTask findOrFail(Long id) {
        return nextPeriodTaskRepo.findById(id)
                .orElseThrow(() -> new NextPeriodTaskNotFoundException(id));
    }


}
