package com.salesmanager.shop.admin.controller.products;
import com.salesmanager.core.business.services.catalog.product.ProductService;
import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
import com.salesmanager.core.business.utils.ajax.AjaxResponse;
import com.salesmanager.core.model.catalog.product.Product;
import com.salesmanager.core.model.catalog.product.description.ProductDescription;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.shop.admin.controller.ControllerConstants;
import com.salesmanager.shop.admin.model.catalog.Keyword;
import com.salesmanager.shop.admin.model.web.Menu;
import com.salesmanager.shop.constants.Constants;
import com.salesmanager.shop.utils.LabelUtils;
import org.apache.commons.lang3.StringUtils;
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.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.*;
@Controller
public class ProductKeywordsController {
private static final Logger LOGGER = LoggerFactory.getLogger(ProductKeywordsController.class);
@Inject
private ProductService productService;
@Inject
LabelUtils messages;
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value={"/admin/products/product/keywords.html"}, method=RequestMethod.GET)
public String displayKeywords(@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("store", store);
model.addAttribute("product", product);
model.addAttribute("productKeyword", new Keyword());
return ControllerConstants.Tiles.Product.productKeywords;
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/product/addKeyword.html", method=RequestMethod.POST)
public String addKeyword(@Valid @ModelAttribute("productKeyword") Keyword keyword, final BindingResult bindingResult,final Model model, final HttpServletRequest request, Locale locale) throws Exception{
this.setMenu(model, request);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
Product product = productService.getById(keyword.getProductId());
model.addAttribute("store", store);
model.addAttribute("product", product);
model.addAttribute("productKeyword", new Keyword());
if(product==null || product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
return "redirect:/admin/products/products.html";
}
Set<ProductDescription> descriptions = product.getDescriptions();
ProductDescription productDescription = null;
for(ProductDescription description : descriptions) {
if(description.getLanguage().getCode().equals(keyword.getLanguageCode())) {
productDescription = description;
break;
}
}
if(productDescription==null) {
FieldError error = new FieldError("keyword","keyword",messages.getMessage("message.product.language", locale));
bindingResult.addError(error);
return ControllerConstants.Tiles.Product.productKeywords;
}
String keywords = productDescription.getMetatagKeywords();
List<String> keyWordsList = null;
if(!StringUtils.isBlank(keywords)) {
String[] splits = keywords.split(",");
keyWordsList = new ArrayList(Arrays.asList(splits));
}
if(keyWordsList==null) {
keyWordsList = new ArrayList<String>();
}
keyWordsList.add(keyword.getKeyword());
StringBuilder kwString = new StringBuilder();
for(String s : keyWordsList) {
kwString.append(s).append(",");
}
productDescription.setMetatagKeywords(kwString.toString());
Set<ProductDescription> updatedDescriptions = new HashSet<ProductDescription>();
for(ProductDescription description : descriptions) {
if(!description.getLanguage().getCode().equals(keyword.getLanguageCode())) {
updatedDescriptions.add(description);
}
}
updatedDescriptions.add(productDescription);
product.setDescriptions(updatedDescriptions);
productService.update(product);
model.addAttribute("success","success");
return ControllerConstants.Tiles.Product.productKeywords;
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/product/removeKeyword.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> removeKeyword(@RequestParam("id") long productId, HttpServletRequest request, HttpServletResponse response, Locale locale) {
String code = request.getParameter("code");
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
AjaxResponse resp = new AjaxResponse();
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
try {
//parse code i,lang (0,en)
String ids[] = code.split(",");
String languageCode = ids[1];
int index = Integer.parseInt(ids[0]);
Product product = productService.getById(productId);
if(product==null) {
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorString("Product id is not valid");
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorString("Product id is not valid");
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
Set<ProductDescription> descriptions = product.getDescriptions();
Set<ProductDescription> editedDescriptions = new HashSet<ProductDescription>();
for(ProductDescription description : descriptions) {
Language lang = description.getLanguage();
if(!lang.getCode().equals(languageCode)){
editedDescriptions.add(description);
continue;
}
List<String> keyWordsList = new ArrayList<String>();
String keywords = description.getMetatagKeywords();
if(!StringUtils.isBlank(keywords)) {
String splitKeywords[] = keywords.split(",");
for(int i = 0; i < splitKeywords.length; i++) {
if(i!=index) {
keyWordsList.add(splitKeywords[i]);
}
}
}
StringBuilder kwString = new StringBuilder();
for(String s : keyWordsList) {
kwString.append(s).append(",");
}
description.setMetatagKeywords(kwString.toString());
editedDescriptions.add(description);
}
product.setDescriptions(editedDescriptions);
productService.update(product);
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);
}
@SuppressWarnings("unchecked")
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/product/keywords/paging.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> pageKeywords(HttpServletRequest request, HttpServletResponse response) {
String sProductId = request.getParameter("id");
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
AjaxResponse resp = new AjaxResponse();
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
Long productId;
Product product = null;
try {
productId = Long.parseLong(sProductId);
} catch (Exception e) {
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorString("Product id is not valid");
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
try {
product = productService.getById(productId);
if(product==null) {
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorString("Product id is not valid");
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorString("Product id is not valid");
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
@SuppressWarnings("rawtypes")
Set<ProductDescription> descriptions = product.getDescriptions();
for(ProductDescription description : descriptions) {
Language lang = description.getLanguage();
String keywords = description.getMetatagKeywords();
if(!StringUtils.isBlank(keywords)) {
String splitKeywords[] = keywords.split(",");
for(int i = 0; i < splitKeywords.length; i++) {
Map entry = new HashMap();
entry.put("language", lang.getCode());
String keyword = splitKeywords[i];
StringBuilder code = new StringBuilder();
code.append(i).append(",").append(lang.getCode());
entry.put("code", code.toString());
entry.put("keyword", keyword);
resp.addDataEntry(entry);
}
}
}
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
} catch (Exception e) {
LOGGER.error("Error while paging products", e);
resp.setStatus(AjaxPageableResponse.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);
//
}
}