package com.sn.sowsysrestapi.api.controller;

import com.sn.sowsysrestapi.api.converter.ConcernConverter;
import com.sn.sowsysrestapi.api.dto.ConcernDTO;
import com.sn.sowsysrestapi.api.dto.input.ConcernInputDTO;
import com.sn.sowsysrestapi.domain.entity.Concern;
import com.sn.sowsysrestapi.domain.exception.BusinessException;
import com.sn.sowsysrestapi.domain.exception.ConcernNotFoundException;
import com.sn.sowsysrestapi.domain.repository.ConcernRepo;
import com.sn.sowsysrestapi.domain.service.ConcernService;
import com.sn.sowsysrestapi.domain.service.ReportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/api/reports/{reportId}/concerns")
public class ConcernController {

    @Autowired
    private ConcernRepo concernRepo;

    @Autowired
    private ConcernService concernService;

    @Autowired
    private ConcernConverter concernConverter;

    @Autowired
    private ReportService reportService;

    @GetMapping
    public List<ConcernDTO> findByReport(@PathVariable Long reportId){

        reportService.findOrFail(reportId);

        return concernConverter.toCollectionDTO(concernRepo.findAllByReportId(reportId));
    }

    @GetMapping("/{concernId}")
    public ConcernDTO find(@PathVariable Long reportId, @PathVariable Long concernId) {

        reportService.findOrFail(reportId);

        Concern concern = concernService.findOrFail(concernId);

        ConcernDTO concernDTO = concernConverter.toDto(concern);

        return concernDTO;

    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public ConcernDTO add(@PathVariable Long reportId,
                          @RequestBody @Valid ConcernInputDTO concernInputDTO){

        reportService.findOrFail(reportId);

        try {
            Concern concern = concernConverter.toEntity(concernInputDTO);

            return concernConverter.toDto(concernService.save(reportId, concern));

        } catch (ConcernNotFoundException e) {
            throw new BusinessException(e.getMessage());
        }

    }

    @PutMapping("/{concernId}")
    public ConcernDTO update(@PathVariable Long reportId, @PathVariable Long concernId,
                             @RequestBody @Valid ConcernInputDTO concernInputDTO){

        reportService.findOrFail(reportId);

        try {
            Concern concernPresent = concernService.findOrFail(concernId);

            concernConverter.copyToEntity(concernInputDTO, concernPresent);

            return concernConverter.toDto(concernService.save(reportId, concernPresent));

        } catch (ConcernNotFoundException e) {
            throw new BusinessException(e.getMessage());
        }
    }

    @DeleteMapping("/{concernId}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void delete(@PathVariable Long reportId, @PathVariable Long concernId){

        reportService.findOrFail(reportId);

        concernService.delete(concernId);
    }


}
