import sys
import os
from datetime import datetime
from PIL import Image, ImageDraw, ImageFont, ImageOps
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
                             QLabel, QLineEdit, QPushButton, QGroupBox, QFormLayout,
                             QComboBox, QDateEdit, QTextEdit, QFileDialog, QMessageBox,
                             QTabWidget, QScrollArea, QFrame, QGridLayout, QSpinBox)
from PyQt5.QtCore import Qt, QDate, pyqtSignal
from PyQt5.QtGui import QPixmap, QFont, QPalette, QColor, QIntValidator


class IDCardGenerator(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()
        self.setup_fields_info()

    def init_ui(self):
        """初始化界面"""
        self.setWindowTitle("学生证件生成器 v2.0 - 带详细填写说明")
        self.setGeometry(100, 100, 1200, 800)

        # 设置主窗口背景色
        self.setStyleSheet("""
            QMainWindow {
                background-color: #f5f8ff;
            }
            QGroupBox {
                font-size: 14px;
                font-weight: bold;
                border: 2px solid #cccccc;
                border-radius: 8px;
                margin-top: 10px;
                padding-top: 10px;
            }
            QGroupBox::title {
                subcontrol-origin: margin;
                left: 10px;
                padding: 0 5px 0 5px;
                color: #0066cc;
            }
            QLabel {
                font-size: 12px;
            }
            QLineEdit, QComboBox, QDateEdit, QSpinBox {
                font-size: 12px;
                padding: 5px;
                border: 1px solid #cccccc;
                border-radius: 4px;
            }
            QLineEdit:focus, QComboBox:focus, QDateEdit:focus {
                border: 2px solid #0066cc;
            }
            QTextEdit {
                font-size: 12px;
                border: 1px solid #cccccc;
                border-radius: 4px;
            }
            QPushButton {
                font-size: 12px;
                padding: 8px 15px;
                border: none;
                border-radius: 4px;
                background-color: #0066cc;
                color: white;
                font-weight: bold;
            }
            QPushButton:hover {
                background-color: #0088ff;
            }
            QPushButton:pressed {
                background-color: #0055aa;
            }
            QTabWidget::pane {
                border: 1px solid #cccccc;
                border-radius: 4px;
                background-color: white;
            }
            QTabBar::tab {
                background-color: #e6f0ff;
                padding: 8px 15px;
                margin-right: 2px;
                border-top-left-radius: 4px;
                border-top-right-radius: 4px;
            }
            QTabBar::tab:selected {
                background-color: white;
                border-bottom: 2px solid #0066cc;
            }
        """)

        # 创建中心部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        # 主布局
        main_layout = QHBoxLayout(central_widget)
        main_layout.setContentsMargins(20, 20, 20, 20)
        main_layout.setSpacing(20)

        # 左侧：输入区域
        left_widget = QWidget()
        left_widget.setMinimumWidth(500)
        left_layout = QVBoxLayout(left_widget)

        # 添加标题
        title_label = QLabel("学生证件信息填写")
        title_label.setStyleSheet("""
            QLabel {
                font-size: 24px;
                font-weight: bold;
                color: #0066cc;
                padding: 10px 0;
            }
        """)
        title_label.setAlignment(Qt.AlignCenter)
        left_layout.addWidget(title_label)

        # 创建标签页
        self.tab_widget = QTabWidget()
        self.tab_widget.setStyleSheet(
            "QTabWidget::tab-bar {alignment: center;}")

        # 基本信息标签页
        self.create_basic_info_tab()

        # 学业信息标签页
        self.create_academic_info_tab()

        # 联系方式标签页
        self.create_contact_info_tab()

        left_layout.addWidget(self.tab_widget)

        # 添加按钮区域
        self.create_button_area(left_layout)

        # 右侧：预览和信息说明区域
        right_widget = QWidget()
        right_layout = QVBoxLayout(right_widget)

        # 预览区域
        preview_group = QGroupBox("证件预览")
        preview_layout = QVBoxLayout()

        self.preview_label = QLabel()
        self.preview_label.setAlignment(Qt.AlignCenter)
        self.preview_label.setMinimumSize(400, 300)
        self.preview_label.setStyleSheet("""
            QLabel {
                border: 2px solid #cccccc;
                border-radius: 8px;
                background-color: white;
            }
        """)

        # 创建默认预览
        self.create_default_preview()

        preview_layout.addWidget(self.preview_label)
        preview_group.setLayout(preview_layout)
        right_layout.addWidget(preview_group)

        # 信息说明区域
        info_group = QGroupBox("填写说明与提示")
        info_layout = QVBoxLayout()

        self.info_text = QTextEdit()
        self.info_text.setReadOnly(True)
        self.info_text.setMinimumHeight(200)
        self.info_text.setStyleSheet("""
            QTextEdit {
                font-size: 12px;
                background-color: #f9f9f9;
                border: 1px solid #e0e0e0;
                border-radius: 4px;
            }
        """)

        info_layout.addWidget(self.info_text)
        info_group.setLayout(info_layout)
        right_layout.addWidget(info_group)

        # 验证信息区域
        validation_group = QGroupBox("验证状态")
        validation_layout = QVBoxLayout()

        self.validation_label = QLabel("未验证")
        self.validation_label.setAlignment(Qt.AlignCenter)
        self.validation_label.setStyleSheet("""
            QLabel {
                font-size: 13px;
                padding: 8px;
                border-radius: 4px;
                background-color: #f0f0f0;
            }
        """)

        validation_layout.addWidget(self.validation_label)
        validation_group.setLayout(validation_layout)
        right_layout.addWidget(validation_group)

        # 添加到主布局
        main_layout.addWidget(left_widget, 2)
        main_layout.addWidget(right_widget, 1)

        # 连接信号
        self.connect_signals()

    def create_basic_info_tab(self):
        """创建基本信息标签页"""
        basic_tab = QWidget()
        layout = QVBoxLayout(basic_tab)
        layout.setSpacing(10)

        # 表单布局
        form_layout = QFormLayout()
        form_layout.setLabelAlignment(Qt.AlignRight)
        form_layout.setVerticalSpacing(15)
        form_layout.setHorizontalSpacing(20)

        # 姓名
        self.name_input = QLineEdit()
        self.name_input.setPlaceholderText("请输入真实姓名")
        self.name_input.setToolTip("请输入与学生证一致的姓名")
        form_layout.addRow(self.create_field_label("姓名*"), self.name_input)

        # 学号
        self.id_input = QLineEdit()
        self.id_input.setPlaceholderText("例如：2023123456")
        self.id_input.setToolTip("请输入8-12位数字学号")
        form_layout.addRow(self.create_field_label("学号*"), self.id_input)

        # 性别
        self.gender_combo = QComboBox()
        self.gender_combo.addItems(["男", "女"])
        form_layout.addRow(self.create_field_label("性别*"), self.gender_combo)

        # 出生日期
        self.birth_date = QDateEdit()
        self.birth_date.setCalendarPopup(True)
        self.birth_date.setDate(QDate(2000, 1, 1))
        self.birth_date.setDisplayFormat("yyyy-MM-dd")
        form_layout.addRow(self.create_field_label("出生日期*"), self.birth_date)

        # 身份证号
        self.id_card_input = QLineEdit()
        self.id_card_input.setPlaceholderText("18位身份证号（可选）")
        form_layout.addRow(self.create_field_label("身份证号"), self.id_card_input)

        # 民族
        self.nation_input = QLineEdit("汉族")
        form_layout.addRow(self.create_field_label("民族"), self.nation_input)

        # 政治面貌
        self.political_input = QComboBox()
        self.political_input.addItems(["群众", "共青团员", "中共党员", "民主党派"])
        form_layout.addRow(self.create_field_label(
            "政治面貌"), self.political_input)

        layout.addLayout(form_layout)
        layout.addStretch()

        self.tab_widget.addTab(basic_tab, "基本信息")

    def create_academic_info_tab(self):
        """创建学业信息标签页"""
        academic_tab = QWidget()
        layout = QVBoxLayout(academic_tab)
        layout.setSpacing(10)

        form_layout = QFormLayout()
        form_layout.setLabelAlignment(Qt.AlignRight)
        form_layout.setVerticalSpacing(15)
        form_layout.setHorizontalSpacing(20)

        # 学校名称
        self.school_input = QLineEdit("清华大学")
        form_layout.addRow(self.create_field_label("学校名称*"), self.school_input)

        # 学院
        self.college_input = QLineEdit("计算机科学与技术学院")
        form_layout.addRow(self.create_field_label("学院*"), self.college_input)

        # 专业
        self.major_input = QLineEdit("计算机科学与技术")
        form_layout.addRow(self.create_field_label("专业*"), self.major_input)

        # 班级
        self.class_input = QLineEdit("计科2301班")
        form_layout.addRow(self.create_field_label("班级*"), self.class_input)

        # 入学年份
        self.enroll_year = QSpinBox()
        self.enroll_year.setRange(2000, 2030)
        self.enroll_year.setValue(2023)
        form_layout.addRow(self.create_field_label("入学年份*"), self.enroll_year)

        # 学制
        self.education_system = QComboBox()
        self.education_system.addItems(["4年制", "5年制", "3年制", "2年制"])
        form_layout.addRow(self.create_field_label("学制"),
                           self.education_system)

        # 证件有效期
        self.valid_year = QComboBox()
        self.valid_year.addItems(["4年", "5年", "3年", "2年", "1年"])
        form_layout.addRow(self.create_field_label("有效期*"), self.valid_year)

        layout.addLayout(form_layout)
        layout.addStretch()

        self.tab_widget.addTab(academic_tab, "学业信息")

    def create_contact_info_tab(self):
        """创建联系方式标签页"""
        contact_tab = QWidget()
        layout = QVBoxLayout(contact_tab)
        layout.setSpacing(10)

        form_layout = QFormLayout()
        form_layout.setLabelAlignment(Qt.AlignRight)
        form_layout.setVerticalSpacing(15)
        form_layout.setHorizontalSpacing(20)

        # 联系电话
        self.phone_input = QLineEdit()
        self.phone_input.setPlaceholderText("11位手机号码")
        form_layout.addRow(self.create_field_label("联系电话"), self.phone_input)

        # 电子邮箱
        self.email_input = QLineEdit()
        self.email_input.setPlaceholderText("例如：student@school.edu.cn")
        form_layout.addRow(self.create_field_label("电子邮箱"), self.email_input)

        # 家庭地址
        self.address_input = QLineEdit()
        self.address_input.setPlaceholderText("省/市/区/详细地址")
        form_layout.addRow(self.create_field_label("家庭地址"), self.address_input)

        # 紧急联系人
        self.emergency_contact = QLineEdit()
        form_layout.addRow(self.create_field_label(
            "紧急联系人"), self.emergency_contact)

        # 紧急联系电话
        self.emergency_phone = QLineEdit()
        form_layout.addRow(self.create_field_label(
            "紧急联系电话"), self.emergency_phone)

        layout.addLayout(form_layout)

        # 添加照片上传区域
        photo_group = QGroupBox("照片上传")
        photo_layout = QVBoxLayout()

        self.photo_label = QLabel("未选择照片")
        self.photo_label.setAlignment(Qt.AlignCenter)
        self.photo_label.setMinimumHeight(100)
        self.photo_label.setStyleSheet("""
            QLabel {
                border: 2px dashed #cccccc;
                border-radius: 4px;
                background-color: #f9f9f9;
            }
        """)

        photo_button_layout = QHBoxLayout()
        self.upload_photo_btn = QPushButton("上传照片")
        self.clear_photo_btn = QPushButton("清除照片")

        photo_button_layout.addWidget(self.upload_photo_btn)
        photo_button_layout.addWidget(self.clear_photo_btn)

        photo_layout.addWidget(self.photo_label)
        photo_layout.addLayout(photo_button_layout)
        photo_group.setLayout(photo_layout)

        layout.addWidget(photo_group)
        layout.addStretch()

        self.tab_widget.addTab(contact_tab, "联系信息")

    def create_field_label(self, text):
        """创建字段标签"""
        label = QLabel(text)
        if text.endswith('*'):
            label.setStyleSheet("color: #ff4444; font-weight: bold;")
        else:
            label.setStyleSheet("color: #666666;")
        return label

    def create_button_area(self, layout):
        """创建按钮区域"""
        button_group = QGroupBox("操作面板")
        button_layout = QGridLayout()
        button_layout.setSpacing(10)

        # 第一行按钮
        self.generate_btn = QPushButton("🔧 生成证件")
        self.generate_btn.setToolTip("根据填写的信息生成证件")

        self.validate_btn = QPushButton("✅ 验证信息")
        self.validate_btn.setToolTip("验证所有填写的信息")

        self.save_btn = QPushButton("💾 保存证件")
        self.save_btn.setToolTip("保存生成的证件图片")

        button_layout.addWidget(self.generate_btn, 0, 0)
        button_layout.addWidget(self.validate_btn, 0, 1)
        button_layout.addWidget(self.save_btn, 0, 2)

        # 第二行按钮
        self.clear_btn = QPushButton("🗑️ 清空表单")
        self.clear_btn.setToolTip("清除所有填写的信息")

        self.load_template_btn = QPushButton("📁 加载模板")
        self.load_template_btn.setToolTip("加载证件模板")

        self.exit_btn = QPushButton("❌ 退出程序")
        self.exit_btn.setToolTip("退出程序")

        button_layout.addWidget(self.clear_btn, 1, 0)
        button_layout.addWidget(self.load_template_btn, 1, 1)
        button_layout.addWidget(self.exit_btn, 1, 2)

        # 设置按钮样式
        for btn in [self.generate_btn, self.validate_btn, self.save_btn,
                    self.clear_btn, self.load_template_btn, self.exit_btn]:
            btn.setMinimumHeight(40)

        button_group.setLayout(button_layout)
        layout.addWidget(button_group)

    def setup_fields_info(self):
        """设置字段的说明信息"""
        self.field_info = {
            "name": {
                "description": "请输入学生的真实姓名，应与身份证件上的姓名完全一致。",
                "requirements": "• 必须为中文汉字\n• 长度2-4个字\n• 不包含特殊字符",
                "example": "正确：张三、李四、王小明\n错误：zhangsan、A123、张*三"
            },
            "student_id": {
                "description": "请输入完整的学号，通常是学校分配的唯一标识符。",
                "requirements": "• 8-12位数字\n• 以年份开头\n• 不包含字母和特殊字符",
                "example": "正确：2023123456、20230001\n错误：2023ABC、1234567、202312345678901"
            },
            "gender": {
                "description": "请选择学生的性别。",
                "requirements": "• 从下拉列表中选择\n• 必须选择一项",
                "example": "可选：男、女"
            },
            "birth_date": {
                "description": "请选择学生的出生日期。",
                "requirements": "• 使用日期选择器\n• 格式：YYYY-MM-DD\n• 必须在有效年龄范围内",
                "example": "格式：2000-01-01、2005-12-31"
            },
            "id_card": {
                "description": "请输入18位身份证号码（可选填）。",
                "requirements": "• 18位数字或最后一位为X\n• 符合身份证号码规则",
                "example": "正确：41010120000101001X\n错误：1234567890、ABCDEFGHIJKLMNOPQR"
            },
            "school": {
                "description": "请输入学校全称。",
                "requirements": "• 完整的学校名称\n• 不超过30个字符",
                "example": "正确：清华大学、北京大学、复旦大学\n错误：清华、PKU、FDU"
            },
            "college": {
                "description": "请输入学院全称。",
                "requirements": "• 完整的学院名称\n• 以'学院'结尾",
                "example": "正确：计算机科学与技术学院、医学院、文学院"
            },
            "major": {
                "description": "请输入专业全称。",
                "requirements": "• 完整的专业名称\n• 准确的专业描述",
                "example": "正确：计算机科学与技术、临床医学、英语"
            },
            "class": {
                "description": "请输入班级全称，包含年级和专业信息。",
                "requirements": "• 包含年级信息\n• 包含班级编号\n• 以'班'结尾",
                "example": "正确：计科2301班、英语2203班、临床2105班"
            }
        }

    def connect_signals(self):
        """连接信号和槽"""
        # 输入字段变化时更新信息说明
        self.name_input.textChanged.connect(
            lambda: self.update_field_info("name"))
        self.id_input.textChanged.connect(
            lambda: self.update_field_info("student_id"))
        self.gender_combo.currentTextChanged.connect(
            lambda: self.update_field_info("gender"))
        self.birth_date.dateChanged.connect(
            lambda: self.update_field_info("birth_date"))
        self.id_card_input.textChanged.connect(
            lambda: self.update_field_info("id_card"))
        self.school_input.textChanged.connect(
            lambda: self.update_field_info("school"))
        self.college_input.textChanged.connect(
            lambda: self.update_field_info("college"))
        self.major_input.textChanged.connect(
            lambda: self.update_field_info("major"))
        self.class_input.textChanged.connect(
            lambda: self.update_field_info("class"))

        # 标签页切换时更新信息
        self.tab_widget.currentChanged.connect(self.update_tab_info)

        # 按钮点击事件
        self.generate_btn.clicked.connect(self.generate_id_card)
        self.validate_btn.clicked.connect(self.validate_fields)
        self.save_btn.clicked.connect(self.save_id_card)
        self.clear_btn.clicked.connect(self.clear_form)
        self.load_template_btn.clicked.connect(self.load_template)
        self.exit_btn.clicked.connect(self.close)
        self.upload_photo_btn.clicked.connect(self.upload_photo)
        self.clear_photo_btn.clicked.connect(self.clear_photo)

    def update_field_info(self, field_name):
        """更新字段说明信息"""
        if field_name in self.field_info:
            info = self.field_info[field_name]
            html = f"""
            <div style="margin: 10px;">
                <h3 style="color: #0066cc;">{field_name.upper()} 字段说明</h3>
                <p><strong>描述：</strong>{info['description']}</p>
                <p><strong>要求：</strong></p>
                <pre style="background-color: #f0f0f0; padding: 5px; border-radius: 3px;">{info['requirements']}</pre>
                <p><strong>示例：</strong></p>
                <pre style="background-color: #f0f8ff; padding: 5px; border-radius: 3px; color: #006600;">{info['example']}</pre>
            </div>
            """
            self.info_text.setHtml(html)

    def update_tab_info(self, index):
        """更新标签页信息"""
        tab_names = ["基本信息", "学业信息", "联系信息"]
        current_tab = tab_names[index]

        if current_tab == "基本信息":
            info = """
            <div style="margin: 10px;">
                <h2 style="color: #0066cc;">📋 基本信息填写说明</h2>
                <p><strong>本节包含学生的个人基本信息，所有带*的字段为必填项。</strong></p>
                
                <h3>🔸 填写要点：</h3>
                <ol>
                    <li><strong>姓名</strong>：必须与身份证件一致</li>
                    <li><strong>学号</strong>：学校分配的唯一标识</li>
                    <li><strong>性别</strong>：从下拉列表中选择</li>
                    <li><strong>出生日期</strong>：使用日期选择器</li>
                </ol>
                
                <h3>⚠️ 注意事项：</h3>
                <ul>
                    <li>确保信息的准确性和真实性</li>
                    <li>身份证号填写后请仔细核对</li>
                    <li>所有信息将直接显示在证件上</li>
                </ul>
            </div>
            """

        elif current_tab == "学业信息":
            info = """
            <div style="margin: 10px;">
                <h2 style="color: #0066cc;">🎓 学业信息填写说明</h2>
                <p><strong>本节包含学生的学业相关信息，这些信息将显示在证件上。</strong></p>
                
                <h3>🔸 填写要点：</h3>
                <ol>
                    <li><strong>学校名称</strong>：填写完整、准确的学校名称</li>
                    <li><strong>学院</strong>：填写就读学院的全称</li>
                    <li><strong>专业</strong>：填写所学专业的全称</li>
                    <li><strong>班级</strong>：按格式填写班级信息</li>
                </ol>
                
                <h3>📅 时间信息：</h3>
                <ul>
                    <li>入学年份：选择正确的入学年份</li>
                    <li>证件有效期：选择证件的有效期限</li>
                </ul>
            </div>
            """

        else:  # 联系信息
            info = """
            <div style="margin: 10px;">
                <h2 style="color: #0066cc;">📞 联系信息填写说明</h2>
                <p><strong>本节包含学生的联系方式信息，这些信息为可选填项。</strong></p>
                
                <h3>🔸 填写要点：</h3>
                <ol>
                    <li><strong>联系电话</strong>：填写有效的手机号码</li>
                    <li><strong>电子邮箱</strong>：填写常用的邮箱地址</li>
                    <li><strong>家庭地址</strong>：填写详细住址（可选）</li>
                </ol>
                
                <h3>🖼️ 照片上传：</h3>
                <ul>
                    <li>支持JPG、PNG格式</li>
                    <li>建议使用证件照</li>
                    <li>大小不超过5MB</li>
                </ul>
                
                <h3>⚠️ 隐私提示：</h3>
                <p>联系方式信息不会显示在证件正面，仅用于存档。</p>
            </div>
            """

        self.info_text.setHtml(info)

    def create_default_preview(self):
        """创建默认预览"""
        # 创建一个简单的预览图片
        pixmap = QPixmap(400, 300)
        pixmap.fill(Qt.white)

        # 在QPixmap上绘制简单的预览
        from PyQt5.QtGui import QPainter, QPen, QBrush
        painter = QPainter(pixmap)

        # 绘制边框
        painter.setPen(QPen(Qt.gray, 2))
        painter.drawRect(20, 20, 360, 260)

        # 绘制标题
        painter.setPen(Qt.blue)
        painter.setFont(QFont("Arial", 20, QFont.Bold))
        painter.drawText(100, 60, "学生证预览")

        # 绘制提示文字
        painter.setPen(Qt.gray)
        painter.setFont(QFont("Arial", 12))
        painter.drawText(100, 150, "填写信息后生成证件")
        painter.drawText(120, 180, "点击【生成证件】按钮")

        painter.end()

        self.preview_label.setPixmap(pixmap)

    def validate_fields(self):
        """验证所有字段"""
        errors = []

        # 验证姓名
        if not self.name_input.text().strip():
            errors.append("姓名不能为空")
        elif len(self.name_input.text()) < 2 or len(self.name_input.text()) > 4:
            errors.append("姓名应为2-4个汉字")

        # 验证学号
        if not self.id_input.text().strip():
            errors.append("学号不能为空")
        elif not self.id_input.text().isdigit():
            errors.append("学号必须为数字")
        elif len(self.id_input.text()) < 8 or len(self.id_input.text()) > 12:
            errors.append("学号应为8-12位数字")

        # 验证学校
        if not self.school_input.text().strip():
            errors.append("学校名称不能为空")

        # 验证学院
        if not self.college_input.text().strip():
            errors.append("学院不能为空")

        # 验证专业
        if not self.major_input.text().strip():
            errors.append("专业不能为空")

        # 验证班级
        if not self.class_input.text().strip():
            errors.append("班级不能为空")

        # 验证身份证号（如果填写了）
        if self.id_card_input.text().strip():
            id_card = self.id_card_input.text().strip()
            if len(id_card) != 18:
                errors.append("身份证号应为18位")
            elif not (id_card[:-1].isdigit() and (id_card[-1].isdigit() or id_card[-1].upper() == 'X')):
                errors.append("身份证号格式不正确")

        # 验证手机号（如果填写了）
        if self.phone_input.text().strip():
            phone = self.phone_input.text().strip()
            if not phone.isdigit() or len(phone) != 11:
                errors.append("手机号应为11位数字")

        # 显示验证结果
        if errors:
            error_text = "❌ 验证失败，发现以下错误：\n\n" + \
                "\n".join(f"• {error}" for error in errors)
            self.validation_label.setText(error_text)
            self.validation_label.setStyleSheet("""
                QLabel {
                    font-size: 13px;
                    padding: 8px;
                    border-radius: 4px;
                    background-color: #ffe6e6;
                    color: #cc0000;
                }
            """)

            # 在信息框中显示详细错误
            error_html = """
            <div style="margin: 10px; color: #cc0000;">
                <h3>❌ 验证发现错误：</h3>
                <ul>
            """
            for error in errors:
                error_html += f"<li>{error}</li>"
            error_html += """
                </ul>
                <p>请修正以上错误后重新验证。</p>
            </div>
            """
            self.info_text.setHtml(error_html)

        else:
            self.validation_label.setText("✅ 所有信息验证通过！")
            self.validation_label.setStyleSheet("""
                QLabel {
                    font-size: 13px;
                    padding: 8px;
                    border-radius: 4px;
                    background-color: #e6ffe6;
                    color: #006600;
                }
            """)

            # 显示成功信息
            success_html = """
            <div style="margin: 10px; color: #006600;">
                <h3>✅ 验证成功！</h3>
                <p>所有填写的信息格式正确。</p>
                <p>您可以点击【生成证件】按钮来创建证件。</p>
                
                <h4>📄 已填写信息概览：</h4>
                <table style="width: 100%; border-collapse: collapse;">
                    <tr><td><strong>姓名：</strong></td><td>%s</td></tr>
                    <tr><td><strong>学号：</strong></td><td>%s</td></tr>
                    <tr><td><strong>学校：</strong></td><td>%s</td></tr>
                    <tr><td><strong>专业：</strong></td><td>%s</td></tr>
                </table>
            </div>
            """ % (self.name_input.text(), self.id_input.text(),
                   self.school_input.text(), self.major_input.text())
            self.info_text.setHtml(success_html)

    def generate_id_card(self):
        """生成学生证件"""
        try:
            # 先验证
            errors = []
            if not self.name_input.text().strip():
                errors.append("姓名不能为空")

            if errors:
                QMessageBox.warning(self, "生成失败", "请先填写必填信息！")
                return

            # 创建证件图片
            width, height = 600, 400
            image = Image.new('RGB', (width, height), 'white')
            draw = ImageDraw.Draw(image)

            # 尝试加载字体
            try:
                # 使用PIL的默认字体
                font_large = ImageFont.load_default()
                font_normal = ImageFont.load_default()
                font_small = ImageFont.load_default()
            except:
                # 如果默认字体失败，使用内置字体
                font_large = ImageFont.load_default()
                font_normal = ImageFont.load_default()
                font_small = ImageFont.load_default()

            # 绘制背景
            draw.rectangle([(0, 0), (width, height)], outline='black', width=3)

            # 绘制标题
            title = "学 生 证"
            # 计算标题位置
            title_width = 200
            title_x = (width - title_width) // 2
            draw.rectangle(
                [(title_x, 20), (title_x + title_width, 60)], outline='blue', width=2)
            draw.text((title_x + 10, 30), title, fill='blue')

            # 绘制基本信息
            info_y = 100
            line_height = 30

            info_items = [
                f"姓名：{self.name_input.text()}",
                f"学号：{self.id_input.text()}",
                f"性别：{self.gender_combo.currentText()}",
                f"出生日期：{self.birth_date.date().toString('yyyy-MM-dd')}",
                f"学校：{self.school_input.text()}",
                f"学院：{self.college_input.text()}",
                f"专业：{self.major_input.text()}",
                f"班级：{self.class_input.text()}",
                f"入学年份：{self.enroll_year.value()}年"
            ]

            for i, item in enumerate(info_items):
                draw.text((50, info_y + i * line_height), item, fill='black')

            # 绘制有效期
            valid_year = self.valid_year.currentText()
            draw.text(
                (50, height - 50), f"有效期：{self.enroll_year.value()}年-{self.enroll_year.value() + int(valid_year[0])}年", fill='darkred')

            # 绘制证件编号
            draw.text((width - 200, height - 30),
                      f"编号：{self.id_input.text()}", fill='gray')

            # 保存为临时文件用于预览
            temp_path = "temp_id_card.png"
            image.save(temp_path)

            # 在预览中显示
            pixmap = QPixmap(temp_path)
            self.preview_label.setPixmap(pixmap.scaled(
                self.preview_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))

            # 更新验证状态
            self.validation_label.setText("✅ 证件生成成功！")
            self.validation_label.setStyleSheet("""
                QLabel {
                    font-size: 13px;
                    padding: 8px;
                    border-radius: 4px;
                    background-color: #e6ffe6;
                    color: #006600;
                }
            """)

            # 保存生成的图片路径
            self.generated_image = image

            QMessageBox.information(
                self, "生成成功", "学生证件已生成！\n点击【保存证件】按钮可保存为图片文件。")

        except Exception as e:
            QMessageBox.critical(self, "生成失败", f"生成证件时出错：\n{str(e)}")

    def save_id_card(self):
        """保存学生证件"""
        try:
            if not hasattr(self, 'generated_image'):
                QMessageBox.warning(self, "保存失败", "请先生成证件！")
                return

            # 获取保存路径
            default_name = f"学生证_{self.name_input.text()}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
            file_path, _ = QFileDialog.getSaveFileName(
                self, "保存证件", default_name, "图片文件 (*.png *.jpg *.jpeg)"
            )

            if file_path:
                # 确保文件扩展名
                if not file_path.lower().endswith(('.png', '.jpg', '.jpeg')):
                    file_path += '.png'

                # 保存图片
                self.generated_image.save(file_path)

                QMessageBox.information(self, "保存成功", f"证件已保存到：\n{file_path}")

        except Exception as e:
            QMessageBox.critical(self, "保存失败", f"保存证件时出错：\n{str(e)}")

    def clear_form(self):
        """清空表单"""
        reply = QMessageBox.question(
            self, "确认清空", "确定要清空所有填写的信息吗？",
            QMessageBox.Yes | QMessageBox.No, QMessageBox.No
        )

        if reply == QMessageBox.Yes:
            # 清空所有输入框
            self.name_input.clear()
            self.id_input.clear()
            self.gender_combo.setCurrentIndex(0)
            self.birth_date.setDate(QDate(2000, 1, 1))
            self.id_card_input.clear()
            self.nation_input.setText("汉族")
            self.political_input.setCurrentIndex(0)
            self.school_input.clear()
            self.college_input.clear()
            self.major_input.clear()
            self.class_input.clear()
            self.enroll_year.setValue(2023)
            self.education_system.setCurrentIndex(0)
            self.valid_year.setCurrentIndex(0)
            self.phone_input.clear()
            self.email_input.clear()
            self.address_input.clear()
            self.emergency_contact.clear()
            self.emergency_phone.clear()

            # 清空照片
            self.clear_photo()

            # 重置预览
            self.create_default_preview()

            # 重置验证状态
            self.validation_label.setText("未验证")
            self.validation_label.setStyleSheet("""
                QLabel {
                    font-size: 13px;
                    padding: 8px;
                    border-radius: 4px;
                    background-color: #f0f0f0;
                }
            """)

            QMessageBox.information(self, "已清空", "所有信息已清空！")

    def load_template(self):
        """加载模板"""
        QMessageBox.information(self, "模板功能", "模板加载功能开发中...")

    def upload_photo(self):
        """上传照片"""
        file_path, _ = QFileDialog.getOpenFileName(
            self, "选择照片", "", "图片文件 (*.png *.jpg *.jpeg *.bmp)"
        )

        if file_path:
            # 显示照片信息
            file_name = os.path.basename(file_path)
            self.photo_label.setText(f"已选择：{file_name}\n点击【生成证件】时使用")
            self.photo_label.setStyleSheet("""
                QLabel {
                    border: 2px solid #66cc66;
                    border-radius: 4px;
                    background-color: #f0fff0;
                }
            """)

            # 保存照片路径
            self.photo_path = file_path

    def clear_photo(self):
        """清除照片"""
        self.photo_label.setText("未选择照片")
        self.photo_label.setStyleSheet("""
            QLabel {
                border: 2px dashed #cccccc;
                border-radius: 4px;
                background-color: #f9f9f9;
            }
        """)
        if hasattr(self, 'photo_path'):
            delattr(self, 'photo_path')

    def closeEvent(self, event):
        """关闭事件"""
        reply = QMessageBox.question(
            self, "确认退出", "确定要退出学生证件生成器吗？",
            QMessageBox.Yes | QMessageBox.No, QMessageBox.No
        )

        if reply == QMessageBox.Yes:
            # 清理临时文件
            if os.path.exists("temp_id_card.png"):
                os.remove("temp_id_card.png")
            event.accept()
        else:
            event.ignore()


def main():
    app = QApplication(sys.argv)

    # 设置应用程序样式
    app.setStyle('Fusion')

    # 设置调色板
    palette = QPalette()
    palette.setColor(QPalette.Window, QColor(240, 240, 240))
    app.setPalette(palette)

    generator = IDCardGenerator()
    generator.show()

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
