package com.ruoyi.web.modules.video.service;

import java.util.List;
import com.ruoyi.web.modules.industryservice.domain.vo.YakAssetSyncResultVo;
import com.ruoyi.web.modules.video.domain.BizLivestockMonitor;
import com.ruoyi.web.modules.video.domain.MonitorOwnerOption;
import com.ruoyi.web.modules.video.domain.vo.LivestockMonitorPlayUrlVo;

/**
 * 畜牧监控业务服务。
 * <p>
 * 负责监控点位台账 CRUD、主体选项合并查询、展示字段填充，以及委托第三方同步编排。
 * 手工保存走 {@link com.ruoyi.web.modules.video.support.LivestockMonitorValidation} 校验；
 * 第三方同步走 {@link LivestockMonitorSyncService}，二者共用 {@code biz_livestock_monitor} 表。
 * </p>
 */
public interface IBizLivestockMonitorService
{
    /**
     * 按主键查询详情（仅 {@code del_flag=0}），并填充 {@code ownerTypeName}、{@code videoSourceName}。
     */
    BizLivestockMonitor selectBizLivestockMonitorById(Long id);

    /**
     * 条件分页列表。{@code monitorName} 模糊；{@code ownerType} 与 {@code ownerId} 成对精确匹配。
     */
    List<BizLivestockMonitor> selectBizLivestockMonitorList(BizLivestockMonitor query);

    /**
     * 所属主体下拉：养殖主体（正常）+ 交易市场（正常），按名称排序，各源最多 {@link com.ruoyi.web.modules.video.support.LivestockMonitorRules#OWNER_OPTIONS_LIMIT} 条。
     *
     * @param keyword 对主体名称模糊，空则返回各源前 N 条
     */
    List<MonitorOwnerOption> selectOwnerOptions(String keyword);

    /**
     * 新增。校验通过后若填写主体则解析 {@code owner_name} 冗余。
     */
    int insertBizLivestockMonitor(BizLivestockMonitor row);

    /**
     * 修改。记录须存在且未删除；主体可选，清空时置空 owner 三字段。
     */
    int updateBizLivestockMonitor(BizLivestockMonitor row);

    /**
     * 批量逻辑删除（{@code del_flag=2}）。
     *
     * @param ids      主键数组，null 元素忽略
     * @param updateBy 操作人
     */
    int deleteBizLivestockMonitorByIds(Long[] ids, String updateBy);

    /**
     * 从第三方生产管理系统同步监控点位。
     *
     * @param operator 当前操作人（点击同步按钮的用户）
     * @return 新增/更新/失败条数、失败明细、同步完成时间
     */
    YakAssetSyncResultVo syncFromThirdParty(String operator);

    /**
     * 按摄像头 ID 拉取实时播放地址（调用第三方 play-url 接口，不落库）。
     *
     * @param monitorId {@code biz_livestock_monitor.monitor_id}，须在本地存在且未删除
     */
    LivestockMonitorPlayUrlVo getPlayUrlByMonitorId(String monitorId);
}
