package com.sn.sowsysrestapi.api.controller;

import com.sn.sowsysrestapi.api.converter.SuggestionConverter;
import com.sn.sowsysrestapi.api.dto.SuggestionDTO;
import com.sn.sowsysrestapi.api.dto.input.SuggestionInputDTO;
import com.sn.sowsysrestapi.domain.entity.Suggestion;
import com.sn.sowsysrestapi.domain.exception.BusinessException;
import com.sn.sowsysrestapi.domain.exception.SuggestionNotFoundException;
import com.sn.sowsysrestapi.domain.repository.SuggestionRepo;
import com.sn.sowsysrestapi.domain.service.ReportService;
import com.sn.sowsysrestapi.domain.service.SuggestionService;
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}/suggestions")
public class SuggestionController {

    @Autowired
    private SuggestionRepo suggestionRepo;

    @Autowired
    private SuggestionService suggestionService;

    @Autowired
    private SuggestionConverter suggestionConverter;

    @Autowired
    private ReportService reportService;

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

        reportService.findOrFail(reportId);

        return suggestionConverter.toCollectionDTO(suggestionRepo.findAllByReportId(reportId));
    }

    @GetMapping("/{suggestionId}")
    public SuggestionDTO find(@PathVariable Long reportId, @PathVariable Long suggestionId) {

        reportService.findOrFail(reportId);

        Suggestion suggestion = suggestionService.findOrFail(suggestionId);

        SuggestionDTO suggestionDTO = suggestionConverter.toDto(suggestion);

        return suggestionDTO;

    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public SuggestionDTO add(@PathVariable Long reportId,
                             @RequestBody @Valid SuggestionInputDTO suggestionInputDTO) {

        reportService.findOrFail(reportId);

        try {
            Suggestion suggestion = suggestionConverter.toEntity(suggestionInputDTO);

            return suggestionConverter.toDto(suggestionService.save(reportId, suggestion));

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

    }

    @PutMapping("/{suggestionId}")
    public SuggestionDTO update(@PathVariable Long reportId, @PathVariable Long suggestionId, @RequestBody @Valid SuggestionInputDTO suggestionInputDTO) {

        reportService.findOrFail(reportId);

        try {
            Suggestion suggestionPresent = suggestionService.findOrFail(suggestionId);

            suggestionConverter.copyToEntity(suggestionInputDTO, suggestionPresent);

            return suggestionConverter.toDto(suggestionService.save(reportId, suggestionPresent));

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

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

        reportService.findOrFail(reportId);

        suggestionService.delete(suggestionId);
    }


}
