package com.salesmanager.shop.admin.controller.products;
import com.salesmanager.core.business.services.catalog.product.ProductService;
import com.salesmanager.core.business.services.catalog.product.file.DigitalProductService;
import com.salesmanager.core.business.utils.ajax.AjaxResponse;
import com.salesmanager.core.model.catalog.product.Product;
import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
import com.salesmanager.core.model.content.FileContentType;
import com.salesmanager.core.model.content.InputContentFile;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.shop.admin.controller.ControllerConstants;
import com.salesmanager.shop.admin.model.digital.ProductFiles;
import com.salesmanager.shop.admin.model.web.Menu;
import com.salesmanager.shop.constants.Constants;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.ByteArrayInputStream;
import java.util.*;
@Controller
public class DigitalProductController {
private static final Logger LOGGER = LoggerFactory.getLogger(DigitalProductController.class);
@Inject
private ProductService productService;
@Inject
private DigitalProductService digitalProductService;
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value={"/admin/products/digitalProduct.html"}, method=RequestMethod.GET)
public String getDigitalProduct(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
this.setMenu(model, request);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
Product product = productService.getById(productId);
if(product==null || product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
return "redirect:/admin/products/products.html";
}
model.addAttribute("product", product);
DigitalProduct digitalProduct = digitalProductService.getByProduct(store, product);
model.addAttribute("digitalProduct", digitalProduct);
return ControllerConstants.Tiles.Product.digitalProduct;
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/product/saveDigitalProduct.html", method=RequestMethod.POST)
public String saveFile(@ModelAttribute(value="productFiles") @Valid final ProductFiles productFiles, final BindingResult bindingResult,final Model model, final HttpServletRequest request) throws Exception{
this.setMenu(model, request);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
Product product = productService.getById(productFiles.getProduct().getId());
DigitalProduct digitalProduct = new DigitalProduct();
if(product==null || product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
return "redirect:/admin/products/products.html";
}
digitalProduct.setProduct(product);
model.addAttribute("product", product);
model.addAttribute("digitalProduct", digitalProduct);
if (bindingResult.hasErrors()) {
LOGGER.info( "Found {} Validation errors", bindingResult.getErrorCount());
return ControllerConstants.Tiles.Product.digitalProduct;
}
final List<InputContentFile> contentFilesList=new ArrayList<InputContentFile>();
if(CollectionUtils.isNotEmpty( productFiles.getFile() )){
LOGGER.info("Saving {} product files for merchant {}",productFiles.getFile().size(),store.getId());
for(final MultipartFile multipartFile:productFiles.getFile()){
if(!multipartFile.isEmpty()){
ByteArrayInputStream inputStream = new ByteArrayInputStream( multipartFile.getBytes() );
InputContentFile cmsContentImage = new InputContentFile();
cmsContentImage.setFileName(multipartFile.getOriginalFilename() );
cmsContentImage.setFileContentType( FileContentType.PRODUCT_DIGITAL );
cmsContentImage.setFile( inputStream );
contentFilesList.add( cmsContentImage);
}
}
if(CollectionUtils.isNotEmpty( contentFilesList )){
digitalProduct.setProductFileName(contentFilesList.get(0).getFileName());
digitalProductService.addProductFile(product, digitalProduct, contentFilesList.get(0));
//refresh digital product
digitalProduct = digitalProductService.getByProduct(store, product);
}
}
model.addAttribute("success","success");
return ControllerConstants.Tiles.Product.digitalProduct;
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/product/removeDigitalProduct.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> removeFile(@RequestParam("fileId") long fileId, HttpServletRequest request, HttpServletResponse response, Locale locale) {
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
AjaxResponse resp = new AjaxResponse();
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
try {
DigitalProduct digitalProduct = digitalProductService.getById(fileId);
//validate store
if(digitalProduct==null) {
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
Product product = digitalProduct.getProduct();
if(product.getMerchantStore().getId().intValue()!= store.getId().intValue()) {
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
digitalProductService.delete(digitalProduct);
resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
} catch (Exception e) {
LOGGER.error("Error while deleting product", e);
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorMessage(e);
}
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
private void setMenu(Model model, HttpServletRequest request) throws Exception {
//display menu
Map<String,String> activeMenus = new HashMap<String,String>();
activeMenus.put("catalogue", "catalogue");
activeMenus.put("catalogue-products", "catalogue-products");
@SuppressWarnings("unchecked")
Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
Menu currentMenu = (Menu)menus.get("catalogue");
model.addAttribute("currentMenu",currentMenu);
model.addAttribute("activeMenus",activeMenus);
//
}
}