package com.microservices.zone.detail.service;

import com.microservices.common.core.web.page.GenericsTableDataInfo;
import com.microservices.common.datascope.annotation.DataScope;
import com.microservices.system.api.domain.SysDept;
import com.microservices.zone.detail.domain.ZoneDetail;
import com.microservices.zone.detail.domain.vo.*;
import com.microservices.zone.project.domain.vo.ZoneStatisticsVo;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 特色专区详情Service接口
 *
 * @author otto
 * @date 2023-05-09
 */
public interface IZoneDetailService {
    /**
     * 查询特色专区详情
     *
     * @param id 特色专区详情主键
     * @return 特色专区详情
     */
    public ZoneDetail selectZoneDetailById(Long id);

    /**
     * 查询特色专区详情
     *
     * @param id 特色专区详情主键
     * @return 特色专区详情
     */
    public ZoneDetailDataVo selectZoneDetailDataById(Long id);

    /**
     * 查询特色专区详情列表
     *
     * @param zoneDetailSearchVo 特色专区详情
     * @return 特色专区详情集合
     */
    @DataScope(deptAlias = "z")
    public GenericsTableDataInfo<ZoneDetailDataVo> selectZoneDetailList(ZoneDetailSearchVo zoneDetailSearchVo);

    /**
     * 新增特色专区详情
     *
     * @param zoneDetail 特色专区详情
     * @return 结果
     */
    public int insertZoneDetail(ZoneDetail zoneDetail);

    /**
     * 修改特色专区详情
     *
     * @param zoneDetailUpdateVo 特色专区详情
     * @return 结果
     */
    public int updateZoneDetail(ZoneDetailUpdateVo zoneDetailUpdateVo);

    /**
     * 批量删除特色专区详情
     *
     * @param ids 需要删除的特色专区详情主键集合
     * @return 结果
     */
    public int deleteZoneDetailByIds(Long[] ids);

    /**
     * 删除特色专区详情信息
     *
     * @param id       特色专区详情主键
     * @param deptName
     * @return 结果
     */
    public int deleteZoneDetailByDeptName(String deptName);

    /**
     * 通过组织新增特色专区
     *
     * @param deptId
     * @return
     */
    Long insertZoneDetailByDept(Long deptId);

    /**
     * 生成专区标识
     *
     * @param deptName 组织名称
     * @return 专区标识
     */
    String genZoneKey(String deptName);

    /**
     * 通过组织更新特色专区
     *
     * @param dept
     * @return
     */
    Boolean updateZoneDetailByDept(SysDept dept);

    /**
     * 通过专区Id获取专区详情JSON对象
     *
     * @param zoneId
     * @return
     */
    String getZoneJSONByZoneId(Long zoneId);

    /**
     * 通过组织Id获取专区首页文章最大数量
     *
     * @param deptId
     * @return
     */
    Long getZoneHomePageCmsSizeByDeptId(Long deptId);

    /**
     * 检查用户是否有当前专区的权限，返回管理端地址
     *
     * @param zoneId
     * @param request
     * @return
     */
    String checkZoneRole(Long zoneId, HttpServletRequest request);

    /**
     * 通过专区名称获取特色专区详细信息
     *
     * @param zoneName
     * @return
     */
    ZoneDetailDataVo selectZoneDetailDataByName(String zoneName);

    /**
     * 获取专区概览总数
     * @param zoneDetailSearchVo
     * @return
     */
    Integer selectZoneDetailCount(ZoneDetailSearchVo zoneDetailSearchVo);

    /**
     * 通过专区标识获取特色专区详细信息
     *
     * @param zoneKey
     * @return
     */
    ZoneDetailDataVo selectZoneDetailDataByKey(String zoneKey);

    /**
     * 发布/下架特色专区
     *
     * @param id
     * @return
     */
    int publishZoneDetail(Long id);

    /**
     * 查询已发布专区列表
     *
     * @return
     */
    List<ZoneBaseDataVo> selectPublishedZoneBaseList();

    /**
     * 通过组织Id获取专区详情JSON对象
     *
     * @param deptId
     * @return
     */
    String getZoneJSONByDeptId(Long deptId);

    ZoneFrontRoleVo checkCurrentRoleInZone(Long zoneId);

    /**
     * 通过组织id锁定/解锁专区资讯
     *
     * @param deptId
     * @param lockStatus
     * @return
     */
    int lockCmsByDeptId(Long deptId, Integer lockStatus);

    /**
     * 获取切换身份后的专区访问地址
     *
     * @return 专区访问地址
     */
    String getChangeUserIdentityZoneUrl();

    /**
     * 检查是否有该专区数据权限
     *
     * @param zoneId 专区Id
     */
    void checkZoneDataScope(Long zoneId);

    /**
     * 根据Key查询专区
     *
     * @param key 专区Key
     * @return 专区
     */
    ZoneDetail selectZoneDetailByKey(String key);

    /**
     * 根据名称查找专区
     *
     * @param name 专区名称
     * @return 专区
     */
    ZoneDetail selectZoneDetailByName(String name);

    /**
     * 根据专区申请创建专区
     *
     * @param zoneApplicationCreateZoneVo 专区申请对象
     * @return 专区Id
     */
    Long createZoneByApplication(ZoneApplicationCreateZoneVo zoneApplicationCreateZoneVo);

    /**
     * 校验专区标识是否符合规范
     *
     * @param zoneKey 专区标识
     */
    void checkZoneKey(String zoneKey);

    /**
     * 查询专区详情（不校验数据权限）
     *
     * @param zoneId 专区id
     * @return 专区详情
     */
    ZoneDetail selectZoneDetailByIdNotVerifiedDataScope(Long zoneId);

    ZoneStatisticsVo getZoneStatistics(Long zoneId);
}
