from rest_framework import serializers

from .models import ContainerListModel,ContainerDetailModel,ContainerOperationModel,TaskModel,ContainerWCSModel
from bound.models import BoundBatchModel,BoundDetailModel

from utils import datasolve

class ContainerListGetSerializer(serializers.ModelSerializer):
    # 定义主单列表的序列化器,用于获取操作,字段只读
    container_code = serializers.IntegerField(read_only=True, required=False)
    current_location = serializers.CharField(read_only=True, required=False)
    target_location = serializers.CharField(read_only=True, required=False)
    status = serializers.IntegerField(read_only=True, required=False)
    last_operation = serializers.DateTimeField(read_only=True, format='%Y-%m-%d', required=False)

    class Meta:
        # 指定模型和排除字段
        model = ContainerListModel
        fields= '__all__'
        read_only_fields = ['id']

class ContainerListPostSerializer(serializers.ModelSerializer):
    # 定义主单列表的序列化器,用于创建操作,允许部分字段写入
    container_code = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
    current_location = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
    target_location = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
    status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
    last_operation = serializers.DateTimeField(read_only=False, format='%Y-%m-%d', required=False, validators=[datasolve.data_validate])


    class Meta:
        # 指定模型和排除字段
        model = ContainerListModel
        fields= '__all__'
        read_only_fields = ['id' ]

class ContainerDetailGetSerializer(serializers.ModelSerializer):
    # 定义明细单列表的序列化器,用于获取操作,字段只读
    month = serializers.IntegerField(read_only=True, required=False)
    container = serializers.SerializerMethodField()
    batch = serializers.SerializerMethodField()
    goods_code = serializers.CharField(read_only=True, required=False)
    goods_desc = serializers.CharField(read_only=True, required=False)
    goods_qty = serializers.IntegerField(read_only=True, required=False)
    goods_weight = serializers.DecimalField(read_only=True, required=False, max_digits=10, decimal_places=2)
    status = serializers.IntegerField(read_only=True, required=False)
    creater = serializers.CharField(read_only=True, required=False)
    create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M', required=False)
    update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M', required=False)
    

    def get_container(self, obj):
        """ 动态序列化关联的主单数据 """
        from .serializers import ContainerListGetSerializer
        return ContainerListGetSerializer(obj.container).data

    def get_batch(self, obj):
        """ 动态序列化关联的批次数据 """
        from bound.serializers import BoundBatchGetSerializer
        return BoundBatchGetSerializer(obj.batch).data

    class Meta:
        # 指定模型和排除字段
        model = ContainerDetailModel
        exclude = ['id', 'is_delete', ]
        read_only_fields = ['id']
    
class ContainerDetailPostSerializer(serializers.ModelSerializer):
    # 定义明细单列表的序列化器,用于创建操作,允许部分字段写入
    month = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
    container = serializers.PrimaryKeyRelatedField(queryset=ContainerListModel.objects.all(),
    help_text='关联的主单',
    error_messages = {
        'null': '请选择关联的主单',
        'does_not_exist': '关联的主单不存在',
        'incorrect_type': '关联的主单格式错误'
    },
    required=False, validators=[datasolve.data_validate])
    batch = serializers.PrimaryKeyRelatedField(queryset=BoundBatchModel.objects.all(),
    help_text='关联的批次',
    error_messages = {
        'null': '请选择关联的批次',
        'does_not_exist': '关联的批次不存在',
        'incorrect_type': '关联的批次格式错误'
    },
    required=False, validators=[datasolve.data_validate])
    goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    goods_qty = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
    goods_weight = serializers.DecimalField(read_only=False, required=True, max_digits=10, decimal_places=2, validators=[datasolve.data_validate])
    status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
    creater = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
    create_time = serializers.DateTimeField(read_only=False, format='%Y-%m-%d %H:%M', required=False, validators=[datasolve.data_validate])
    update_time = serializers.DateTimeField(read_only=False, format='%Y-%m-%d %H:%M', required=False, validators=[datasolve.data_validate])

    class Meta:
        # 指定模型和排除字段
        model = ContainerDetailModel
        fields= '__all__'
        read_only_fields = ['id']

class ContainerOperationGetSerializer(serializers.ModelSerializer):
    # 定义操作记录的序列化器,用于获取操作,字段只读
    month = serializers.IntegerField(read_only=True, required=False)
    container = serializers.SerializerMethodField()
    operation_type = serializers.CharField(read_only=True, required=False)

    batch = serializers.SerializerMethodField()
    goods_code = serializers.CharField(read_only=True, required=False)
    goods_desc = serializers.CharField(read_only=True, required=False)
    goods_qty = serializers.IntegerField(read_only=True, required=False)
    goods_weight = serializers.DecimalField(read_only=True, required=False, max_digits=10, decimal_places=2)

    operator = serializers.CharField(read_only=True, required=False)
    timestamp = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M', required=False)
    from_location = serializers.CharField(read_only=True, required=False)
    to_location = serializers.CharField(read_only=True, required=False)
    memo = serializers.CharField(read_only=True, required=False)
    def get_container(self, obj):
        """ 动态序列化关联的主单数据 """
        from .serializers import ContainerListGetSerializer
        return ContainerListGetSerializer(obj.container).data

    def get_batch(self, obj):
        """ 动态序列化关联的批次数据 """
        from bound.serializers import BoundBatchGetSerializer
        return BoundBatchGetSerializer(obj.batch).data

    class Meta:
        # 指定模型和排除字段
        model = ContainerOperationModel
        fields= '__all__'
        read_only_fields = ['id']

class ContainerOperationPostSerializer(serializers.ModelSerializer):
    # 定义操作记录的序列化器,用于创建操作,允许部分字段写入
    month = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
    container = serializers.PrimaryKeyRelatedField(queryset=ContainerListModel.objects.all(),
    help_text='关联的主单',
    error_messages = {
        'null': '请选择关联的主单',
        'does_not_exist': '关联的主单不存在',
        'incorrect_type': '关联的主单格式错误'
    },
    required=True, validators=[datasolve.data_validate])
    operation_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])

    batch = serializers.PrimaryKeyRelatedField(queryset=BoundBatchModel.objects.all(),
    help_text='关联的批次',
    error_messages = {
        'null': '请选择关联的批次',
        'does_not_exist': '关联的批次不存在',
        'incorrect_type': '关联的批次格式错误'
    },
    required=True, validators=[datasolve.data_validate])
    goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    goods_qty = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
    goods_weight = serializers.DecimalField(read_only=False, required=True, max_digits=10, decimal_places=2, validators=[datasolve.data_validate])

    operator = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    timestamp = serializers.DateTimeField(read_only=False, format='%Y-%m-%d %H:%M', required=True, validators=[datasolve.data_validate])
    from_location = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    to_location = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    memo = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])

    class Meta:
        # 指定模型和排除字段
        model = ContainerOperationModel
        fields= '__all__'
        read_only_fields = ['id']

class TaskGetSerializer(serializers.ModelSerializer):
    # 定义任务记录的序列化器,用于获取操作,字段只读
    task_wcs = serializers.SerializerMethodField()
    container_detail = serializers.SerializerMethodField()
    batch_detail = serializers.SerializerMethodField()


    def get_task_wcs(self, obj):
        """ 动态序列化关联的WCS任务数据 """
        from .models import ContainerWCSModel
        return ContainerWCSModel.objects.filter(id=obj.task_wcs_id).first().to_dict()

    def get_container_detail(self, obj):
        """ 动态序列化关联的主单数据 """
        from .serializers import ContainerDetailGetSerializer
        return ContainerDetailGetSerializer(obj.container_detail).data
    def get_batch_detail(self, obj):
        """ 动态序列化关联的批次数据 """
        from bound.serializers import BoundDetailGetSerializer
        return BoundDetailGetSerializer(obj.batch_detail).data

    class Meta:
        # 指定模型和排除字段
        model = TaskModel
        fields= '__all__'
        read_only_fields = ['id']

class TaskPostSerializer(serializers.ModelSerializer):
    # 定义任务记录的序列化器,用于获取操作,字段只读
    task_wcs = serializers.PrimaryKeyRelatedField(queryset=ContainerWCSModel.objects.all(),
    help_text='关联的WCS任务',
    error_messages = {
        'null': '请选择关联的WCS任务',
        'does_not_exist': '关联的WCS任务不存在',
        'incorrect_type': '关联的WCS任务格式错误'
    },
    required=False, validators=[datasolve.data_validate])
    bound_detail = serializers.PrimaryKeyRelatedField(queryset=BoundDetailModel.objects.all(),
    help_text='关联的明细单',
    error_messages = {
        'null': '请选择关联的明细单',
        'does_not_exist': '关联的明细单不存在',
        'incorrect_type': '关联的明细单格式错误'
    },
    required=False, validators=[datasolve.data_validate])
    class Meta:
        # 指定模型和排除字段
        model = TaskModel
        fields= '__all__'
        read_only_fields = ['id']