from django.shortcuts import render
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
from .models import Mroom, MroomBooking, MroomSlot, LendingSeal
                    #  Vehicle, FileRecord, Seal
                    #  BorrowRecord, Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo)
from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer)
    #                       ,SealSerializer, 
    # LendingSealSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, 
    # PatentInfoSerializer, PaperSerializer, PlatformSerializer, ProjectSerializer, ProjectMemberSerializer, PaperRecordSerializer, ProjectApprovalSerializer, ProjectInfoSerializer)
from rest_framework.decorators import action
from apps.utils.mixins import CustomListModelMixin
from rest_framework.exceptions import ParseError
from apps.ofm.filters import MroomBookingFilterset


class MroomViewSet(CustomModelViewSet):
    """list: 会议室

    会议室
    """
    queryset = Mroom.objects.all()
    serializer_class = MroomSerializer


class MroomBookingViewSet(CustomModelViewSet):
    """list: 会议室预订

    会议室预订
    """
    queryset = MroomBooking.objects.all()
    serializer_class = MroomBookingSerializer
    select_related_fields = ["create_by"]
    filterset_class = MroomBookingFilterset

    def add_info_for_list(self, data):
        booking_ids = [d["id"] for d in data]
        slots = MroomSlot.objects.filter(booking__in=booking_ids).order_by("booking", "mroom", "mdate", "slot")
        booking_info = {}
        for slot in slots:
            booking_id = slot.booking.id
            
            if booking_id not in booking_info:
                booking_info[booking_id] = {
                    "mdate": slot.mdate.strftime("%Y-%m-%d"),  # 格式化日期
                    "mroom": slot.mroom.id,
                    "mroom_name": slot.mroom.name,  # 会议室名称
                    "time_ranges": [],  # 存储时间段（如 ["8:00-9:00", "10:00-11:30"]）
                    "current_slots": [],  # 临时存储连续的slot（用于合并）
                }
            
            # 检查是否连续（当前slot是否紧接上一个slot）
            current_slots = booking_info[booking_id]["current_slots"]
            if not current_slots or slot.slot == current_slots[-1] + 1:
                current_slots.append(slot.slot)
            else:
                # 如果不连续，先把当前连续的slot转换成时间段
                if current_slots:
                    start_time = self._slot_to_time(current_slots[0])
                    end_time = self._slot_to_time(current_slots[-1] + 1)
                    booking_info[booking_id]["time_ranges"].append(f"{start_time}-{end_time}")
                    current_slots.clear()
                current_slots.append(slot.slot)
        
        # 处理最后剩余的连续slot
        for info in booking_info.values():
            if info["current_slots"]:
                start_time = self._slot_to_time(info["current_slots"][0])
                end_time = self._slot_to_time(info["current_slots"][-1] + 1)
                info["time_ranges"].append(f"{start_time}-{end_time}")
                info.pop("current_slots")  # 清理临时数据
        
        for item in data:
            item.update(booking_info.get(item["id"], {}))
        return data

    @staticmethod
    def _slot_to_time(slot):
        """将slot (0-47) 转换为 HH:MM 格式的时间字符串"""
        hours = slot // 2
        minutes = (slot % 2) * 30
        return f"{hours:02d}:{minutes:02d}"

    def perform_update(self, serializer):
        ins:MroomBooking = self.get_object()
        if ins.create_by != self.request.user:
            raise ParseError("只允许创建者修改")
        return super().perform_update(serializer)
    
    def perform_destroy(self, instance):
        if instance.create_by != self.request.user:
            raise ParseError("只允许创建者删除")
        return super().perform_destroy(instance)


class MroomSlotViewSet(CustomListModelMixin, CustomGenericViewSet):
    """list: 

    会议室预订时段
    """
    queryset = MroomSlot.objects.all()
    serializer_class = MroomSlotSerializer
    filterset_fields = ["mroom", "mdate", "booking"]


# class SealModelViewSet(CustomModelViewSet):
#     """list: 印章列表

#     印章列表
#     """
#     queryset = Seal.objects.all()
#     serializer_class = SealSerializer
#     filterset_fields = ["name"] 
#     ordering = ["name"]


# class SealManageViewSet(CustomModelViewSet):
#     """list: 印章管理

#     印章管理
#     """
#     queryset = SealManage.objects.all()
#     serializer_class = SealManageSerializer
#     filterset_fields = ["seal"]


class LendingSealViewSet(CustomModelViewSet):
    """list: 印章外出

    印章外出
    """
    perms_map = {'get': '*', 'post': 'seal.update',
                 'put': 'seal.update', 'delete': 'seal.delete'}
    queryset = LendingSeal.objects.all()
    serializer_class = LendingSealSerializer
    filterset_fields = ["seal"]
    ordering = ["create_time"]


# class VehicleViewSet(CustomModelViewSet):
#     """list: 车辆

#     车辆
#     """
#     queryset = Vehicle.objects.all()
#     serializer_class = VehicleSerializer
#     filterset_fields = ["submit_user"]
#     ordering = ["create_time"]


# class FilerecordViewSet(CustomModelViewSet):
#     """list: 文件

#     文件
#     """
#     queryset = FileRecord.objects.all()
#     serializer_class = FileRecordSerializer
#     filterset_fields = ["submit_user", "name", "number"]
#     ordering = ["create_time", "number", "name"]


# class FileborrowViewSet(CustomModelViewSet):
#     """list: 文件借阅

#     文件借阅
#     """
#     queryset = BorrowRecord.objects.all()
#     serializer_class = BorrowRecordSerializer
#     filterset_fields = ["files", "borrow_user"]
#     ordering = ["create_time"]


# class PublicityViewSet(CustomModelViewSet):
#     """list: 公告

#     公告
#     """
#     queryset = Publicity.objects.all()
#     serializer_class = PublicitySerializer
#     filterset_fields = ["title","number"]
#     ordering = ["create_time", "number"]


# class PatentInfoViewSet(CustomModelViewSet):
#     """list: 专利

#     专利
#     """
#     queryset = PatentInfo.objects.all()
#     serializer_class = PatentInfoSerializer
#     filterset_fields = ["name", "author", "type"]
#     ordering = ["create_time", "name", "author", "type"]


# class PaperViewSet(CustomModelViewSet):
#     """list: 论文申密审批

#     论文申密审批
#     """
#     queryset = PaperOfm.objects.all()
#     serializer_class = PaperSerializer
#     filterset_fields = ["name", "author"]
#     ordering = ["create_time", "name"]


# class PlatformViewSet(CustomModelViewSet):
#     """list: 平台

#     平台
#     """
#     queryset = Platform.objects.all()
#     serializer_class = PlatformSerializer
#     filterset_fields = ["name"]
#     ordering = ["create_time", "name"]


# class ProjectViewSet(CustomModelViewSet):
#     """list: 项目

#     项目
#     """
#     queryset = Project.objects.all()
#     serializer_class = ProjectSerializer
#     filterset_fields = ["name"]
#     ordering = ["create_time", "name"]


# class PatentRecordViewSet(CustomModelViewSet):
#     """list: 专利台账登记

#     专利台账登记
#     """
#     queryset = PatentRecord.objects.all()
#     serializer_class = ProjectMemberSerializer
#     filterset_fields = ["patent", "type"]
#     ordering = ["create_time", "patent", "type"]


# class PaperRecordViewSet(CustomModelViewSet):
#     """list: 论文台账登记

#     论文台账登记
#     """
#     queryset = PaperRecord.objects.all()
#     serializer_class = ProjectMemberSerializer
#     filterset_fields = ["index", "title", "paper_code","paper_type", "authors"]
#     ordering = ["create_time", "paper", "type"]


# class ProjectApprovalViewSet(CustomModelViewSet):
#     """list: 立项审批表

#     立项审批表
#     """
#     queryset = ProjectApproval.objects.all()
#     serializer_class = ProjectApprovalSerializer
#     filterset_fields = ["project_start_date"]
#     ordering = ["project_start_date"]


# class ProjectInfoViewSet(CustomModelViewSet):
#     """list: 项目信息

#     项目信息
#     """
#     queryset = ProjectInfo.objects.all()
#     serializer_class = ProjectInfoSerializer
#     filterset_fields = ["serial_number", "name", "platform", "project_source"]
#     ordering = ["serial_number", "name"]
