package com.zsElectric.boot.business.service;

import com.zsElectric.boot.business.model.entity.FirmInfo;
import com.zsElectric.boot.business.model.form.FirmInfoForm;
import com.zsElectric.boot.business.model.form.FirmBalanceChangeForm;
import com.zsElectric.boot.business.model.query.FirmInfoQuery;
import com.zsElectric.boot.business.model.vo.FirmInfoVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;
import java.util.List;
import com.zsElectric.boot.common.model.Option;

/**
 * 企业信息服务类
 *
 * @author zsElectric
 * @since 2025-12-11 10:10
 */
public interface FirmInfoService extends IService<FirmInfo> {

    /**
     *企业信息分页列表
     *
     * @return {@link IPage<FirmInfoVO>} 企业信息分页列表
     */
    IPage<FirmInfoVO> getFirmInfoPage(FirmInfoQuery queryParams);

    /**
     * 获取企业信息表单数据
     *
     * @param id 企业信息ID
     * @return 企业信息表单数据
     */
     FirmInfoForm getFirmInfoFormData(Long id);

    /**
     * 新增企业信息
     *
     * @param formData 企业信息表单对象
     * @return 是否新增成功
     */
    boolean saveFirmInfo(FirmInfoForm formData);

    /**
     * 修改企业信息
     *
     * @param id   企业信息ID
     * @param formData 企业信息表单对象
     * @return 是否修改成功
     */
    boolean updateFirmInfo(Long id, FirmInfoForm formData);

    /**
     * 删除企业信息
     *
     * @param ids 企业信息ID，多个以英文逗号(,)分割
     * @return 是否删除成功
     */
    boolean deleteFirmInfos(String ids);

    /**
     * 上账（充值）- 增加企业余额
     *
     * @param firmId 企业ID
     * @param amount 上账金额
     * @param remark 备注
     * @return 是否成功
     */
    boolean recharge(Long firmId, BigDecimal amount, String remark);

    /**
     * 下账（扣款）- 减少企业余额
     *
     * @param firmId 企业ID
     * @param amount 下账金额
     * @param remark 备注
     * @return 是否成功
     */
    boolean deduct(Long firmId, BigDecimal amount, String remark);

    /**
     * 企业账户余额变更
     *
     * @param form 余额变更表单
     * @return 是否成功
     */
    boolean changeBalance(FirmBalanceChangeForm form);

    /**
     * 获取可用的部门选项（排除已被企业/渠道使用的部门）
     *
     * @param excludeId 编辑时排除的企业ID（允许选择自己关联的部门）
     * @return 可用部门选项列表
     */
    List<Option<Long>> getAvailableDeptOptions(Long excludeId);

    /**
     * 根据部门ID获取企业ID
     *
     * @param deptId 部门ID
     * @return 企业ID，如果不存在则返回null
     */
    Long getFirmIdByDeptId(Long deptId);
}
