package com.erp.aftersale.service;

import com.erp.aftersale.dto.request.AfterSaleCreateRequest;
import com.erp.aftersale.dto.request.AfterSaleQueryRequest;
import com.erp.aftersale.dto.request.AfterSaleStatusUpdateRequest;
import com.erp.aftersale.dto.response.*;
import com.erp.aftersale.entity.AfterSale;
import java.util.List;
import com.erp.common.core.model.PageResponse;

/**
 * 售后管理服务接口
 */
public interface AfterSaleService {

    /**
     * 分页查询售后列表
     */
    PageResponse<AfterSaleResponse> listAfterSales(AfterSaleQueryRequest request);

    /**
     * 获取售后单详情
     */
    AfterSaleResponse getAfterSale(Long id);

    /**
     * 获取售后单详情（按短ID）
     */
    AfterSaleResponse getAfterSaleByShortId(String shortId);

    /**
     * 创建售后单
     */
    AfterSaleResponse createAfterSale(AfterSaleCreateRequest request, OperatorInfo operator);

    /**
     * 更新售后状态
     */
    AfterSaleResponse updateStatus(Long id, AfterSaleStatusUpdateRequest request, OperatorInfo operator);

    /**
     * 删除售后单（仅允许撤销状态）
     */
    boolean deleteAfterSale(Long id, OperatorInfo operator);

    /**
     * 获取可售后的订单列表
     */
    PageResponse<?> getAvailableOrders(AfterSaleQueryRequest request);

    /**
     * 获取所有可售后订单（含未发货的仅退款）
     */
    PageResponse<?> getAllAvailableOrders(AfterSaleQueryRequest request);

    /**
     * 获取售后统计
     */
    AfterSaleStatsResponse getStats();

    /**
     * 获取售后操作日志
     */
    List<OperationLogResponse> getLogs(Long afterSaleId);

    /**
     * 审核通过
     */
    AfterSaleResponse approve(Long id, AfterSaleStatusUpdateRequest request, OperatorInfo operator);

    /**
     * 审核驳回
     */
    AfterSaleResponse reject(Long id, AfterSaleStatusUpdateRequest request, OperatorInfo operator);

    /**
     * 执行退款
     */
    AfterSaleResponse executeRefund(Long id, OperatorInfo operator);

    // ============ 内部方法 ============

    /**
     * 生成售后单短ID
     */
    String generateShortId();

    /**
     * 校验状态流转是否合法
     */
    void validateStatusTransition(AfterSale afterSale, String newStatus);

    // ============ 操作者信息 ============
    @lombok.Data
    @lombok.AllArgsConstructor
    @lombok.NoArgsConstructor
    @lombok.Builder
    class OperatorInfo {
        private Long operatorId;
        private String operatorName;
        private String ip;
        private String userAgent;

        public static OperatorInfo system() {
            return new OperatorInfo(0L, "SYSTEM", null, null);
        }
    }
}
