from rest_framework import serializers
from .models import InboundBill, MaterialDetail ,OutboundBill, OutMaterialDetail, InboundBillOperateLog, OutboundBillOperateLog
from utils import datasolve

class InboundApplySerializer(serializers.ModelSerializer):
    """
    生产入库申请序列化器
    """
    billId = serializers.CharField( read_only=True)  # 新增显式声明
    class Meta:
        model = InboundBill
        fields = '__all__'
        ordering_fields = ['update_time', 'create_time']
        read_only_fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount']
        
class OutboundApplySerializer(serializers.ModelSerializer):
    """
    生产出库申请序列化器
    """
    billId = serializers.CharField( read_only=True)  # 新增显式声明

    class Meta:
        model = OutboundBill
        fields = '__all__'
        ordering_fields = ['update_time', 'create_time']
        read_only_fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount']

class boundPostSerializer(serializers.Serializer):
    """
    生产入库申请序列化器
    """
    billId = serializers.IntegerField(required=True, label='原始单据ID')
    number = serializers.CharField(required=True, label='单据编号')
    type = serializers.IntegerField(required=True, label='绑定类型')
    date = serializers.CharField(required=True, label='入库时间')
    department = serializers.CharField(required=False, label='部门')
    warehouse = serializers.CharField(required=True, label='仓库')
    creater = serializers.CharField(required=True, label='创建人')
    note = serializers.CharField(required=False, label='备注说明')
    totalCount = serializers.IntegerField(required=True, label='总条目数')
    materials = serializers.ListField(required=True, label='物料明细')
    class Meta:
        fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount','materials']

    def validate_materials(self, value):
        """
        增强版物料明细验证
        返回带具体缺失字段的错误信息
        """
        required_fields = [
            'entryIds', 'production_batch', 
            'goods_code', 'goods_name', 
            'plan_qty',
            'goods_unit'
        ]
        
        errors = []
        
        for index, item in enumerate(value):
            # 识别缺失字段
            missing_fields = [field for field in required_fields if field not in item]
            
            if missing_fields:
                errors.append({
                    "index": index,
                    "entryIds": item.get('entryIds'),  # 保留原始标识
                    "production_batch": item.get('production_batch'),
                    "missing_fields": missing_fields,
                    "message": f"第{index+1}条物料缺少必填字段: {', '.join(missing_fields)}"
                })
        
        if errors:
            # 抛出结构化错误
            raise serializers.ValidationError([
                {
                    "detail": error["message"],
                    "metadata": {
                        "entryIds": error["entryIds"],
                        "production_batch": error["production_batch"],
                        "missing_fields": error["missing_fields"]
                    }
                } for error in errors
            ])
        
        return value
    
class MaterialDetailSerializer(serializers.ModelSerializer):
    """
    物料明细序列化器
    """
    class Meta:
        model = MaterialDetail
        exclude = ['id', 'note']
        read_only_fields = ['entryIds', 'production_batch', 'goods_code', 'goods_name', 'goods_std', 'goods_weight', 'plan_qty', 'goods_total_weight', 'goods_unit', 'note']
class OutMaterialDetailSerializer(serializers.ModelSerializer):
    """
    物料明细序列化器
    """
    class Meta:
        model = OutMaterialDetail
        exclude = ['id', 'note']
        read_only_fields = ['entryIds', 'production_batch', 'goods_code', 'goods_name', 'goods_weight', 'goods_out_qty', 'goods_total_weight', 'goods_unit', 'note']

class outboundPostSerializer(serializers.Serializer):
    """
    生产入库申请序列化器
    """
    billId = serializers.IntegerField(required=True, label='原始单据ID')
    number = serializers.CharField(required=True, label='单据编号')
    type = serializers.IntegerField(required=True, label='绑定类型')
    date = serializers.CharField(required=True, label='出库时间')
    department = serializers.CharField(required=False, label='部门',default='空')
    warehouse = serializers.CharField(required=True, label='仓库')
    creater = serializers.CharField(required=True, label='创建人')
    note = serializers.CharField(required=False, label='备注说明')
    totalCount = serializers.IntegerField(required=True, label='总条目数')
    materials = serializers.ListField(required=True, label='物料明细')
    class Meta:
        fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount','materials']

    def validate_materials(self, value):
        """
        增强版物料明细验证
        返回带具体缺失字段的错误信息
        """
        required_fields = [
            'entryIds', 'production_batch', 
            'goods_code', 'goods_name',
            'goods_out_qty',
            'goods_unit'
        ]
        
        errors = []
        
        for index, item in enumerate(value):
            # 识别缺失字段
            missing_fields = [field for field in required_fields if field not in item]
            
            if missing_fields:
                errors.append({
                    "index": index,
                    "entryIds": item.get('entryIds'),  # 保留原始标识
                    "production_batch": item.get('production_batch'),
                    "missing_fields": missing_fields,
                    "message": f"第{index+1}条物料缺少必填字段: {', '.join(missing_fields)}"
                })
        
        if errors:
            # 抛出结构化错误
            raise serializers.ValidationError([
                {
                    "detail": error["message"],
                    "metadata": {
                        "entryIds": error["entryIds"],
                        "production_batch": error["production_batch"],
                        "missing_fields": error["missing_fields"]
                    }
                } for error in errors
            ])
        
        return value
    
class InboundbillOperateLogSerializer(serializers.ModelSerializer):
    """
    入库单操作日志序列化器
    """
    create_time = serializers.DateTimeField(format='%Y-%m-%d', required=False, label='操作时间')
    class Meta:
        model = InboundBillOperateLog
        fields = '__all__'
        ordering_fields = ['update_time', 'create_time']
        read_only_fields = ['billId', 'operate_type', 'operate_content', 'operate_time']

class OutboundbillOperateLogSerializer(serializers.ModelSerializer):
    """
    出库单操作日志序列化器
    """
    create_time = serializers.DateTimeField(format='%Y-%m-%d', required=False, label='操作时间')
    class Meta:
        model = OutboundBillOperateLog
        fields = '__all__'
        ordering_fields = ['update_time', 'create_time']
        read_only_fields = ['billId', 'operate_type', 'operate_content', 'operate_time']