package com.microservices.system.api;

import com.microservices.common.core.constant.SecurityConstants;
import com.microservices.common.core.constant.ServiceNameConstants;
import com.microservices.common.core.domain.R;
import com.microservices.system.api.domain.SysDept;
import com.microservices.system.api.factory.RemoteCmsFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户服务
 *
 * @author microservices
 */
@FeignClient(contextId = "remoteZoneService", value = ServiceNameConstants.ZONE_SERVICE, fallbackFactory = RemoteCmsFallbackFactory.class)
public interface RemoteZoneService {
    /**
     * 新增组织时自动创建特色专区
     *
     * @param deptId 组织id
     * @param source 来源
     * @return 结果
     */
    @PostMapping("/zoneDetail/autoAddZoneByDept/{deptId}")
    public R<Long> autoAddZoneByDept(@PathVariable(value = "deptId") Long deptId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 修改组织时自动更新特色专区
     *
     * @param dept   组织对象
     * @param source 来源
     * @return 结果
     */
    @PutMapping("/zoneDetail/autoUpdateZoneByDept")
    public R<Boolean> autoUpdateZoneByDept(@RequestBody SysDept dept
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过专区Id获取专区详情JSON对象
     *
     * @param zoneId 专区Id
     * @param source 来源
     * @return 组织Id
     */
    @GetMapping("/zoneDetail/getZoneJSONByZoneId/{zoneId}")
    public R<String> getZoneJSONByZoneId(@PathVariable(value = "zoneId") Long zoneId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过组织Id获取专区详情JSON对象
     *
     * @param deptId 组织Id
     * @param source 来源
     * @return 组织Id
     */
    @GetMapping("/zoneDetail/getZoneJSONByDeptId/{deptId}")
    public R<String> getZoneJSONByDeptId(@PathVariable(value = "deptId") Long deptId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过组织Id获取专区详情对象
     *
     * @param deptId 组织Id
     * @param source 来源
     * @return 专区详情对象
     */
    @GetMapping("/zoneDetail/getZoneHomePageCmsSizeByDeptId/{deptId}")
    public R<Long> getZoneHomePageCmsSizeByDeptId(@PathVariable(value = "deptId") Long deptId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 检查并获取组织下的会员列表
     *
     * @param deptId  组织Id
     * @param userIds 用户Id列表
     * @param source  来源
     * @return 会员用户Id列表
     */
    @GetMapping(value = "/member/dept/{deptId}/users/{userIds}")
    public R<List<Long>> checkUsersIsMemberInDept(@PathVariable("deptId") Long deptId
            , @PathVariable("userIds") Long[] userIds
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 检查并获取用户所在组织的会员列表
     *
     * @param userId  用户Id
     * @param deptIds 组织Id列表
     * @param source  来源
     * @return 会员组织Id列表
     */
    @GetMapping(value = "/member/user/{userId}/deptIds/{deptIds}")
    public R<List<Long>> checkUserIsMemberInDepts(@PathVariable("userId") Long userId
            , @PathVariable("deptIds") Long[] deptIds
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过组织名称删除专区
     *
     * @param deptName 组织名称
     * @param source   来源
     * @return 结果
     */
    @DeleteMapping("/zoneDetail/{deptName}")
    public R<Boolean> deleteByDeptName(@PathVariable(value = "deptName") String deptName
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过组织id锁定/解锁专区资讯（0：未锁定，1：锁定）
     *
     * @param deptId     组织Id
     * @param lockStatus 锁定状态（0：未锁定，1：锁定）
     * @param source     来源
     * @return 结果
     */
    @PutMapping("/zoneDetail/{deptId}/lockCms/{lockStatus}")
    public R<Boolean> lockCmsByDeptId(@PathVariable(value = "deptId") Long deptId
            , @PathVariable(value = "lockStatus") Integer lockStatus
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
