package com.foreverwin.mesnac.equip.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.foreverwin.mesnac.equip.model.Equip;
import com.foreverwin.mesnac.equip.model.EquipType;
import com.foreverwin.mesnac.equip.model.EquipTypeEquip;
import com.foreverwin.mesnac.equip.service.EquipService;
import com.foreverwin.mesnac.equip.service.EquipTypeEquipService;
import com.foreverwin.mesnac.equip.service.EquipTypeService;
import com.foreverwin.mesnac.meapi.model.CustomFields;
import com.foreverwin.mesnac.meapi.service.CustomFieldsService;
import com.foreverwin.mesnac.meapi.util.StringUtils;
import com.foreverwin.modular.core.exception.BusinessException;
import com.foreverwin.modular.core.util.CommonMethods;
import com.foreverwin.modular.core.util.FrontPage;
import com.foreverwin.modular.core.util.R;
import com.foreverwin.mesnac.common.enums.HandleEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Max
 * @since 2020-10-10
 */
@RestController
@RequestMapping("/EQUIP")
public class EquipController {

    @Autowired
    public EquipService equipService;
    @Autowired
    public EquipTypeEquipService equipTypeEquipService;
    @Autowired
    public CustomFieldsService customFieldsService;
    @Autowired
    public EquipTypeService equipTypeService;

    /**
    * 根据设备查询
    * @return
    */
    @ResponseBody
    @GetMapping("/search/{equip}")
    public R getEquipById(@PathVariable("equip") String equip) {
        String site = CommonMethods.getSite();
        String handle = HandleEnum.RESOURCE.getHandle(site, equip);
        String equipType = "";
        Equip _equip = equipService.getById( handle );
        if ( _equip == null ) {
            return R.failed(null,"设备["+equip+"]不存在" );
        }
        QueryWrapper<EquipTypeEquip> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("EQUIP_BO",_equip.getHandle() );
        EquipTypeEquip  equipTypeEquip = equipTypeEquipService.getOne( queryWrapper );
        if ( equipTypeEquip != null ) {
            String equipTypeBo = equipTypeEquip.getEquipTypeBo();
            equipType = (equipTypeBo.split(":")[1]).split(",")[1];
        }
        //查询设备自定义数据
         List<CustomFields> statusList = customFieldsService.getCustomFields( handle,"STATUS" );
        String status = "";
        String department = "";
        String serialNum = "";
         if ( statusList.size() != 0 ) {
             CustomFields statusField = statusList.get(0);
             status = statusField.getValue();
         }
        List<CustomFields> departmentList = customFieldsService.getCustomFields( handle,"DEPARTMENT" );
         if ( departmentList.size() != 0 ) {
             CustomFields departmentField = departmentList.get(0);
             department = departmentField.getValue();
         }
        List<CustomFields> serialNumberList = customFieldsService.getCustomFields( handle,"SERIAL_NUMBER" );
        if ( serialNumberList.size() != 0 ) {
            CustomFields serialNumberField = serialNumberList.get(0);
            serialNum = serialNumberField.getValue();
        }
        _equip.setEquipType( equipType );
        _equip.setStatus( status );
        _equip.setDepartment( department );
        _equip.setSerialNumber( serialNum );
        return R.ok( _equip );
    }

    /**
     * 设备弹出框
     * @return
     */
    @ResponseBody
    @GetMapping("")
    public R getEquipList(Equip equip){
        String site = CommonMethods.getSite();
        equip.setSite( site );
        List<Equip> result;
        QueryWrapper<Equip> queryWrapper = new QueryWrapper<>();
        queryWrapper.setEntity(equip);
        result = equipService.list(queryWrapper);
        Collections.sort(result);
        return R.ok(result);
    }
    /*//设备弹出框：设备信息按分页进行展示
    @ResponseBody
    @GetMapping("")
    public R getEquipList(FrontPage<Equip> frontPage, Equip equip){
        String site = CommonMethods.getSite();
        equip.setSite( site );
        QueryWrapper<Equip> queryWrapper = new QueryWrapper<>();
        queryWrapper.setEntity(equip);
        IPage<Equip> result;
        result = equipService.page(frontPage.getPagePlus(), queryWrapper);
        return R.ok(result);
    }*/

    /**
     * 保存
     * @param equip  传递的实体
     * @return  null 失败  实体成功
     */
    @ResponseBody
    @PostMapping("/save")
    public R save(@RequestBody Equip equip) {
        String site = CommonMethods.getSite();
        //校验设备类型是否存在  2020/12/04
        String equipType = equip.getEquipType();
        if ( StringUtils.notEmpty( equipType ) ) {
            QueryWrapper<EquipType> queryWrapper = new QueryWrapper<>();
            EquipType et = new EquipType();
            et.setSite(site);
            et.setEquipType( equipType );
            queryWrapper.setEntity(et);
            EquipType _et = equipTypeService.getOne( queryWrapper );
            if ( _et == null ) {
                throw BusinessException.build("设备类型不存在："+equipType);
            }
        }
        //-----------------------------------------------------------------------------------------------
        String handle = equip.getHandle();
        String equipName  = equip.getResrce();
        String resourceHandle = HandleEnum.RESOURCE.getHandle(site, equipName);
        equip.setHandle( resourceHandle );
        String status = equip.getStatusBo();
        String statusBo = HandleEnum.STATUS.getHandle(site, status);
        equip.setSite( site );
        equip.setStatusBo( statusBo );
        equip.setCreatedDateTime( new Date() );
        equip.setModifiedDateTime( new Date() );
        //判断是更新还是新增  2020/12/01
        Equip ep =equipService.getById( resourceHandle );
        if (  ep != null && !ep.getHandle().equals(handle) ) {
            throw BusinessException.build(equipName+" 已存在，请先检索");
        }
        //删除原先设备类型
        QueryWrapper<EquipTypeEquip> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("EQUIP_BO", resourceHandle );
        equipTypeEquipService.remove( queryWrapper );
        //保存设备类型设备
        String resourceType = equip.getEquipType();
        if ( resourceType != null && !resourceType.equals("")) {
            String resourceTypeHandle = HandleEnum.RESOURCE_TYPE.getHandle(site, resourceType);
//            String resourceTypeResourceHandle = HandleUtil.buildResourceTypeResourceHandle(resourceTypeHandle, resourceHandle);
            String resourceTypeResourceHandle = HandleEnum.RESOURCE_TYPE_RESOURCEBO.getHandle(resourceTypeHandle,resourceHandle);
            EquipTypeEquip equipTypeEquip = new EquipTypeEquip();
            equipTypeEquip.setHandle(resourceTypeResourceHandle);
            equipTypeEquip.setEquipTypeBo(resourceTypeHandle);
            equipTypeEquip.setEquipBo(resourceHandle);
            equipTypeEquipService.save(equipTypeEquip);
        }
        //保存设备自定义数据
        String _status = equip.getStatus();
        String  _serialNumber = equip.getSerialNumber();
        String _department = equip.getDepartment();
        if (StringUtils.notEmpty( _status )) {
            customFieldsService.setCustom(resourceHandle,"STATUS",_status);
        }
        if (StringUtils.notEmpty( _serialNumber )) {
            customFieldsService.setCustom(resourceHandle,"SERIAL_NUMBER",_serialNumber);
        }
        if (StringUtils.notEmpty( _department )) {
            customFieldsService.setCustom(resourceHandle,"DEPARTMENT",_department);
        }
        //保存或更新设备
        return R.ok(equipService.saveOrUpdate( equip ),"保存成功");
    }

    /**
     * 删除
     * @return
     */
    @ResponseBody
    @GetMapping("/remove/{equip}")
    public R removeById(@PathVariable("equip") String equip) {
        String site = CommonMethods.getSite();
        String handle = HandleEnum.RESOURCE.getHandle(site,equip);
        //删除与设备类型的关系
        QueryWrapper<EquipTypeEquip> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("EQUIP_BO",handle );
        equipTypeEquipService.remove( queryWrapper );
        //删除设备
        return R.ok( equipService.removeById( handle ),"删除成功" );
    }
}