package com.engine.salary.service;

import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO;
import com.engine.salary.entity.salarysob.param.SalarySobBasicSaveParam;
import com.engine.salary.entity.salarysob.param.SalarySobDisableParam;
import com.engine.salary.entity.salarysob.param.SalarySobDuplicateParam;
import com.engine.salary.entity.salarysob.param.SalarySobListQueryParam;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
import com.engine.salary.util.page.PageInfo;

import java.time.YearMonth;
import java.util.Collection;
import java.util.List;

/**
 * 薪资账套
 * <p>Copyright: Copyright (c) 2022</p>
 * <p>Company: 泛微软件</p>
 *
 * @author qiantao
 * @version 1.0
 **/
public interface SalarySobService {

    /**
     * 根据主键id获取单个薪资账套
     *
     * @param id        主键id
     * @return
     */
    SalarySobPO getById(Long id);

    /**
     * 根据主键id查询薪资账套
     *
     * @param ids       主键id
     * @return
     */
    List<SalarySobPO> listByIds(Collection<Long> ids);

    /**
     * 根据名称精确匹配查询薪资账套
     *
     * @param name      薪资账套名称
     * @return
     */
    List<SalarySobPO> listByName(String name);

    /**
     * 根据名称（模糊匹配）查询薪资账套
     *
     * @param nameLike  薪资账套名称
     * @return
     */
    List<SalarySobPO> listByNameLike(String nameLike);

    /**
     * 查询启用/禁用的薪资账套
     *
     * @param disable   启用/禁用
     * @return
     */
    List<SalarySobPO> listByDisable(Integer disable);

    List<SalarySobPO> listAll();

    /**
     * 获取拥有管理权限的账套
     * @return
     */
    List<SalarySobPO> listByAdmin();

    List<SalarySobPO> listByTaxAgentId(Long taxAgentId);

    /**
     * 根据薪资类型查询薪资账套
     *
     * @param incomeCategory 薪资类型
     * @return
     */
    List<SalarySobPO> listByIncomeCategory(IncomeCategoryEnum incomeCategory);

    /**
     * 根据列表查询参数查询薪资账套（分页）
     *
     * @param queryParam 列表查询参数
     * @return
     */
    PageInfo<SalarySobPO> listPageByParam(SalarySobListQueryParam queryParam);

    List<SalarySobPO> listByParam(SalarySobListQueryParam queryParam);

    /**
     * 保存
     *
     * @param saveParam  保存参数
     * @return
     */
    Long save(SalarySobBasicSaveParam saveParam);

    void saveDefaultEmployeeRange(SalarySobPO salarySobPO);

    /**
     * 编辑
     *
     * @param saveParam  更新参数
     * @return
     */
    Long update(SalarySobBasicSaveParam saveParam);

    /**
     * 更新薪资账套的是否启用
     *
     * @param disableParam 更新参数
     */
    void updateDisable(SalarySobDisableParam disableParam);

    /**
     * 根据主键id删除
     *
     * @param ids       薪资账套的主键id
     */
    void deleteByIds(Collection<Long> ids);

    /**
     * 复制
     *
     * @param duplicateParam 复制参数
     */
    void duplicate(SalarySobDuplicateParam duplicateParam);

    /**
     * 根据薪资所属月计算出薪资账套的薪资周期、考勤周期的具体日期范围以及税款所属期、福利台账月份的具体月份
     *
     * @param id          薪资账套的id
     * @param salaryMonth 薪资所属月
     * @return
     */
    SalarySobCycleDTO getSalarySobCycle(Long id, YearMonth salaryMonth);

    /**
     * 按权限过滤掉无权限的薪资账套
     *
     * 总管理员拥有权限
     * @param salarySobPOS
     * @return
     */
    List<SalarySobPO> filterByAuthority(List<SalarySobPO> salarySobPOS);

    /**
     * 根据扣缴义务人查询
     * @param taxAgentIds
     * @return
     */
    List<SalarySobPO> listByTaxAgentIds(Collection<Long> taxAgentIds);
}
