package com.microservices.cms.doc.service;

import com.alibaba.fastjson2.JSONObject;
import com.microservices.cms.doc.domain.*;
import com.microservices.cms.doc.domain.gitlink.EntryDto;
import com.microservices.cms.doc.domain.gitlink.FileEntryDto;
import com.microservices.cms.project.domain.CmsProject;

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

/**
 * 文章信息Service接口
 *
 * @author otto
 * @date 2023-03-28
 */
public interface ICmsDocService {
    /**
     * 查询文章信息
     *
     * @param id     文章信息主键
     * @param isOpen 是否公开接口
     * @return 文章信息
     */
    public CmsDocDetailDto selectCmsDocById(Long id, boolean isOpen, HttpServletRequest request);

    /**
     * 查询文章基础信息
     *
     * @param id 文章信息主键
     * @return 文章基础信息
     */
    public CmsDoc selectBaseCmsDocById(Long id);

    /**
     * 查询文章信息列表
     *
     * @param dirId
     * @param cmsDocSearchVo
     * @return 文章信息集合
     */
    public List<CmsDocBaseDto> selectCmsDocList(Long dirId, CmsDocSearchVo cmsDocSearchVo);

    /**
     * 新增文章信息
     *
     * @param dirId
     * @param cmsDocInputDto
     * @return 结果
     */
    public Integer insertCmsDoc(Long dirId, CmsDocInputDto cmsDocInputDto);

    /**
     * 修改文章信息
     *
     * @param id
     * @param cmsDocDto 文章信息
     * @return 结果
     */
    public boolean updateCmsDoc(Long id, CmsDocDto cmsDocDto);

    /**
     * 批量删除文章信息
     *
     * @param ids 需要删除的文章信息主键集合
     * @return 结果
     */
    public int deleteCmsDocByIds(Long[] ids);

    /**
     * 删除文章信息信息
     *
     * @param id 文章信息主键
     * @return 结果
     */
    public int deleteCmsDocById(Long id);

    boolean insertCmsDocDir(Long deptId, CmsDir cmsDir);

    List<CmsDir> selectCmsDocDirList(Long deptId, boolean isOpen);

    List<HotCmsDocDto> selectHotCmsDocList(Long dirId);

    boolean updateVisits(Long id);

    List<HotCmsDocDto> selectHotCmsDocListByDept(Long deptId);

    /**
     * 查询文章聚合列表
     *
     * @param deptId
     * @param isOpen
     * @return
     */
    List<CmsDocOverviewDto> selectCmsDocOverviewList(Long deptId, boolean isOpen);

    /**
     * 获取栏目详细信息
     *
     * @param dirId
     * @param isOpen
     * @return
     */
    CmsDir selectCmsDirById(Long dirId, boolean isOpen);

    /**
     * 通过专区Id查找组织Id
     *
     * @param zoneId
     * @return
     */
    Long getDeptIdByZoneId(Long zoneId);

    /**
     * 通过组织id获取专区详情
     *
     * @param deptId
     * @return
     */
    JSONObject getZoneJSONByDeptId(Long deptId);

    /**
     * 设置是否首页展示
     *
     * @param id
     * @return
     */
    int updateCmsDocHomePageShow(Long id);

    /**
     * 通过组织Id获取专区下文章数量
     *
     * @param deptId
     * @return
     */
    Long getCmsCountByDeptId(Long deptId);

    /**
     * 查询首页文章列表
     *
     * @param deptId
     * @return
     */
    List<CmsDocBaseDto> selectHomePageDocList(Long deptId);

    /**
     * 初始化栏目
     *
     * @param deptId
     * @param cmsDirInput
     * @return
     */
    CmsDir initCmsDir(Long deptId, CmsDir cmsDirInput);

    /**
     * 初始化文章
     *
     * @param dirId
     * @param cmsDocInputDto
     * @return
     */
    boolean initCmsDoc(Long dirId, CmsDocInputDto cmsDocInputDto);

    /**
     * 同步文章数据
     *
     * @param deptId
     * @param bodyStr
     */
    void syncDocData(Long deptId, String bodyStr);

    List<EntryDto> getEntriesFromRequestResult(JSONObject result, CmsProject cmsProject, boolean b);

    /**
     * 数据库中新增文章
     * @param cmsDoc
     * @param content
     * @return
     */
    boolean insertCmsDocDatabase(CmsDoc cmsDoc, String content);

    /**
     * 获取GitLnk代码库中文件对象
     *
     * @param cmsProject
     * @param addedFilePath
     * @return
     */
    FileEntryDto getFileEntryDto(CmsProject cmsProject, String addedFilePath, String branchName);

    /**
     * 查询专区下所有文章列表
     *
     * @param deptId
     * @param cmsDocSearchVo
     * @return
     */
    List<CmsDocAllDto> selectCmsDocListByDept(Long deptId, CmsDocSearchVo cmsDocSearchVo);

    /**
     * 查询专区下文章数量
     *
     * @param deptId
     * @param cmsDocSearchVo
     * @return
     */
    int selectCmsDocCountByDept(Long deptId, CmsDocSearchVo cmsDocSearchVo);

    /**
     * 通过GitLink文件夹获取文件夹下所有文件
     *
     * @param cmsProject
     * @param dirName
     * @return
     */
    List<EntryDto> getGitLinkFileByDir(CmsProject cmsProject, String dirName);

    /**
     * 更新栏目信息
     *
     * @param id
     * @param cmsDirUpdateVo
     * @return
     */
    void updateCmsDir(Long id, CmsDirUpdateVo cmsDirUpdateVo);

    /**
     * 手动进行全量同步
     *
     * @return
     */
    void syncAll();

    /**
     * 获取组织下首页推荐数量
     *
     * @param deptId
     * @param dirName
     * @return
     */
    Integer selectHomepageCountByDeptIdAndDirName(Long deptId, String dirName);

    /**
     * 查询栏目下文章列表（包含内容）
     *
     * @param dirId
     * @return
     */
    List<CmsDocDetailDto> selectCmsDocDetailList(Long dirId);

    String getDocDetailUrl(Long deptId, Long id);

    void setCmsSort(Integer order, CmsDoc oldCmsDoc, boolean isChangeOnDir, String isHomePage);

    String getCmsDocFileContent(CmsProject cmsProject, CmsDoc cmsDoc);

    boolean auditCmsDoc(Long docId, CmsDocAuditVo cmsDocAuditVo);

    /**
     * 文章是否支持编辑
     *
     * @param cmsDocBaseDto
     * @return
     */
    Boolean isCmsDocEditable(CmsDocBaseDto cmsDocBaseDto);

    void updateCmsPublishData(CmsDoc cmsDoc, String branchName);

    int updateCmsCommonDatabase(CmsDoc cmsDoc, String tmpBranchName);

    void createFileByGitLink(CmsDoc newCmsDir, String message, String s);

    /**
     * 获取专区下待审核文章数量
     *
     * @param deptId
     * @return
     */
    Long getNotAuditCmsCountByDeptId(Long deptId);

    /**
     * 获取文章基础信息
     *
     * @param id 文章Id
     * @return 文章基础信息
     */
    CmsDocBaseDto selectCmsDocBaseInfoById(Long id);

    Long getCmsDocVisitsByDeptId(Long deptId);
}
