package com.microservices.system.api;

import com.alibaba.fastjson2.JSONObject;
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.*;

/**
 * 用户服务
 *
 * @author microservices
 */
@FeignClient(contextId = "remoteCmsService", value = ServiceNameConstants.CMS_SERVICE, fallbackFactory = RemoteCmsFallbackFactory.class)
public interface RemoteCmsService {
    /**
     * 修改用户所在GItLink项目中的权限
     *
     * @param userId    用户id
     * @param oldDeptId 原组织id
     * @param newDeptId 新组织id
     * @param source    来源
     * @return 结果
     */
    @PutMapping("/project/changeRole/user/{userId}")
    public R<Boolean> changeUserRole(
            @PathVariable("userId") Long userId
            , @RequestParam("oldDeptId") Long oldDeptId
            , @RequestParam("newDeptId") Long newDeptId
            , @RequestParam("oldRoleId") Long oldRoleId
            , @RequestParam("newRoleId") Long newRoleId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过组织Id获取专区下文章数量
     *
     * @param deptId 组织id
     * @param source 来源
     * @return 结果
     */
    @GetMapping("/doc/getCmsCountByDeptId/{deptId}")
    public R<Long> getCmsCountByDeptId(@PathVariable(value = "deptId") Long deptId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过组织Id获取专区下文章阅读数量
     *
     * @param deptId 组织id
     * @param source 来源
     * @return 结果
     */
    @GetMapping("/doc/getCmsDocVisitsByDeptId/{deptId}")
    public R<Long> getCmsDocVisitsByDeptId(@PathVariable(value = "deptId") Long deptId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过组织Id获取专区下待审核文章数量
     *
     * @param deptId 组织id
     * @param source 来源
     * @return 结果
     */
    @GetMapping("/doc/getNotAuditCmsCountByDeptId/{deptId}")
    public R<Long> getNotAuditCmsCountByDeptId(@PathVariable(value = "deptId") Long deptId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过组织id获取专区对应项目
     *
     * @param deptId 组织id
     * @param source 来源
     * @return 结果 专区对应项目JSON字符串
     */
    @GetMapping("/project/getProjectByDeptId/{deptId}")
    public R<String> getProjectByDeptId(@PathVariable(value = "deptId") Long deptId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 新增特色专区时自动创建GitLink项目
     *
     * @param deptId 组织id
     * @param source 来源
     * @return 结果
     */
    @PostMapping("/project/autoAddZoneCmsProjectByDept/{deptId}}")
    public R<Long> autoAddZoneCmsProjectByDept(@PathVariable(value = "deptId") Long deptId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

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

    /**
     * 专区审核设置发生变化时自动处理项目分支保护设置
     *
     * @param userName
     * @param identifier
     * @param deptId
     * @param operationType
     * @param source
     * @return
     */
    @PutMapping("/project/autoUpdateZoneCmsProjectWhenAuditStatusChangedByDept")
    public R<Boolean> autoOperateZoneCmsProjectWhenAuditStatusChangedByDept(@RequestParam("userName") String userName,
                                                                            @RequestParam("identifier") String identifier,
                                                                            @RequestParam("deptId") Long deptId,
                                                                            @RequestParam("operationType") String operationType,
                                                                            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 初始化栏目
     *
     * @param zoneId      专区Id
     * @param cmsDirInput 栏目输入对象
     * @param source      来源
     * @return 结果
     */
    @PostMapping("/doc/initCmsDir/{zoneId}")
    public R<Object> initCmsDir(@PathVariable(value = "zoneId") Long zoneId
            , @RequestBody Object cmsDirInput
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 初始化新闻
     *
     * @param dirId          栏目Id
     * @param cmsDocInputDto 文章输入对象
     * @param source         来源
     * @return 结果
     */
    @PostMapping("/doc/initCmsDoc/{dirId}")
    public R<Boolean> initCmsDoc(@PathVariable(value = "dirId") Long dirId
            , @RequestBody Object cmsDocInputDto
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过组织Id删除专区对应项目
     *
     * @param deptId 组织Id
     * @param source 来源
     * @return 结果
     */
    @DeleteMapping("/project/removeByDeptId/{deptId}")
    public R<Boolean> removeByDeptId(@PathVariable(value = "deptId") Long deptId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    @GetMapping("/doc/getJSONObject/{cmsDocId}")
    R<JSONObject> selectCmsDocJSONObjectById(@PathVariable(value = "cmsDocId") Long cmsDocId
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
