package com.example.ascend.demo.database.controller;

import com.example.ascend.demo.database.model.Employee;
import com.example.ascend.demo.database.model.EmployeeResponse;
import com.example.ascend.demo.database.repository.EmployeeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;

@RestController


public class EmployeeController {
    @Autowired
    private EmployeeRepository employeeRepository;

   // @GetMapping("employees")
   // public Mono<EmployeeResponse> getEmployees() {
    //    return employeeRepository.findAll().collectList().flatMap(employees -> {
  //         return new Mono<EmployeeResponse>(EmployeeResponse.builder()
      //              .status("OK")
       //             .statusCode(HttpStatus.OK.value())
          //          .employees(employees)
         //           .message("Got Success Response")
          //          .build(), HttpStatus.OK);
      //  });


//        return new ResponseEntity<Flux<EmployeeResponse>>(Flux.just(EmployeeResponse.builder()
//                .status("OK")
//                .statusCode(HttpStatus.OK.value())
//                .employeeFlux(employeeRepository.findAll())
//                .message("Got Success Response")
//                .build()), HttpStatus.OK);
//return empList.map(empVal->EmployeeResponse.builder().
//        status("OK").statusCode("200").message("SuccessResponse").
//        singleData(empVal).build());


            @GetMapping("/employees")
            public Mono<ResponseEntity<EmployeeResponse>> getEmployees() {
                return employeeRepository.findAll()
                        .collectList()
                        .map(empList ->ResponseEntity.ok(EmployeeResponse.builder()
                                .status("OK")
                                .statusCode(HttpStatus.OK.value())
                                .employeeData(empList)
                                .message("Got Success Response")
                                .build()))
                        .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
            }


            @PostMapping("employees")
            public Mono<Employee> saveEmployee(@RequestBody Employee employee){
           return employeeRepository.save(employee);
            }

            @DeleteMapping("employees/{id}")
          public Mono<?> deleteEmployee(@PathVariable Long id){
            return employeeRepository.deleteById(id);
             }

             @PutMapping("employee/{id}")
           public  Mono<ResponseEntity<EmployeeResponse>> updateEmployee(@PathVariable Long id, @RequestBody Employee updateEmployee){
            return employeeRepository.findById(id)
                  .flatMap(existingEmployee -> {
                    existingEmployee.setEmployeeName(updateEmployee.getEmployeeName());
                    return employeeRepository.save(existingEmployee);
                }).map(updatedEmployee -> ResponseEntity.ok(EmployeeResponse.builder()
                        .status("OK")
                        .statusCode(HttpStatus.OK.value())
                        .data(updatedEmployee)
                        .message("Got Success Response")
                        .build()))
                .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));

    }

    @PostMapping(value="/")

    public Mono<ResponseEntity<EmployeeResponse>> addEmployeeByID(@RequestBody Employee employee) {
        Mono<Employee> addedEmployee = employeeRepository.save(employee);
        return addedEmployee.map(addEmp -> ResponseEntity.status(HttpStatus.OK).
                        body(EmployeeResponse.builder().
                                status("OK").statusCode(HttpStatus.OK.value()).message("Got the Success Response").
                                data(addEmp).build())).
                defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }




    }