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.category.CategoryOrganization;
import com.zhiqiyun.open.core.models.user.OauthInfo;
import com.zhiqiyun.open.core.service.OauthService;
import com.zhiqiyun.open.core.service.CategoryOrganizationService;
import com.zhiqiyun.open.core.service.SequenceService;
import com.zhiqiyun.open.mvc.Result;
import com.zhiqiyun.open.mvc.params.category.QueryCategoryOrganizationParam;
import com.zhiqiyun.open.mvc.params.category.SaveCategoryOrganizationParam;
import com.zhiqiyun.open.utils.DateUtil;
import com.zhiqiyun.open.utils.ServletContext;
import org.apache.commons.lang3.StringUtils;
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;

@RestController
@RequestMapping("/category/organization")
public class CategoryOrganizationController {

    @Autowired
    private CategoryOrganizationService categoryOrganizationService;

    @Autowired
    private SequenceService sequenceService;

    @Autowired
    private OauthService oauthService;

    @Permission(value = "category.organization.find", tags = "查询文旅机构目录")
    @PostMapping("/findPage")
    public Result findPage(@RequestBody QueryCategoryOrganizationParam param) {

        QueryWrapper<CategoryOrganization> wrapper = new QueryWrapper<>();

        if (StringUtils.isNotBlank(param.getName())) {
            wrapper.like("name", param.getName());
        }
        if (StringUtils.isNotBlank(param.getSocialCode())) {
            wrapper.like("social_code", param.getSocialCode());
        }
        if (StringUtils.isNotBlank(param.getLegalPersonName())) {
            wrapper.like("legal_person_name", param.getLegalPersonName());
        }
        if (StringUtils.isNotBlank(param.getContacts())) {
            wrapper.like("contacts", param.getContacts());
        }
        if (StringUtils.isNotBlank(param.getContactNumber())) {
            wrapper.like("contact_number", param.getContactNumber());
        }
        Page<CategoryOrganization> page = param.getPage();
        page.addOrder(OrderItem.desc("id"));

        Page<CategoryOrganization> resultData = this.categoryOrganizationService.page(page, wrapper);

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

    @Permission(value = "category.organization.add", tags = "新建文旅机构目录")
    @PostMapping("/save")
    public Result save(@Valid @RequestBody SaveCategoryOrganizationParam param) throws Exception {

        CategoryOrganization entity = new CategoryOrganization();
        BeanUtils.copyProperties(param, entity);

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

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

        entity.setUpdatedTime(DateUtil.current());
        entity.setUpdatedBy(oauthInfo.getId());
        entity.setId(this.sequenceService.nextId());

        this.categoryOrganizationService.save(entity);

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

    @Permission(value = "category.organization.edit", tags = "更新文旅机构目录")
    @PostMapping("/updateById")
    public Result updateById(Long id, @Valid @RequestBody SaveCategoryOrganizationParam param) {
        CategoryOrganization entity = new CategoryOrganization();
        BeanUtils.copyProperties(param, entity);

        OauthInfo oauthInfo = this.oauthService.getAuth(ServletContext.getAccessToken());
        entity.setUpdatedBy(oauthInfo.getId());
        entity.setUpdatedTime(DateUtil.current());
        entity.setId(id);

        this.categoryOrganizationService.updateById(entity);

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

    @Permission(value = "category.organization.delete", tags = "删除文旅机构目录")
    @PostMapping("/deleteByIds")
    public Result deleteByIds(@RequestBody List<Long> ids) {
        this.categoryOrganizationService.removeByIds(ids);
        return Result.instance(Result.Code.MESSAGE_SUCCESS);
    }
}
