package com.ascendfinalproject.warehouse.controllers;

import com.ascendfinalproject.warehouse.models.OrderResponse;
import com.ascendfinalproject.warehouse.models.Session;
import com.ascendfinalproject.warehouse.models.WarehouseOrder;
import com.ascendfinalproject.warehouse.services.SessionService;
import com.ascendfinalproject.warehouse.services.WarehouseOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping(value = "/api")
public class WarehouseController {

  @Autowired
  WarehouseOrderService orderService;

  @CrossOrigin
  @GetMapping(value = "/orders")
  public Flux<WarehouseOrder> getOrders() {
    return orderService.getOrders();
  }

  @CrossOrigin
  @GetMapping("/orders/{id}")
  public Mono<ResponseEntity> getById(@PathVariable String id) {
    return orderService.getById(id)
            .map(order -> (ResponseEntity.status(HttpStatus.OK).body(order)))
            .cast(ResponseEntity.class)
            .defaultIfEmpty(ResponseEntity.status(HttpStatus.NOT_FOUND).body(null));
  }

  @CrossOrigin
  @PostMapping(value = "/orders")
  public Mono<WarehouseOrder> createOrder(@RequestBody WarehouseOrder order) {
    return orderService.createOrder(order);
  }

  @CrossOrigin
  @PutMapping(value = "/orders/{id}")
  public Mono<WarehouseOrder> updateOrder(@RequestBody WarehouseOrder order, @PathVariable(value = "id") String id) {
    return orderService.updateOrder(order, id);
  }

  @CrossOrigin
  @DeleteMapping(value = "/orders/{id}")
  public Mono<Void> deleteOrder(@PathVariable(value = "id") String id) {
    return orderService.deleteOrder(id);
  }

  @CrossOrigin
  @DeleteMapping(value = "/orders/all")
  public Mono<Void> deleteAllOrders() {
    System.out.println("Deleted all orders");
    return orderService.deleteAllOrders();
  }

}