package com.nisum.poc.api.employee.controller;

import com.nisum.poc.api.employee.dto.EmployeeDto;
import com.nisum.poc.api.employee.entity.Employee;
import com.nisum.poc.api.employee.request.EmployeeProfileRequest;
import com.nisum.poc.api.employee.response.EmployeeProfileResponse;
import com.nisum.poc.api.employee.service.IEmployeeProfileService;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping(value = "/employee")
public class EmployeeController {

    /*
    Customer Profile Service
     */
    private IEmployeeProfileService employeeProfileService;

    /**
     *
     * @param employeeProfileService
     */
    @Autowired
    public EmployeeController(IEmployeeProfileService employeeProfileService){
        this.employeeProfileService = employeeProfileService;
    }

    /**
     *
     * @param employeeProfileRequest
     * @return
     */
    @PostMapping(value = "/v1/profile")
    public Mono<Employee> createCustomer(@RequestBody EmployeeProfileRequest employeeProfileRequest){
        return employeeProfileService.createEmployeeProfile(serviceDtoConvertor(employeeProfileRequest));
    }

    @GetMapping(value = "/all")
    Flux<Employee> findAllEmployee(){
        return employeeProfileService.findAllEmployee();
    }


    @GetMapping(value = "/v1/{empId}/details")
    public Mono<Employee> fetchEmployeeDetailsById(@PathVariable Long empId) {
        return employeeProfileService.fetchEmployeeDetailsById(empId);

    }

    /**
     *
     * @param employeeProfileRequest
     * @return
     */
    private EmployeeDto serviceDtoConvertor(EmployeeProfileRequest employeeProfileRequest){

        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
       return  modelMapper.map(employeeProfileRequest, EmployeeDto.class);
    }
}