package com.gxwebsoft.glt.task;

import com.gxwebsoft.common.core.annotation.IgnoreTenant;
import com.gxwebsoft.glt.service.GltTicketOrderAutoDispatchService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicBoolean;

/**
 * GLT 送水订单自动派单任务（tenantId=10584）：
 * - 扫描未指派配送员的待配送订单（glt_ticket_order.delivery_status=10 且 rider_id 为空/0）
 * - 依据收货坐标（优先 ShopOrder.addressLat/addressLng 订单快照；兜底地址表 lat/lng）与 配送员坐标(shop_store_rider.longitude/latitude) 计算距离，派给最近的配送员
 * - 写入 rider_id（配送员 userId），并同步关联商城订单的 riderId/deliveryStatus（复用 accept 逻辑）
 *
 * 默认不启用；需要在配置中显式打开：
 * - glt.ticket.dispatch10584.enabled=true
 */
@Slf4j
@Component
@RequiredArgsConstructor
@ConditionalOnProperty(prefix = "glt.ticket.dispatch10584", name = "enabled", havingValue = "true", matchIfMissing = false)
public class GltTicketOrderAutoDispatch10584Task {

    private static final int TENANT_ID = 10584;

    private final GltTicketOrderAutoDispatchService gltTicketOrderAutoDispatchService;

    private final AtomicBoolean running = new AtomicBoolean(false);

    @Value("${glt.ticket.dispatch10584.batchSize:50}")
    private int batchSize;

    @Scheduled(cron = "${glt.ticket.dispatch10584.cron:0/20 * * * * ?}")
    @IgnoreTenant("定时任务无登录态，需忽略租户隔离；内部使用 tenantId=10584 精确过滤")
    public void run() {
        if (!running.compareAndSet(false, true)) {
            log.warn("送水订单自动派单任务仍在执行中，本轮跳过 - tenantId={}", TENANT_ID);
            return;
        }
        try {
            int n = gltTicketOrderAutoDispatchService.autoDispatchWaitingOrders(TENANT_ID, batchSize);
            if (n > 0) {
                log.info("送水订单自动派单完成 - tenantId={}, dispatched={}", TENANT_ID, n);
            }
        } finally {
            running.set(false);
        }
    }
}
