package com.sn.sowsysrestapi.api.controller;

import com.sn.sowsysrestapi.api.converter.CompletedTaskConverter;
import com.sn.sowsysrestapi.api.dto.CompletedTaskDTO;
import com.sn.sowsysrestapi.api.dto.input.CompletedTaskInputDTO;
import com.sn.sowsysrestapi.domain.entity.CompletedTask;
import com.sn.sowsysrestapi.domain.exception.BusinessException;
import com.sn.sowsysrestapi.domain.exception.CompletedTaskNotFoundException;
import com.sn.sowsysrestapi.domain.repository.CompletedTaskRepo;
import com.sn.sowsysrestapi.domain.service.CompletedTaskService;
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}/completed-tasks")
public class CompletedTaskController {

    @Autowired
    private CompletedTaskRepo completedTaskRepo;

    @Autowired
    private CompletedTaskService completedTaskService;

    @Autowired
    private CompletedTaskConverter completedTaskConverter;

    @Autowired
    private ReportService reportService;

    @GetMapping
    public List<CompletedTaskDTO> listByReport(@PathVariable Long reportId){

        reportService.findOrFail(reportId);

        return completedTaskConverter.toCollectionDTO(completedTaskRepo.findAllByReportId(reportId));

    }

    @GetMapping("/{completedTaskId}")
    public CompletedTaskDTO find(@PathVariable Long reportId, @PathVariable Long completedTaskId){

        reportService.findOrFail(reportId);

        CompletedTask completedTask = completedTaskService.findOrFail(completedTaskId);

        CompletedTaskDTO completedTaskDTO = completedTaskConverter.toDto(completedTask);

        return completedTaskDTO;

    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public CompletedTaskDTO add(@PathVariable Long reportId,
                                @RequestBody @Valid CompletedTaskInputDTO completedTaskInputDTO){

        try {
            CompletedTask completedTask = completedTaskConverter.toEntity(completedTaskInputDTO);

            return completedTaskConverter.toDto(completedTaskService.save(reportId, completedTask));
        } catch (CompletedTaskNotFoundException e) {
            throw new BusinessException(e.getMessage());
        }

    }

    @PutMapping("/{completedTaskId}")
    public CompletedTaskDTO update(@PathVariable Long reportId, @PathVariable Long completedTaskId,
                                   @RequestBody @Valid CompletedTaskInputDTO completedTaskInputDTO) {

        reportService.findOrFail(reportId);

        try {
            CompletedTask completedTaskPresent = completedTaskService.findOrFail(completedTaskId);

            completedTaskConverter.copyToEntity(completedTaskInputDTO, completedTaskPresent);

            return completedTaskConverter.toDto(completedTaskService.save(reportId, completedTaskPresent));
        } catch (CompletedTaskNotFoundException e) {
            throw new BusinessException(e.getMessage());
        }

    }

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

        reportService.findOrFail(reportId);

        completedTaskService.delete(completedTaskId);
    }


}
