package com.zhiqiyun.open.mvc.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zhiqiyun.open.annotation.Permission;
import com.zhiqiyun.open.core.models.bz.PassengerEquipment;
import com.zhiqiyun.open.core.models.bz.PassengerEquipmentPeople;
import com.zhiqiyun.open.core.models.user.OauthInfo;
import com.zhiqiyun.open.core.service.OauthService;
import com.zhiqiyun.open.core.service.PassengerEquipmentPeopleService;
import com.zhiqiyun.open.core.service.PassengerEquipmentService;
import com.zhiqiyun.open.core.service.SequenceService;
import com.zhiqiyun.open.mvc.Result;
import com.zhiqiyun.open.mvc.params.bz.QueryPassengerEquipmentParams;
import com.zhiqiyun.open.mvc.params.bz.SavePassengerEquipmentParams;
import com.zhiqiyun.open.utils.DateUtil;
import com.zhiqiyun.open.utils.ServletContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/bz/passenger/equipment")
public class PassengerEquipmentController {

	@Autowired
	private PassengerEquipmentService passengerEquipmentService;

	@Autowired
	private PassengerEquipmentPeopleService passengerEquipmentPeopleService;

	@Autowired
	private SequenceService sequenceService;

	@Autowired
	private OauthService oauthService;

	@Permission(value = "bz.passenger.equipment.find", tags = "查询人流采集设备")
	@PostMapping("/findPage")
	public Result findPage(@RequestBody QueryPassengerEquipmentParams params) {

		QueryWrapper<PassengerEquipment> queryWrapper = new QueryWrapper<>();

		if (params.getDataType() != null) {
			queryWrapper.eq("data_type", params.getDataType());
		}
		if (params.getBzId() != null) {
			queryWrapper.eq("bz_id", params.getBzId());
		}

		Page<PassengerEquipment> page = params.getPage();
		page.addOrder(OrderItem.desc("id"));

		Page<PassengerEquipment> resultData = this.passengerEquipmentService.page(page, queryWrapper);
		for (PassengerEquipment equipment : resultData.getRecords()) {
			QueryWrapper<PassengerEquipmentPeople> wrapper = new QueryWrapper<>();
			wrapper.eq("equipment_id", equipment.getId());
			Long inPeopleCount = this.passengerEquipmentPeopleService.count(wrapper);

			wrapper.isNotNull("out_time");
			Long outPeopleCount = this.passengerEquipmentPeopleService.count(wrapper);

			equipment.setInPeopleCount(inPeopleCount);
			equipment.setOutPeopleCount(outPeopleCount);
		}

		return Result.instance(Result.Code.SUCCESS).setData(resultData);
	}

	@Permission(value = "bz.passenger.equipment.add", tags = "保存人流采集设备")
	@PostMapping("/save")
	public Result save(@Valid @RequestBody SavePassengerEquipmentParams params) {

		this.passengerEquipmentService.save(this.buildEntity(this.sequenceService.nextId(), params));

		return Result.instance(Result.Code.MESSAGE_SUCCESS);
	}

	@Permission(value = "bz.passenger.equipment.edit", tags = "编辑人流采集设备")
	@PostMapping("/updateById")
	public Result updateById(Long id, @Valid @RequestBody SavePassengerEquipmentParams params) {

		this.passengerEquipmentService.updateById(this.buildEntity(id, params));

		return Result.instance(Result.Code.MESSAGE_SUCCESS);
	}


	private PassengerEquipment buildEntity(Long id, @Valid SavePassengerEquipmentParams params) {

		PassengerEquipment entity = new PassengerEquipment();

		BeanUtils.copyProperties(params, entity);

		OauthInfo oauthInfo = this.oauthService.getAuth(ServletContext.getAccessToken());

		entity.setCreatedTime(DateUtil.current());
		entity.setUpdatedTime(DateUtil.current());
		entity.setCreatedBy(oauthInfo.getId());
		entity.setUpdatedBy(oauthInfo.getId());

		entity.setId(id);
		return entity;
	}

	@Permission(value = "bz.passenger.equipment.delete", tags = "删除人流采集设备")
	@PostMapping("/deleteByIds")
	public Result deleteByIds(@RequestBody List<Long> ids) {
		this.passengerEquipmentService.removeByIds(ids);
		return Result.instance(Result.Code.MESSAGE_SUCCESS);
	}
}
