from flask import Blueprint, request, jsonify
from app.services.outbound_service import OutboundService
from flask_jwt_extended import jwt_required, get_jwt_identity
import traceback

outbound_bp = Blueprint('outbound', __name__, url_prefix='/outbound')


# --------------------------------------------------------
# 1. 扫码查询库存接口 (关联三个库存表)
# GET /api/v1/outbound/scan?barcode=...
# --------------------------------------------------------
@outbound_bp.route('/scan', methods=['GET'])
@jwt_required()
def scan_barcode():
    barcode = request.args.get('barcode')
    if not barcode:
        return jsonify({'code': 400, 'msg': '请提供条码'}), 400

    try:
        # 调用 Service 层去三个表中查找 (Service已更新，会返回价格)
        result = OutboundService.get_stock_by_barcode(barcode)

        if result:
            return jsonify({
                'code': 200,
                'msg': '扫描成功',
                'data': result
            })
        else:
            return jsonify({
                'code': 404,
                'msg': '未找到对应的库存记录，请确认条码是否正确'
            }), 404

    except Exception as e:
        traceback.print_exc()
        return jsonify({'code': 500, 'msg': f'扫描查询出错: {str(e)}'}), 500


# --------------------------------------------------------
# 2. 提交出库单接口 (批量)
# POST /api/v1/outbound
# --------------------------------------------------------
@outbound_bp.route('', methods=['POST'])
@jwt_required()
def create_outbound():
    data = request.get_json()
    if not data:
        return jsonify({'code': 400, 'msg': '无有效数据'}), 400

    # 获取当前登录用户名 (JWT identity)
    current_user_name = get_jwt_identity()
    if not current_user_name:
        current_user_name = 'Unknown'

    # 获取最终的操作员名称
    final_operator = data.get('operator_name')
    if not final_operator:
        final_operator = current_user_name

    # 必填校验 (针对整个单据)
    # items 必须是列表且不为空，consumer_name 和 signature_path 必填
    if 'items' not in data or not data['items']:
        return jsonify({'code': 400, 'msg': '出库商品列表不能为空'}), 400

    if not data.get('consumer_name') or not data.get('signature_path'):
        return jsonify({'code': 400, 'msg': '领用人及签名信息缺失'}), 400

    try:
        # ★ [修改] 调用批量创建服务
        outbound_no = OutboundService.create_outbound_batch(data, operator_name=final_operator)
        return jsonify({
            'code': 200,
            'msg': '出库成功',
            'data': {'outbound_no': outbound_no}
        })
    except ValueError as e:
        # 业务逻辑错误 (如库存不足)
        return jsonify({'code': 400, 'msg': str(e)}), 400
    except Exception as e:
        traceback.print_exc()
        return jsonify({'code': 500, 'msg': f'服务器内部错误: {str(e)}'}), 500


# --------------------------------------------------------
# 3. 获取出库记录列表 (分组展示)
# GET /api/v1/outbound
# --------------------------------------------------------
@outbound_bp.route('', methods=['GET'])
@jwt_required()
def get_outbound_list():
    try:
        page = int(request.args.get('page', 1))
        limit = int(request.args.get('limit', 10))
        keyword = request.args.get('keyword', '')
        # 如果前端传了日期范围，可以解析处理，这里暂略

        # ★ [修改] 调用分组查询服务
        result = OutboundService.get_grouped_list(page, limit, keyword)

        return jsonify({
            'code': 200,
            'msg': '获取成功',
            'data': result
        })
    except Exception as e:
        traceback.print_exc()
        return jsonify({'code': 500, 'msg': str(e)}), 500