import sys
import sqlite3
import datetime
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, 
                            QCalendarWidget, QLabel, QPushButton, QLineEdit, QTextEdit, 
                            QTableWidget, QTableWidgetItem, QTabWidget, QDialog, QFormLayout, 
                            QComboBox, QMessageBox, QListWidget, QListWidgetItem, QSplitter, 
                            QGridLayout, QFrame, QHeaderView, QDateEdit, QTimeEdit, QCheckBox)
from PyQt5.QtCore import Qt, QDate, QTime, QDateTime, pyqtSignal
from PyQt5.QtGui import QFont, QIcon, QColor, QPalette, QBrush


class DatabaseManager:
    """SQLite 데이터베이스 관리 클래스"""
    
    def __init__(self, db_name="scheduler.db"):
        """
        데이터베이스 초기화
        
        Args:
            db_name (str): 데이터베이스 파일명
        """
        self.conn = sqlite3.connect(db_name)
        self.cursor = self.conn.cursor()
        self.setup_database()
    
    def setup_database(self):
        """데이터베이스 테이블 생성"""
        # 사용자 테이블
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT UNIQUE NOT NULL,
            password TEXT NOT NULL,
            full_name TEXT,
            department TEXT,
            role TEXT,
            is_admin INTEGER DEFAULT 0
        )
        ''')
        
        # 일정 테이블
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS schedules (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            description TEXT,
            start_date TEXT NOT NULL,
            end_date TEXT,
            start_time TEXT,
            end_time TEXT,
            created_by INTEGER,
            assigned_to INTEGER,
            priority TEXT,
            status TEXT DEFAULT "미완료",
            is_completed INTEGER DEFAULT 0,
            is_public INTEGER DEFAULT 1,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (created_by) REFERENCES users (id),
            FOREIGN KEY (assigned_to) REFERENCES users (id)
        )
        ''')
        
        # 공지사항 테이블 - 스키마 수정
        self.cursor.execute('DROP TABLE IF EXISTS notices')  # 기존 테이블 삭제
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS notices (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            content TEXT,
            created_by INTEGER,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (created_by) REFERENCES users (id)
        )
        ''')
        
        # 기본 관리자 계정 생성 (최초 실행 시)
        self.cursor.execute("SELECT * FROM users WHERE username='admin'")
        if not self.cursor.fetchone():
            self.cursor.execute('''
            INSERT INTO users (username, password, full_name, role, is_admin)
            VALUES ('admin', 'admin123', '관리자', '시스템 관리자', 1)
            ''')
        
        self.conn.commit()
    
    def add_user(self, username, password, full_name, department, role, is_admin=0):
        """사용자 추가"""
        try:
            self.cursor.execute('''
            INSERT INTO users (username, password, full_name, department, role, is_admin)
            VALUES (?, ?, ?, ?, ?, ?)
            ''', (username, password, full_name, department, role, is_admin))
            self.conn.commit()
            return True, "사용자가 성공적으로 추가되었습니다."
        except sqlite3.IntegrityError:
            return False, "이미 존재하는 사용자명입니다."
        except Exception as e:
            return False, f"오류 발생: {str(e)}"
    
    def authenticate_user(self, username, password):
        """사용자 인증"""
        self.cursor.execute('''
        SELECT id, username, full_name, department, role, is_admin 
        FROM users 
        WHERE username=? AND password=?
        ''', (username, password))
        return self.cursor.fetchone()
    
    def get_all_users(self):
        """모든 사용자 조회"""
        self.cursor.execute("SELECT id, username, full_name, department, role FROM users")
        return self.cursor.fetchall()
    
    def add_schedule(self, title, description, start_date, end_date, start_time, end_time, 
                    created_by, assigned_to, priority, is_public=1):
        """일정 추가"""
        try:
            self.cursor.execute('''
            INSERT INTO schedules 
            (title, description, start_date, end_date, start_time, end_time, 
            created_by, assigned_to, priority, is_public)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            ''', (title, description, start_date, end_date, start_time, end_time, 
                created_by, assigned_to, priority, is_public))
            self.conn.commit()
            return True, "일정이 성공적으로 추가되었습니다."
        except Exception as e:
            return False, f"오류 발생: {str(e)}"
    
    def update_schedule(self, schedule_id, title, description, start_date, end_date, 
                        start_time, end_time, assigned_to, priority, is_public):
        """일정 업데이트"""
        try:
            self.cursor.execute('''
            UPDATE schedules 
            SET title=?, description=?, start_date=?, end_date=?, start_time=?, 
                end_time=?, assigned_to=?, priority=?, is_public=?
            WHERE id=?
            ''', (title, description, start_date, end_date, start_time, 
                end_time, assigned_to, priority, is_public, schedule_id))
            self.conn.commit()
            return True, "일정이 성공적으로 업데이트 되었습니다."
        except Exception as e:
            return False, f"오류 발생: {str(e)}"
    
    def delete_schedule(self, schedule_id):
        """일정 삭제"""
        try:
            self.cursor.execute("DELETE FROM schedules WHERE id=?", (schedule_id,))
            self.conn.commit()
            return True, "일정이 성공적으로 삭제되었습니다."
        except Exception as e:
            return False, f"오류 발생: {str(e)}"
    
    def mark_schedule_completed(self, schedule_id, is_completed):
        """일정 완료 상태 변경"""
        status = "완료" if is_completed else "미완료"
        try:
            self.cursor.execute('''
            UPDATE schedules SET is_completed=?, status=? WHERE id=?
            ''', (is_completed, status, schedule_id))
            self.conn.commit()
            return True, f"일정 상태가 '{status}'로 변경되었습니다."
        except Exception as e:
            return False, f"오류 발생: {str(e)}"
    
    def get_all_schedules(self):
        """모든 일정 조회"""
        self.cursor.execute('''
        SELECT s.id, s.title, s.description, s.start_date, s.end_date, 
               s.start_time, s.end_time, s.created_by, s.assigned_to, 
               s.priority, s.status, s.is_completed, s.is_public,
               u1.full_name as creator_name, u2.full_name as assignee_name
        FROM schedules s
        LEFT JOIN users u1 ON s.created_by = u1.id
        LEFT JOIN users u2 ON s.assigned_to = u2.id
        ORDER BY s.start_date, s.start_time
        ''')
        return self.cursor.fetchall()
    
    def get_user_schedules(self, user_id):
        """특정 사용자에게 할당된 일정 조회"""
        self.cursor.execute('''
        SELECT s.id, s.title, s.description, s.start_date, s.end_date, 
               s.start_time, s.end_time, s.created_by, s.assigned_to, 
               s.priority, s.status, s.is_completed, s.is_public,
               u1.full_name as creator_name, u2.full_name as assignee_name
        FROM schedules s
        LEFT JOIN users u1 ON s.created_by = u1.id
        LEFT JOIN users u2 ON s.assigned_to = u2.id
        WHERE s.assigned_to=? OR s.is_public=1
        ORDER BY s.start_date, s.start_time
        ''', (user_id,))
        return self.cursor.fetchall()
    
    def get_schedules_by_date(self, date):
        """특정 날짜의 일정 조회"""
        self.cursor.execute('''
        SELECT s.id, s.title, s.description, s.start_date, s.end_date, 
               s.start_time, s.end_time, s.created_by, s.assigned_to, 
               s.priority, s.status, s.is_completed, s.is_public,
               u1.full_name as creator_name, u2.full_name as assignee_name
        FROM schedules s
        LEFT JOIN users u1 ON s.created_by = u1.id
        LEFT JOIN users u2 ON s.assigned_to = u2.id
        WHERE s.start_date=? OR (s.start_date <= ? AND s.end_date >= ?)
        ORDER BY s.start_time
        ''', (date, date, date))
        return self.cursor.fetchall()
    
    def get_user_schedules_by_date(self, user_id, date):
        """특정 사용자의 특정 날짜 일정 조회"""
        self.cursor.execute('''
        SELECT s.id, s.title, s.description, s.start_date, s.end_date, 
               s.start_time, s.end_time, s.created_by, s.assigned_to, 
               s.priority, s.status, s.is_completed, s.is_public,
               u1.full_name as creator_name, u2.full_name as assignee_name
        FROM schedules s
        LEFT JOIN users u1 ON s.created_by = u1.id
        LEFT JOIN users u2 ON s.assigned_to = u2.id
        WHERE (s.assigned_to=? OR s.is_public=1) 
              AND (s.start_date=? OR (s.start_date <= ? AND s.end_date >= ?))
        ORDER BY s.start_time
        ''', (user_id, date, date, date))
        return self.cursor.fetchall()
        
    def add_notice(self, title, content, created_by):
        """공지사항 추가"""
        try:
            self.cursor.execute('''
            INSERT INTO notices (title, content, created_by)
            VALUES (?, ?, ?)
            ''', (title, content, created_by))
            self.conn.commit()
            return True, "공지사항이 성공적으로 추가되었습니다."
        except Exception as e:
            return False, f"오류 발생: {str(e)}"
    
    def get_all_notices(self):
        """모든 공지사항 조회"""
        self.cursor.execute('''
        SELECT n.id, n.title, n.content, n.created_at, u.full_name
        FROM notices n
        LEFT JOIN users u ON n.created_by = u.id
        ORDER BY n.created_at DESC
        ''')
        return self.cursor.fetchall()
    
    def close(self):
        """DB 연결 종료"""
        self.conn.close()


class LoginDialog(QDialog):
    """로그인 다이얼로그"""
    
    def __init__(self, db_manager):
        super().__init__()
        self.db_manager = db_manager
        self.user_data = None
        self.init_ui()
    
    def init_ui(self):
        """UI 초기화"""
        self.setWindowTitle("로그인")
        self.setGeometry(300, 300, 300, 150)
        
        layout = QVBoxLayout()
        
        # 로고 혹은 제목
        title_label = QLabel("일정 관리 시스템")
        title_label.setAlignment(Qt.AlignCenter)
        title_label.setFont(QFont("Arial", 16, QFont.Bold))
        layout.addWidget(title_label)
        
        # 로그인 폼
        form_layout = QFormLayout()
        
        self.username_edit = QLineEdit()
        self.password_edit = QLineEdit()
        self.password_edit.setEchoMode(QLineEdit.Password)
        
        form_layout.addRow("사용자명:", self.username_edit)
        form_layout.addRow("비밀번호:", self.password_edit)
        
        layout.addLayout(form_layout)
        
        # 로그인 버튼
        self.login_button = QPushButton("로그인")
        self.login_button.clicked.connect(self.login)
        layout.addWidget(self.login_button)
        
        self.setLayout(layout)
    
    def login(self):
        """로그인 처리"""
        username = self.username_edit.text()
        password = self.password_edit.text()
        
        if not username or not password:
            QMessageBox.warning(self, "경고", "사용자명과 비밀번호를 입력하세요.")
            return
        
        user_data = self.db_manager.authenticate_user(username, password)
        
        if user_data:
            self.user_data = user_data
            self.accept()
        else:
            QMessageBox.warning(self, "로그인 실패", "사용자명 또는 비밀번호가 올바르지 않습니다.")


class ScheduleDialog(QDialog):
    """일정 추가/수정 다이얼로그"""
    
    def __init__(self, db_manager, user_id, schedule_data=None):
        super().__init__()
        self.db_manager = db_manager
        self.user_id = user_id
        self.schedule_data = schedule_data  # 수정 시 기존 일정 데이터
        self.init_ui()
    
    def init_ui(self):
        """UI 초기화"""
        if self.schedule_data:
            self.setWindowTitle("일정 수정")
        else:
            self.setWindowTitle("일정 추가")
        
        self.setGeometry(300, 300, 500, 450)
        
        layout = QVBoxLayout()
        
        form_layout = QFormLayout()
        
        # 제목
        self.title_edit = QLineEdit()
        form_layout.addRow("제목:", self.title_edit)
        
        # 설명
        self.description_edit = QTextEdit()
        form_layout.addRow("설명:", self.description_edit)
        
        # 시작 날짜
        self.start_date_edit = QDateEdit()
        self.start_date_edit.setCalendarPopup(True)
        self.start_date_edit.setDate(QDate.currentDate())
        form_layout.addRow("시작 날짜:", self.start_date_edit)
        
        # 종료 날짜
        self.end_date_edit = QDateEdit()
        self.end_date_edit.setCalendarPopup(True)
        self.end_date_edit.setDate(QDate.currentDate())
        form_layout.addRow("종료 날짜:", self.end_date_edit)
        
        # 시작 시간
        self.start_time_edit = QTimeEdit()
        self.start_time_edit.setTime(QTime.currentTime())
        form_layout.addRow("시작 시간:", self.start_time_edit)
        
        # 종료 시간
        self.end_time_edit = QTimeEdit()
        current_time = QTime.currentTime()
        self.end_time_edit.setTime(QTime(current_time.hour() + 1, current_time.minute()))
        form_layout.addRow("종료 시간:", self.end_time_edit)
        
        # 담당자
        self.assignee_combo = QComboBox()
        users = self.db_manager.get_all_users()
        for user in users:
            self.assignee_combo.addItem(f"{user[2]} ({user[3]})", user[0])
        form_layout.addRow("담당자:", self.assignee_combo)
        
        # 우선순위
        self.priority_combo = QComboBox()
        self.priority_combo.addItems(["높음", "중간", "낮음"])
        form_layout.addRow("우선순위:", self.priority_combo)
        
        # 공개 여부
        self.public_check = QCheckBox("공개 일정")
        self.public_check.setChecked(True)
        form_layout.addRow("공개:", self.public_check)
        
        layout.addLayout(form_layout)
        
        # 버튼
        button_layout = QHBoxLayout()
        
        self.save_button = QPushButton("저장")
        self.save_button.clicked.connect(self.save_schedule)
        
        self.cancel_button = QPushButton("취소")
        self.cancel_button.clicked.connect(self.reject)
        
        button_layout.addWidget(self.save_button)
        button_layout.addWidget(self.cancel_button)
        
        layout.addLayout(button_layout)
        
        self.setLayout(layout)
        
        # 기존 데이터 로드 (수정 시)
        if self.schedule_data:
            self.load_schedule_data()
    
    def load_schedule_data(self):
        """기존 일정 데이터 로드"""
        schedule = self.schedule_data
        
        self.title_edit.setText(schedule[1])
        self.description_edit.setText(schedule[2])
        
        start_date = QDate.fromString(schedule[3], "yyyy-MM-dd")
        if schedule[4]:  # 종료 날짜가 있을 경우
            end_date = QDate.fromString(schedule[4], "yyyy-MM-dd")
        else:
            end_date = start_date
        
        self.start_date_edit.setDate(start_date)
        self.end_date_edit.setDate(end_date)
        
        if schedule[5]:  # 시작 시간이 있을 경우
            start_time = QTime.fromString(schedule[5], "HH:mm")
            self.start_time_edit.setTime(start_time)
        
        if schedule[6]:  # 종료 시간이 있을 경우
            end_time = QTime.fromString(schedule[6], "HH:mm")
            self.end_time_edit.setTime(end_time)
        
        # 담당자 설정
        assignee_id = schedule[8]
        for i in range(self.assignee_combo.count()):
            if self.assignee_combo.itemData(i) == assignee_id:
                self.assignee_combo.setCurrentIndex(i)
                break
        
        # 우선순위
        priority_index = {"높음": 0, "중간": 1, "낮음": 2}.get(schedule[9], 1)
        self.priority_combo.setCurrentIndex(priority_index)
        
        # 공개 여부
        self.public_check.setChecked(bool(schedule[12]))
    
    def save_schedule(self):
        """일정 저장"""
        title = self.title_edit.text()
        description = self.description_edit.toPlainText()
        
        if not title:
            QMessageBox.warning(self, "입력 오류", "제목을 입력하세요.")
            return
        
        start_date = self.start_date_edit.date().toString("yyyy-MM-dd")
        end_date = self.end_date_edit.date().toString("yyyy-MM-dd")
        start_time = self.start_time_edit.time().toString("HH:mm")
        end_time = self.end_time_edit.time().toString("HH:mm")
        
        assignee_id = self.assignee_combo.currentData()
        priority = self.priority_combo.currentText()
        is_public = 1 if self.public_check.isChecked() else 0
        
        if self.schedule_data:  # 일정 수정
            schedule_id = self.schedule_data[0]
            success, message = self.db_manager.update_schedule(
                schedule_id, title, description, start_date, end_date,
                start_time, end_time, assignee_id, priority, is_public
            )
        else:  # 새 일정 추가
            success, message = self.db_manager.add_schedule(
                title, description, start_date, end_date, start_time, end_time,
                self.user_id, assignee_id, priority, is_public
            )
        
        if success:
            QMessageBox.information(self, "성공", message)
            self.accept()
        else:
            QMessageBox.warning(self, "실패", message)


class NoticeDialog(QDialog):
    """공지사항 추가 다이얼로그"""
    
    def __init__(self, db_manager, user_id):
        super().__init__()
        self.db_manager = db_manager
        self.user_id = user_id
        self.init_ui()
    
    def init_ui(self):
        """UI 초기화"""
        self.setWindowTitle("공지사항 작성")
        self.setGeometry(300, 300, 500, 400)
        
        layout = QVBoxLayout()
        
        # 제목
        title_label = QLabel("제목:")
        self.title_edit = QLineEdit()
        layout.addWidget(title_label)
        layout.addWidget(self.title_edit)
        
        # 내용
        content_label = QLabel("내용:")
        self.content_edit = QTextEdit()
        layout.addWidget(content_label)
        layout.addWidget(self.content_edit)
        
        # 버튼
        button_layout = QHBoxLayout()
        
        self.save_button = QPushButton("저장")
        self.save_button.clicked.connect(self.save_notice)
        
        self.cancel_button = QPushButton("취소")
        self.cancel_button.clicked.connect(self.reject)
        
        button_layout.addWidget(self.save_button)
        button_layout.addWidget(self.cancel_button)
        
        layout.addLayout(button_layout)
        
        self.setLayout(layout)
    
    def save_notice(self):
        """공지사항 저장"""
        title = self.title_edit.text()
        content = self.content_edit.toPlainText()
        
        if not title:
            QMessageBox.warning(self, "입력 오류", "제목을 입력하세요.")
            return
        
        success, message = self.db_manager.add_notice(title, content, self.user_id)
        
        if success:
            QMessageBox.information(self, "성공", message)
            self.accept()
        else:
            QMessageBox.warning(self, "실패", message)


class UserDialog(QDialog):
    """사용자 추가 다이얼로그"""
    
    def __init__(self, db_manager):
        super().__init__()
        self.db_manager = db_manager
        self.init_ui()
    
    def init_ui(self):
        """UI 초기화"""
        self.setWindowTitle("사용자 추가")
        self.setGeometry(300, 300, 400, 300)
        
        layout = QVBoxLayout()
        
        form_layout = QFormLayout()
        
        # 사용자명
        self.username_edit = QLineEdit()
        form_layout.addRow("사용자명:", self.username_edit)
        
        # 비밀번호
        self.password_edit = QLineEdit()
        self.password_edit.setEchoMode(QLineEdit.Password)
        form_layout.addRow("비밀번호:", self.password_edit)
        
        # 이름
        self.fullname_edit = QLineEdit()
        form_layout.addRow("이름:", self.fullname_edit)
        
        # 부서
        self.department_edit = QLineEdit()
        form_layout.addRow("부서:", self.department_edit)
        
        # 직책
        self.role_edit = QLineEdit()
        form_layout.addRow("직책:", self.role_edit)
        
        # 관리자 여부
        self.admin_check = QCheckBox()
        form_layout.addRow("관리자 권한:", self.admin_check)
        
        layout.addLayout(form_layout)
        
        # 버튼
        button_layout = QHBoxLayout()
        
        self.save_button = QPushButton("저장")
        self.save_button.clicked.connect(self.save_user)
        
        self.cancel_button = QPushButton("취소")
        self.cancel_button.clicked.connect(self.reject)
        
        button_layout.addWidget(self.save_button)
        button_layout.addWidget(self.cancel_button)
        
        layout.addLayout(button_layout)
        
        self.setLayout(layout)
    
    def save_user(self):
        """사용자 저장"""
        username = self.username_edit.text()
        password = self.password_edit.text()
        full_name = self.fullname_edit.text()
        department = self.department_edit.text()
        role = self.role_edit.text()
        is_admin = 1 if self.admin_check.isChecked() else 0
        
        if not username or not password or not full_name:
            QMessageBox.warning(self, "입력 오류", "사용자명, 비밀번호, 이름은 필수 입력 항목입니다.")
            return
        
        success, message = self.db_manager.add_user(
            username, password, full_name, department, role, is_admin
        )
        
        if success:
            QMessageBox.information(self, "성공", message)
            self.accept()
        else:
            QMessageBox.warning(self, "실패", message)


class ScheduleManager(QMainWindow):
    """메인 일정 관리 창"""
    
    def __init__(self, db_manager, user_data):
        super().__init__()
        self.db_manager = db_manager
        self.user_data = user_data  # (id, username, full_name, department, role, is_admin)
        self.user_id = user_data[0]
        self.username = user_data[1]
        self.full_name = user_data[2]
        self.is_admin = user_data[5]
        
        self.selected_date = QDate.currentDate()
        self.init_ui()
    
    def init_ui(self):
        """UI 초기화"""
        self.setWindowTitle(f"일정 관리 시스템 - {self.full_name}")
        self.setGeometry(100, 100, 1200, 800)
        
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        
        main_layout = QHBoxLayout()
        
        # 왼쪽 패널 (달력)
        left_panel = QWidget()
        left_layout = QVBoxLayout()
        
        # 사용자 정보
        user_info_frame = QFrame()
        user_info_frame.setFrameShape(QFrame.StyledPanel)
        user_info_layout = QVBoxLayout()
        
        welcome_label = QLabel(f"환영합니다, {self.full_name}님!")
        welcome_label.setFont(QFont("Arial", 12, QFont.Bold))
        user_info_layout.addWidget(welcome_label)
        
        role_label = QLabel(f"부서: {self.user_data[3] or '미지정'} / 직책: {self.user_data[4] or '미지정'}")
        user_info_layout.addWidget(role_label)
        
        user_info_frame.setLayout(user_info_layout)
        left_layout.addWidget(user_info_frame)
        
        # 달력
        self.calendar = QCalendarWidget()
        self.calendar.setGridVisible(True)
        self.calendar.setVerticalHeaderFormat(QCalendarWidget.NoVerticalHeader)
        self.calendar.clicked.connect(self.date_selected)
        left_layout.addWidget(self.calendar)
        
        # 일정 추가 버튼
        self.add_schedule_button = QPushButton("새 일정 추가")
        self.add_schedule_button.clicked.connect(self.show_add_schedule_dialog)
        left_layout.addWidget(self.add_schedule_button)
        
        # 관리자 전용 버튼
        if self.is_admin:
            admin_frame = QFrame()
            admin_frame.setFrameShape(QFrame.StyledPanel)
            admin_layout = QVBoxLayout()
            
            admin_label = QLabel("관리자 기능")
            admin_label.setFont(QFont("Arial", 10, QFont.Bold))
            admin_layout.addWidget(admin_label)
            
            self.add_user_button = QPushButton("사용자 추가")
            self.add_user_button.clicked.connect(self.show_add_user_dialog)
            admin_layout.addWidget(self.add_user_button)
            
            self.add_notice_button = QPushButton("공지사항 작성")
            self.add_notice_button.clicked.connect(self.show_add_notice_dialog)
            admin_layout.addWidget(self.add_notice_button)
            
            admin_frame.setLayout(admin_layout)
            left_layout.addWidget(admin_frame)
        
        left_panel.setLayout(left_layout)
        
        # 오른쪽 패널 (일정 상세 및 목록)
        right_panel = QWidget()
        right_layout = QVBoxLayout()
        
        # 현재 날짜 표시
        self.date_label = QLabel()
        self.update_date_label()
        self.date_label.setFont(QFont("Arial", 14, QFont.Bold))
        right_layout.addWidget(self.date_label)
        
        # 탭 위젯 (일정, 공지사항)
        self.tab_widget = QTabWidget()
        
        # 일정 탭
        schedule_tab = QWidget()
        schedule_layout = QVBoxLayout()
        
        # 일정 목록
        self.schedule_table = QTableWidget()
        self.schedule_table.setColumnCount(7)
        self.schedule_table.setHorizontalHeaderLabels(["제목", "시간", "담당자", "생성자", "우선순위", "상태", ""])
        self.schedule_table.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
        self.schedule_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)
        self.schedule_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
        self.schedule_table.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeToContents)
        self.schedule_table.horizontalHeader().setSectionResizeMode(4, QHeaderView.ResizeToContents)
        self.schedule_table.horizontalHeader().setSectionResizeMode(5, QHeaderView.ResizeToContents)
        self.schedule_table.horizontalHeader().setSectionResizeMode(6, QHeaderView.ResizeToContents)
        self.schedule_table.verticalHeader().setVisible(False)
        self.schedule_table.setSelectionBehavior(QTableWidget.SelectRows)
        self.schedule_table.setEditTriggers(QTableWidget.NoEditTriggers)
        self.schedule_table.setAlternatingRowColors(True)
        self.schedule_table.cellDoubleClicked.connect(self.show_schedule_detail)
        schedule_layout.addWidget(self.schedule_table)
        
        # 일정 상세 보기
        self.schedule_detail = QTextEdit()
        self.schedule_detail.setReadOnly(True)
        schedule_layout.addWidget(self.schedule_detail)
        
        schedule_tab.setLayout(schedule_layout)
        self.tab_widget.addTab(schedule_tab, "일정")
        
        # 공지사항 탭
        notice_tab = QWidget()
        notice_layout = QVBoxLayout()
        
        # 공지사항 목록
        self.notice_list = QListWidget()
        self.notice_list.currentItemChanged.connect(self.show_notice_detail)
        notice_layout.addWidget(self.notice_list)
        
        # 공지사항 상세 보기
        self.notice_detail = QTextEdit()
        self.notice_detail.setReadOnly(True)
        notice_layout.addWidget(self.notice_detail)
        
        notice_tab.setLayout(notice_layout)
        self.tab_widget.addTab(notice_tab, "공지사항")
        
        right_layout.addWidget(self.tab_widget)
        right_panel.setLayout(right_layout)
        
        # 스플리터 설정
        splitter = QSplitter(Qt.Horizontal)
        splitter.addWidget(left_panel)
        splitter.addWidget(right_panel)
        splitter.setSizes([400, 800])
        
        main_layout.addWidget(splitter)
        central_widget.setLayout(main_layout)
        
        # 데이터 로드
        self.load_data()
    
    def update_date_label(self):
        """날짜 레이블 업데이트"""
        date_str = self.selected_date.toString("yyyy년 MM월 dd일 dddd")
        self.date_label.setText(date_str)
    
    def load_data(self):
        """데이터 로드"""
        self.load_schedules()
        self.load_notices()
        self.highlight_dates_with_schedules()
    
    def load_schedules(self):
        """일정 로드"""
        # 현재 선택된 날짜의 일정 로드
        date_str = self.selected_date.toString("yyyy-MM-dd")
        
        if self.is_admin:
            schedules = self.db_manager.get_schedules_by_date(date_str)
        else:
            schedules = self.db_manager.get_user_schedules_by_date(self.user_id, date_str)
        
        self.update_schedule_table(schedules)
        
        # 선택된 날짜가 있는 셀의 배경색 변경
        self.highlight_dates_with_schedules()
    
    def update_schedule_table(self, schedules):
        """일정 테이블 업데이트"""
        self.schedule_table.setRowCount(0)
        self.schedule_detail.clear()
        
        for row, schedule in enumerate(schedules):
            self.schedule_table.insertRow(row)
            
            # 제목
            title_item = QTableWidgetItem(schedule[1])
            self.schedule_table.setItem(row, 0, title_item)
            
            # 시간
            time_str = ""
            if schedule[5]:  # 시작 시간이 있을 경우
                time_str = schedule[5]
                if schedule[6]:  # 종료 시간이 있을 경우
                    time_str += f" ~ {schedule[6]}"
            
            time_item = QTableWidgetItem(time_str)
            self.schedule_table.setItem(row, 1, time_item)
            
            # 담당자
            assignee_item = QTableWidgetItem(schedule[14] if schedule[14] else "미지정")
            self.schedule_table.setItem(row, 2, assignee_item)
            
            # 생성자
            creator_item = QTableWidgetItem(schedule[13] if schedule[13] else "")
            self.schedule_table.setItem(row, 3, creator_item)
            
            # 우선순위
            priority_item = QTableWidgetItem(schedule[9])
            if schedule[9] == "높음":
                priority_item.setBackground(QColor(255, 200, 200))
            elif schedule[9] == "중간":
                priority_item.setBackground(QColor(255, 255, 200))
            self.schedule_table.setItem(row, 4, priority_item)
            
            # 상태
            status_item = QTableWidgetItem(schedule[10])
            if schedule[11]:  # 완료됨
                status_item.setBackground(QColor(200, 255, 200))
            self.schedule_table.setItem(row, 5, status_item)
            
            # 작업 버튼들
            button_widget = QWidget()
            button_layout = QHBoxLayout()
            button_layout.setContentsMargins(2, 2, 2, 2)
            
            # 일정이 사용자에게 할당되었거나 관리자인 경우에만 버튼 표시
            if schedule[8] == self.user_id or self.is_admin:
                # 완료 / 미완료 토글 버튼
                complete_button = QPushButton("✓" if not schedule[11] else "↺")
                complete_button.setFixedSize(30, 25)
                complete_button.clicked.connect(lambda checked, s=schedule: self.toggle_schedule_status(s))
                
                # 수정 버튼
                edit_button = QPushButton("✎")
                edit_button.setFixedSize(30, 25)
                edit_button.clicked.connect(lambda checked, s=schedule: self.show_edit_schedule_dialog(s))
                
                # 삭제 버튼
                delete_button = QPushButton("✖")
                delete_button.setFixedSize(30, 25)
                delete_button.clicked.connect(lambda checked, s=schedule: self.delete_schedule(s))
                
                button_layout.addWidget(complete_button)
                button_layout.addWidget(edit_button)
                button_layout.addWidget(delete_button)
            
            button_widget.setLayout(button_layout)
            self.schedule_table.setCellWidget(row, 6, button_widget)
    
    def load_notices(self):
        """공지사항 로드"""
        try:
            notices = self.db_manager.get_all_notices()
            self.notice_list.clear()
            self.notice_detail.clear()
            
            for notice in notices:
                notice_id, title, content, created_at, creator_name = notice
                item = QListWidgetItem(f"{title} - {creator_name or '알 수 없음'} ({created_at.split()[0]})")
                item.setData(Qt.UserRole, notice)
                self.notice_list.addItem(item)
        except Exception as e:
            print(f"Error loading notices: {str(e)}")
    
    def highlight_dates_with_schedules(self):
        """일정이 있는 날짜 강조"""
        # 이 부분은 PyQt5에서 직접적으로 지원하지 않으므로,
        # 캘린더 위젯의 기능을 활용하여 일정이 있는 날의 셀 서식을 변경하는 방식으로 구현
        # 실제 구현에서는 QCalendarWidget을 확장하거나, 다른 방법을 사용해야 할 수 있음
        pass
    
    def date_selected(self, date):
        """날짜 선택 처리"""
        self.selected_date = date
        self.update_date_label()
        self.load_schedules()
    
    def show_schedule_detail(self, row, column):
        """일정 상세 보기"""
        title = self.schedule_table.item(row, 0).text()
        time = self.schedule_table.item(row, 1).text()
        assignee = self.schedule_table.item(row, 2).text()
        creator = self.schedule_table.item(row, 3).text()
        priority = self.schedule_table.item(row, 4).text()
        status = self.schedule_table.item(row, 5).text()
        
        # 선택된 행의 일정 데이터 가져오기
        date_str = self.selected_date.toString("yyyy-MM-dd")
        if self.is_admin:
            schedules = self.db_manager.get_schedules_by_date(date_str)
        else:
            schedules = self.db_manager.get_user_schedules_by_date(self.user_id, date_str)
        
        if 0 <= row < len(schedules):
            schedule = schedules[row]
            description = schedule[2]
            
            # 상세 정보 표시
            detail_html = f"""
            <h2>{title}</h2>
            <p><b>일시:</b> {schedule[3]}{f" ~ {schedule[4]}" if schedule[4] and schedule[4] != schedule[3] else ""} {time}</p>
            <p><b>담당자:</b> {assignee}</p>
            <p><b>생성자:</b> {creator}</p>
            <p><b>우선순위:</b> {priority}</p>
            <p><b>상태:</b> {status}</p>
            <hr>
            <p>{description}</p>
            """
            
            self.schedule_detail.setHtml(detail_html)
    
    def show_notice_detail(self, current, previous):
        """공지사항 상세 보기"""
        if not current:
            self.notice_detail.clear()
            return
        
        notice = current.data(Qt.UserRole)
        
        # 상세 정보 표시
        detail_html = f"""
        <h2>{notice[1]}</h2>
        <p><b>작성자:</b> {notice[4]}</p>
        <p><b>작성일:</b> {notice[3]}</p>
        <hr>
        <p>{notice[2]}</p>
        """
        
        self.notice_detail.setHtml(detail_html)
    
    def show_add_schedule_dialog(self):
        """일정 추가 다이얼로그 표시"""
        dialog = ScheduleDialog(self.db_manager, self.user_id)
        if dialog.exec_() == QDialog.Accepted:
            self.load_schedules()
    
    def show_edit_schedule_dialog(self, schedule):
        """일정 수정 다이얼로그 표시"""
        dialog = ScheduleDialog(self.db_manager, self.user_id, schedule)
        if dialog.exec_() == QDialog.Accepted:
            self.load_schedules()
    
    def delete_schedule(self, schedule):
        """일정 삭제"""
        reply = QMessageBox.question(
            self, '일정 삭제',
            f"'{schedule[1]}' 일정을 삭제하시겠습니까?",
            QMessageBox.Yes | QMessageBox.No, QMessageBox.No
        )
        
        if reply == QMessageBox.Yes:
            success, message = self.db_manager.delete_schedule(schedule[0])
            if success:
                QMessageBox.information(self, "성공", message)
                self.load_schedules()
            else:
                QMessageBox.warning(self, "실패", message)
    
    def toggle_schedule_status(self, schedule):
        """일정 상태 토글 (완료/미완료)"""
        new_status = 0 if schedule[11] else 1
        success, message = self.db_manager.mark_schedule_completed(schedule[0], new_status)
        
        if success:
            self.load_schedules()
        else:
            QMessageBox.warning(self, "상태 변경 실패", message)
    
    def show_add_user_dialog(self):
        """사용자 추가 다이얼로그 표시"""
        dialog = UserDialog(self.db_manager)
        dialog.exec_()
    
    def show_add_notice_dialog(self):
        """공지사항 추가 다이얼로그 표시"""
        dialog = NoticeDialog(self.db_manager, self.user_id)
        if dialog.exec_() == QDialog.Accepted:
            self.load_notices()


def main():
    """메인 함수"""
    app = QApplication(sys.argv)
    
    # 스타일 설정
    app.setStyle("Fusion")
    
    # 테마 설정
    palette = QPalette()
    palette.setColor(QPalette.Window, QColor(240, 240, 240))
    palette.setColor(QPalette.WindowText, QColor(0, 0, 0))
    palette.setColor(QPalette.Base, QColor(255, 255, 255))
    palette.setColor(QPalette.AlternateBase, QColor(245, 245, 245))
    palette.setColor(QPalette.ToolTipBase, QColor(255, 255, 220))
    palette.setColor(QPalette.ToolTipText, QColor(0, 0, 0))
    palette.setColor(QPalette.Text, QColor(0, 0, 0))
    palette.setColor(QPalette.Button, QColor(240, 240, 240))
    palette.setColor(QPalette.ButtonText, QColor(0, 0, 0))
    palette.setColor(QPalette.BrightText, QColor(255, 0, 0))
    palette.setColor(QPalette.Highlight, QColor(0, 120, 215))
    palette.setColor(QPalette.HighlightedText, QColor(255, 255, 255))
    app.setPalette(palette)
    
    # 데이터베이스 연결
    db_manager = DatabaseManager()
    
    # 로그인 다이얼로그
    login_dialog = LoginDialog(db_manager)
    if login_dialog.exec_() == QDialog.Accepted:
        user_data = login_dialog.user_data
        scheduler = ScheduleManager(db_manager, user_data)
        scheduler.show()
        sys.exit(app.exec_())
    else:
        sys.exit(0)


if __name__ == "__main__":
    main()