package com.nebula.erp.inventory.controller;

import com.nebula.erp.inventory.document.StockSwagger;
import com.nebula.erp.inventory.requestmodel.StockRequest;
import com.nebula.erp.inventory.service.StockService;
import com.nebula.erp.inventory.utility.ApiResponseStructure;
import com.nebula.erp.inventory.utility.CreateLogger;
import com.nebula.erp.inventory.utility.PermissionHelper;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api/stock")
@Tag(name="Stock APIs", description="APIs for add and reduce stocks")
@StockSwagger.GlobalErrorResponse
public class StockController {

    @Autowired
    private StockService stockService;

    @Autowired
    private PermissionHelper permissionHelper;

    @Autowired
    private CreateLogger createLogger;

    private static final String path = "/stock";

    // Endpoint for adding stock
    @StockSwagger.AddStockOperation
    @PostMapping("/add")
    public ResponseEntity<ApiResponseStructure<Void>> addStock(@RequestBody StockRequest stockRequest) {
        try {
            // Check user permissions
            if (!permissionHelper.hasPermission("view-inventory")) {
                createLogger.createLogger("error", path, "POST", "Forbidden: You do not have the required permission. Please contact the administration.", "validation");
                return ResponseEntity.status(HttpStatus.FORBIDDEN).body(new ApiResponseStructure<>("error", HttpStatus.FORBIDDEN.value(), "Forbidden: You do not have the required permission. Please contact the administration.", null));
            }

            stockService.addStock(stockRequest);

            // Create the API response
            ApiResponseStructure<Void> response = new ApiResponseStructure<>("success", HttpStatus.OK.value(), "Stock added successfully", null);
            createLogger.createLogger("application", path, "POST", "Stock added successfully", "");
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            createLogger.createLogger("error", path, "POST", e.getMessage(), "runtime");
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ApiResponseStructure<>("error", HttpStatus.BAD_REQUEST.value(), e.getMessage(), null));
        }
    }

    // Endpoint for reducing stock
    @StockSwagger.ReduceStockOperation
    @PostMapping("/reduce")
    public ResponseEntity<ApiResponseStructure<List<Map<String, Object>>>> reduceStock(@RequestBody StockRequest stockRequest) {
        try {
            // Check user permissions
            if (!permissionHelper.hasPermission("view-inventory")) {
                createLogger.createLogger("error", path, "POST", "Forbidden: You do not have the required permission. Please contact the administration.", "validation");
                return ResponseEntity.status(HttpStatus.FORBIDDEN).body(new ApiResponseStructure<>("error", HttpStatus.FORBIDDEN.value(), "Forbidden: You do not have the required permission. Please contact the administration.", null));
            }

            List<Map<String, Object>> batchData = stockService.reduceStock(stockRequest);

            // Create the API response
            ApiResponseStructure<List<Map<String, Object>>> response = new ApiResponseStructure<>("success", HttpStatus.OK.value(), "Stock reduced successfully", batchData);
            createLogger.createLogger("application", path, "POST", "Stock reduced successfully", "");
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            createLogger.createLogger("error", path, "POST", e.getMessage(), "runtime");
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ApiResponseStructure<>("error", HttpStatus.BAD_REQUEST.value(), e.getMessage(), null));
        }
    }

}