from rest_framework import serializers
from .models import BoundListModel, BoundDetailModel, BoundBatchModel
from utils import datasolve


class BoundListGetSerializer(serializers.ModelSerializer):
    # 定义主单列表的序列化器,用于获取操作,字段只读
    bound_month = serializers.CharField(read_only=True, required=False)
    bound_date = serializers.DateField(read_only=True, format='%Y-%m-%d')
    bound_code = serializers.CharField(read_only=True, required=False)
    bound_code_type = serializers.CharField(read_only=True, required=False)
    bound_bs_type = serializers.CharField(read_only=True, required=False)
    bound_type = serializers.CharField(read_only=True, required=False)
    bound_desc = serializers.CharField(read_only=True, required=False)
    bound_department = serializers.CharField(read_only=True, required=False)

    bound_status = serializers.CharField(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:%S')
    update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')

    class Meta:
        # 指定模型和排除字段
        model = BoundListModel
        exclude = ['openid', 'is_delete']
        read_only_fields = ['id', 'openid']


class BoundListPostSerializer(serializers.ModelSerializer):
    # 定义主单列表的序列化器,用于创建操作,允许部分字段写入
    bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
    bound_date = serializers.DateField(read_only=False, required=False, validators=[datasolve.data_validate])
    bound_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
    bound_code_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    bound_bs_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    bound_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    bound_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    bound_department = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    bound_status = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
    openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])

    creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    is_delete = serializers.BooleanField(read_only=False, required=False)

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


class BoundBatchGetSerializer(serializers.ModelSerializer):
    # 定义批次列表的序列化器,用于获取操作,字段只读
    bound_number = serializers.CharField(read_only=True, required=False)
    bound_month = serializers.CharField(read_only=True, required=False)

    warehouse_code = serializers.CharField(read_only=True, required=False)
    warehouse_name = serializers.CharField(read_only=True, required=False)
    goods_code = serializers.CharField(read_only=True, required=False)
    goods_desc = serializers.CharField(read_only=True, required=False)
    goods_std =  serializers.CharField(read_only=True, required=False)
    goods_qty = serializers.IntegerField(read_only=True, required=False)
    goods_in_qty = serializers.IntegerField(read_only=True, required=False)
    goods_out_qty = serializers.IntegerField(read_only=True, required=False)
    status = serializers.IntegerField(read_only=True, required=False)
    goods_weight = serializers.FloatField(read_only=True, required=False)
    goods_total_weight = serializers.FloatField(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:%S')
    update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')

    class Meta:
        # 指定模型和排除字段
        model = BoundBatchModel
        exclude = ['openid', 'is_delete']
        read_only_fields = ['id', 'openid']


class BoundBatchPostSerializer(serializers.ModelSerializer):
    # 定义批次列表的序列化器,用于创建操作,允许部分字段写入
    bound_number = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
    bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])

    warehouse_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    warehouse_name = serializers.CharField(read_only=False, 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_std =  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_in_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
    goods_out_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
    status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
    goods_weight = serializers.FloatField(read_only=False, required=True, validators=[datasolve.data_validate])

    goods_total_weight = serializers.FloatField(read_only=False, required=False, validators=[datasolve.data_validate])
    openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
    creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
    is_delete = serializers.BooleanField(read_only=False, required=False)

    class Meta:
        # 指定模型和排除字段
        model = BoundBatchModel
        fields= '__all__'
        read_only_fields = ['id', 'create_time', 'update_time']
        extra_kwargs = {
            'is_delete': {
                'default': False,
                'help_text': "逻辑删除标记(默认False)"
            }
        }


class BoundDetailGetSerializer(serializers.ModelSerializer):
    # 嵌套展示关联的主单和批次信息
    bound_list = serializers.SerializerMethodField()
    bound_batch = serializers.SerializerMethodField()
    detail_code = serializers.CharField(read_only=True, required=False)
    status = serializers.IntegerField(read_only=False, required=False)


    # 定义其他字段,只读
    creater = serializers.CharField(source='creater.username', read_only=True)
    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
    update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')

    class Meta:
        # 指定模型和字段,所有字段只读
        model = BoundDetailModel
        fields = [
            'id',
            'bound_list',
            'bound_batch',
            'detail_code',
            'creater',
            'create_time',
            'update_time',
            'is_delete',
            'status'
        ]
        read_only_fields = ['__all__']

    def get_bound_list(self, obj):
        """ 动态序列化关联的主单数据 """
        from .serializers import BoundListGetSerializer  # 延迟导入避免循环引用
        return BoundListGetSerializer(obj.bound_list).data

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


class BoundDetailPostSerializer(serializers.ModelSerializer):
    # 使用主键ID关联主单和批次
    bound_list = serializers.PrimaryKeyRelatedField(
        queryset=BoundListModel.objects.all(),
        help_text="关联主单ID(必须已存在)",
        error_messages={
            'does_not_exist': "指定主单不存在",
            'incorrect_type': "主单ID格式错误"
        }
    )
    bound_batch = serializers.PrimaryKeyRelatedField(
        queryset=BoundBatchModel.objects.all(),
        help_text="关联批次ID(必须已存在)",
        error_messages={
            'does_not_exist': "指定批次不存在",
            'incorrect_type': "批次ID格式错误"
        }
    )

    # 创建人字段,必须填写
    creater = serializers.CharField(
        required=True,
        max_length=255,
        help_text="创建人标识(建议从用户系统获取)",
        error_messages={
            'blank': "创建人不能为空",
            'max_length': "最长255个字符"
        }
    )

    detail_code = serializers.CharField(read_only=False, required=False)
    status = serializers.IntegerField(read_only=False, required=False)


    class Meta:
        # 指定模型和字段,部分字段只读
        model = BoundDetailModel
        fields='__all__'
        read_only_fields = [
            'id',
            'create_time',
            'update_time',
            'is_delete'
        ]
        extra_kwargs = {
            'is_delete': {
                'default': False,
                'help_text': "逻辑删除标记(默认False)"
            }
        }