/**
 * 회의록 서비스 공통 JavaScript
 * 공통 함수, 유틸리티, 데이터 관리
 */

// ========================================
// 1. Global State & Sample Data
// ========================================

// 샘플 사용자 목록
const SAMPLE_USERS = [
  { id: "user-001", name: "김민준", email: "minjun.kim@example.com", avatar: "김", avatarColor: "red" },
  { id: "user-002", name: "박서연", email: "seoyeon.park@example.com", avatar: "박", avatarColor: "blue" },
  { id: "user-003", name: "이준호", email: "junho.lee@example.com", avatar: "이", avatarColor: "green" },
  { id: "user-004", name: "최유진", email: "yujin.choi@example.com", avatar: "최", avatarColor: "yellow" },
  { id: "user-005", name: "정도현", email: "dohyun.jung@example.com", avatar: "정", avatarColor: "purple" },
  { id: "user-006", name: "강지수", email: "jisoo.kang@example.com", avatar: "강", avatarColor: "cyan" },
  { id: "user-007", name: "송주영", email: "jooyoung.song@example.com", avatar: "송", avatarColor: "magenta" },
  { id: "user-008", name: "백현정", email: "hyunjung.baek@example.com", avatar: "백", avatarColor: "orange" }
];

// 현재 사용자 정보 (기본값)
const CURRENT_USER = SAMPLE_USERS[0];

// 샘플 회의 데이터
const SAMPLE_MEETINGS = [
  {
    id: 'meeting-001',
    title: '2025년 1분기 제품 기획 회의',
    date: '2025-10-25',
    time: '14:00',
    duration: 90,
    location: '본사 2층 대회의실',
    status: 'scheduled', // ongoing, scheduled, completed
    participants: [
      { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green' },
      { id: 'user-002', name: '박서연', avatar: '박', avatarColor: 'blue' },
      { id: 'user-003', name: '이준호', avatar: '이', avatarColor: 'yellow', role: 'creator' },
      { id: 'user-004', name: '최유진', avatar: '최', avatarColor: 'pink' }
    ],
    sections: 3,
    todos: 5
  },
  {
    id: 'meeting-002',
    title: '주간 스크럼 회의',
    date: '2025-10-21',
    time: '10:00',
    duration: 30,
    location: 'Zoom',
    status: 'ongoing',
    participants: [
      { id: 'user-002', name: '박서연', avatar: '박', avatarColor: 'blue', role: 'creator' },
      { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green' },
      { id: 'user-005', name: '정도현', avatar: '정', avatarColor: 'purple' }
    ],
    sections: 2,
    todos: 8
  },
  {
    id: 'meeting-003',
    title: 'AI 기능 개선 회의',
    date: '2025-10-23',
    time: '15:00',
    duration: 60,
    location: '본사 3층 스타의실',
    status: 'completed',
    participants: [
      { id: 'user-003', name: '이준호', avatar: '이', avatarColor: 'yellow', role: 'creator' },
      { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green' }
    ],
    sections: 4,
    todos: 3
  },
  // 김민준이 생성한 다양한 상태의 회의 추가
  {
    id: 'meeting-004',
    title: '경영진 보고 회의',
    date: '2025-10-26',
    time: '16:00',
    duration: 120,
    location: '본사 1층 경영진 회의실',
    status: 'scheduled',
    participants: [
      { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green' },
      { id: 'user-005', name: '정도현', avatar: '정', avatarColor: 'purple', role: 'creator' }
    ],
    sections: 0,
    todos: 0
  },
  {
    id: 'meeting-005',
    title: '영업 전략 회의',
    date: '2025-10-18',
    time: '13:00',
    duration: 60,
    location: 'Google Meet',
    status: 'completed',
    participants: [
      { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green', role: 'creator' },
      { id: 'user-002', name: '박서연', avatar: '박', avatarColor: 'blue' },
      { id: 'user-004', name: '최유진', avatar: '최', avatarColor: 'pink' }
    ],
    sections: 5,
    todos: 6
  },
  {
    id: 'meeting-006',
    title: '월간 회고 미팅',
    date: '2025-10-20',
    time: '11:00',
    duration: 90,
    location: '본사 4층 라운지',
    status: 'completed',
    participants: [
      { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green'},
      { id: 'user-003', name: '이준호', avatar: '이', avatarColor: 'yellow' },
      { id: 'user-005', name: '정도현', avatar: '정', avatarColor: 'purple', role: 'creator'  }
    ],
    sections: 3,
    todos: 4
  }
];

// 샘플 회의록 데이터 (완료된 회의의 회의록만 포함)
// participantCount: 참여자 총 인원수 (회의록 작성자 포함)
const SAMPLE_MINUTES = [
  {
    id: 'minutes-001',
    meetingId: 'meeting-001',
    title: '2025년 1분기 제품 기획 회의',
    date: '2025-10-25',
    time: '14:00',
    status: 'draft', // complete(확정완료), draft(작성중)
    participants: [
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-003', name: '이준호' , role: 'creator'},
      { id: 'user-004', name: '최유진' }
    ],
    participantCount: 4,
    lastUpdated: '2025-10-23',
    sections: [
      { id: 'section-1', title: '신제품 기획 방향', verified: true },
      { id: 'section-2', title: '개발 일정 및 리소스', verified: true },
      { id: 'section-3', title: '마케팅 전략', verified: false }
    ],
    todos: 5
  },
  {
    id: 'minutes-002',
    meetingId: 'meeting-002',
    title: '주간 스크럼 회의',
    date: '2025-10-21',
    time: '10:00',
    status: 'draft',
    participants: [
      { id: 'user-002', name: '박서연', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 3,
    lastUpdated: '2025-10-21',
    sections: [
      { id: 'section-1', title: '지난주 진행 사항', verified: true },
      { id: 'section-2', title: '이번주 계획', verified: false }
    ],
    todos: 8
  },
  {
    id: 'minutes-003',
    meetingId: 'meeting-003',
    title: 'AI 기능 개선 회의',
    date: '2025-10-23',
    time: '15:00',
    status: 'complete',
    participants: [
      { id: 'user-003', name: '이준호', role: 'creator' },
      { id: 'user-001', name: '김민준' }
    ],
    participantCount: 2,
    lastUpdated: '2025-10-23',
    sections: [
      { id: 'section-1', title: '현재 AI 모델 성능 분석', verified: true },
      { id: 'section-2', title: '개선 방향 논의', verified: true },
      { id: 'section-3', title: '기술 스택 검토', verified: true },
      { id: 'section-4', title: '일정 계획', verified: true }
    ],
    todos: 3
  },
  {
    id: 'minutes-004',
    meetingId: 'meeting-007',
    title: '개발 리소스 계획 회의',
    date: '2025-10-22',
    time: '11:00',
    status: 'draft',
    participants: [
      { id: 'user-002', name: '박서연', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-003', name: '이준호' },
      { id: 'user-004', name: '최유진' },
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 5,
    lastUpdated: '2025-10-22',
    sections: [
      { id: 'section-1', title: '현재 리소스 현황', verified: true },
      { id: 'section-2', title: '프로젝트 우선순위', verified: true },
      { id: 'section-3', title: '인력 배분 계획', verified: false },
      { id: 'section-4', title: '채용 계획', verified: true },
      { id: 'section-5', title: '일정 조정', verified: false }
    ],
    todos: 7
  },
  {
    id: 'minutes-005',
    meetingId: 'meeting-005',
    title: '영업 전략 회의',
    date: '2025-10-18',
    time: '13:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-004', name: '최유진' , role: 'creator'}
    ],
    participantCount: 3,
    lastUpdated: '2025-10-18',
    sections: [
      { id: 'section-1', title: '현재 영업 현황', verified: true },
      { id: 'section-2', title: '타겟 고객 분석', verified: true },
      { id: 'section-3', title: '영업 전략 수립', verified: true },
      { id: 'section-4', title: '목표 설정', verified: true },
      { id: 'section-5', title: '실행 계획', verified: true }
    ],
    todos: 6
  },
  {
    id: 'minutes-006',
    meetingId: 'meeting-006',
    title: '월간 회고 미팅',
    date: '2025-10-20',
    time: '11:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준' },
      { id: 'user-003', name: '이준호' },
      { id: 'user-005', name: '정도현', role: 'creator' }
    ],
    participantCount: 3,
    lastUpdated: '2025-10-20',
    sections: [
      { id: 'section-1', title: 'Keep (유지할 것)', verified: true },
      { id: 'section-2', title: 'Problem (문제점)', verified: true },
      { id: 'section-3', title: 'Try (시도할 것)', verified: true }
    ],
    todos: 4
  },
  {
    id: 'minutes-007',
    meetingId: 'meeting-008',
    title: 'UI/UX 디자인 검토 회의',
    date: '2025-10-19',
    time: '14:00',
    status: 'draft',
    participants: [
      { id: 'user-004', name: '최유진', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-003', name: '이준호' }
    ],
    participantCount: 4,
    lastUpdated: '2025-10-19',
    sections: [
      { id: 'section-1', title: '디자인 시스템 검토', verified: true },
      { id: 'section-2', title: '사용자 플로우 검증', verified: true },
      { id: 'section-3', title: '접근성 개선', verified: false },
      { id: 'section-4', title: '다음 스프린트 계획', verified: false }
    ],
    todos: 5
  },
  {
    id: 'minutes-008',
    meetingId: 'meeting-009',
    title: '경쟁사 분석 회의',
    date: '2025-10-20',
    time: '10:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준', role: 'creator' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 3,
    lastUpdated: '2025-10-20',
    sections: [
      { id: 'section-1', title: '경쟁사 A 분석', verified: true },
      { id: 'section-2', title: '경쟁사 B 분석', verified: true },
      { id: 'section-3', title: '차별화 전략', verified: true }
    ],
    todos: 2
  },
  {
    id: 'minutes-009',
    meetingId: 'meeting-010',
    title: '사용자 인터뷰 결과 공유 및 다음 단계 논의',
    date: '2025-10-18',
    time: '14:00',
    status: 'draft',
    participants: [
      { id: 'user-004', name: '최유진', role: 'creator' },
      { id: 'user-001', name: '김민준' }
    ],
    participantCount: 2,
    lastUpdated: '2025-10-18',
    sections: [
      { id: 'section-1', title: '인터뷰 결과 요약', verified: true },
      { id: 'section-2', title: '다음 액션 아이템', verified: false }
    ],
    todos: 4
  },
  {
    id: 'minutes-010',
    meetingId: 'meeting-011',
    title: '보안 검토 회의',
    date: '2025-10-17',
    time: '11:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준' },
      { id: 'user-003', name: '이준호' , role: 'creator'},
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 3,
    lastUpdated: '2025-10-17',
    sections: [
      { id: 'section-1', title: '보안 취약점 분석', verified: true },
      { id: 'section-2', title: '대응 방안', verified: true },
      { id: 'section-3', title: '후속 조치', verified: true }
    ],
    todos: 5
  },
  {
    id: 'minutes-011',
    meetingId: 'meeting-012',
    title: '마케팅 전략 수립 회의',
    date: '2025-10-16',
    time: '13:00',
    status: 'complete',
    participants: [
      { id: 'user-002', name: '박서연', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-003', name: '이준호' },
      { id: 'user-004', name: '최유진' }
    ],
    participantCount: 4,
    lastUpdated: '2025-10-16',
    sections: [
      { id: 'section-1', title: '시장 분석', verified: true },
      { id: 'section-2', title: '타겟 고객층', verified: true },
      { id: 'section-3', title: '마케팅 채널 선정', verified: true },
      { id: 'section-4', title: '예산 계획', verified: true }
    ],
    todos: 6
  },
  {
    id: 'minutes-012',
    meetingId: 'meeting-013',
    title: '분기별 성과 리뷰 회의',
    date: '2025-10-15',
    time: '10:00',
    status: 'draft',
    participants: [
      { id: 'user-001', name: '김민준'},
      { id: 'user-002', name: '박서연' },
      { id: 'user-003', name: '이준호' , role: 'creator' },
      { id: 'user-004', name: '최유진' },
      { id: 'user-005', name: '정도현' },
      { id: 'user-006', name: '강지수' }
    ],
    participantCount: 6,
    lastUpdated: '2025-10-15',
    sections: [
      { id: 'section-1', title: '분기 성과 분석', verified: true },
      { id: 'section-2', title: '개선 계획', verified: false }
    ],
    todos: 3
  },
  {
    id: 'minutes-013',
    meetingId: 'meeting-014',
    title: '신규 프로젝트 킥오프 미팅',
    date: '2025-10-14',
    time: '09:00',
    status: 'complete',
    participants: [
      { id: 'user-003', name: '이준호', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-004', name: '최유진' },
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 5,
    lastUpdated: '2025-10-14',
    sections: [
      { id: 'section-1', title: '프로젝트 목표', verified: true },
      { id: 'section-2', title: '역할 분담', verified: true },
      { id: 'section-3', title: '일정 계획', verified: true },
      { id: 'section-4', title: '리스크 관리', verified: true }
    ],
    todos: 7
  },
  {
    id: 'minutes-014',
    meetingId: 'meeting-015',
    title: '고객 피드백 반영 회의',
    date: '2025-10-13',
    time: '14:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준', role: 'creator' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-004', name: '최유진' }
    ],
    participantCount: 3,
    lastUpdated: '2025-10-13',
    sections: [
      { id: 'section-1', title: '고객 피드백 분석', verified: true },
      { id: 'section-2', title: '개선 우선순위', verified: true },
      { id: 'section-3', title: '실행 계획', verified: true }
    ],
    todos: 4
  },
  {
    id: 'minutes-015',
    meetingId: 'meeting-016',
    title: '기술 스택 검토 회의',
    date: '2025-10-12',
    time: '11:00',
    status: 'draft',
    participants: [
      { id: 'user-003', name: '이준호', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 4,
    lastUpdated: '2025-10-12',
    sections: [
      { id: 'section-1', title: '현재 기술 스택 검토', verified: true },
      { id: 'section-2', title: '새로운 기술 도입 검토', verified: false }
    ],
    todos: 5
  },
  {
    id: 'minutes-016',
    meetingId: 'meeting-017',
    title: '월간 운영 리뷰 회의',
    date: '2025-10-11',
    time: '15:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' , role: 'creator'},
      { id: 'user-003', name: '이준호' },
      { id: 'user-004', name: '최유진' },
      { id: 'user-005', name: '정도현' },
      { id: 'user-006', name: '강지수' },
      { id: 'user-007', name: '송주영' }
    ],
    participantCount: 7,
    lastUpdated: '2025-10-11',
    sections: [
      { id: 'section-1', title: '이번 달 실적 요약', verified: true },
      { id: 'section-2', title: '주요 이슈 및 대응', verified: true },
      { id: 'section-3', title: '개선 사항', verified: true },
      { id: 'section-4', title: 'KPI 분석', verified: true },
      { id: 'section-5', title: '다음 달 계획', verified: true }
    ],
    todos: 8
  },
  {
    id: 'minutes-017',
    meetingId: 'meeting-018',
    title: '채용 인터뷰 디브리핑',
    date: '2025-10-10',
    time: '16:00',
    status: 'complete',
    participants: [
      { id: 'user-005', name: '정도현', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' }
    ],
    participantCount: 3,
    lastUpdated: '2025-10-10',
    sections: [
      { id: 'section-1', title: '후보자 평가', verified: true },
      { id: 'section-2', title: '채용 결정', verified: true }
    ],
    todos: 3
  },
  {
    id: 'minutes-018',
    meetingId: 'meeting-019',
    title: '파트너사 협업 방안 논의',
    date: '2025-10-09',
    time: '10:00',
    status: 'draft',
    participants: [
      { id: 'user-001', name: '김민준', role: 'creator' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-003', name: '이준호' },
      { id: 'user-004', name: '최유진' },
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 5,
    lastUpdated: '2025-10-09',
    sections: [
      { id: 'section-1', title: '협업 방안 논의', verified: true },
      { id: 'section-2', title: '계약 조건 검토', verified: false },
      { id: 'section-3', title: '일정 및 로드맵', verified: true }
    ],
    todos: 6
  },
  {
    id: 'minutes-019',
    meetingId: 'meeting-020',
    title: '데이터 분석 결과 공유',
    date: '2025-10-08',
    time: '13:00',
    status: 'complete',
    participants: [
      { id: 'user-002', name: '박서연', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-003', name: '이준호' },
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 4,
    lastUpdated: '2025-10-08',
    sections: [
      { id: 'section-1', title: '데이터 수집 현황', verified: true },
      { id: 'section-2', title: '분석 결과', verified: true },
      { id: 'section-3', title: '인사이트 도출', verified: true },
      { id: 'section-4', title: '액션 플랜', verified: true }
    ],
    todos: 5
  },
  {
    id: 'minutes-020',
    meetingId: 'meeting-021',
    title: '서비스 개선 아이디어 회의',
    date: '2025-10-07',
    time: '14:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준'},
      { id: 'user-002', name: '박서연', role: 'creator'  },
      { id: 'user-003', name: '이준호' },
      { id: 'user-004', name: '최유진' },
      { id: 'user-005', name: '정도현' },
      { id: 'user-006', name: '강지수' }
    ],
    participantCount: 6,
    lastUpdated: '2025-10-07',
    sections: [
      { id: 'section-1', title: '현재 서비스 분석', verified: true },
      { id: 'section-2', title: '개선 아이디어 도출', verified: true },
      { id: 'section-3', title: '우선순위 결정', verified: true },
      { id: 'section-4', title: '실행 계획', verified: true }
    ],
    todos: 7
  },
  {
    id: 'minutes-021',
    meetingId: 'meeting-022',
    title: '고객 VOC 분석 회의',
    date: '2025-10-06',
    time: '11:00',
    status: 'draft',
    participants: [
      { id: 'user-004', name: '최유진', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' }
    ],
    participantCount: 3,
    lastUpdated: '2025-10-06',
    sections: [
      { id: 'section-1', title: 'VOC 데이터 분석', verified: true },
      { id: 'section-2', title: '개선 방향', verified: false }
    ],
    todos: 4
  },
  {
    id: 'minutes-022',
    meetingId: 'meeting-023',
    title: '연말 계획 수립 회의',
    date: '2025-10-05',
    time: '09:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-003', name: '이준호' , role: 'creator'},
      { id: 'user-004', name: '최유진' },
      { id: 'user-005', name: '정도현' },
      { id: 'user-006', name: '강지수' },
      { id: 'user-007', name: '송주영' },
      { id: 'user-008', name: '백현정' }
    ],
    participantCount: 8,
    lastUpdated: '2025-10-05',
    sections: [
      { id: 'section-1', title: '연말 목표 설정', verified: true },
      { id: 'section-2', title: '예산 계획', verified: true },
      { id: 'section-3', title: '인력 계획', verified: true },
      { id: 'section-4', title: '프로젝트 우선순위', verified: true },
      { id: 'section-5', title: '리스크 관리', verified: true },
      { id: 'section-6', title: '실행 로드맵', verified: true }
    ],
    todos: 10
  },
  {
    id: 'minutes-023',
    meetingId: 'meeting-024',
    title: '브랜드 리뉴얼 전략 회의',
    date: '2025-10-04',
    time: '13:00',
    status: 'draft',
    participants: [
      { id: 'user-004', name: '최유진', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-006', name: '강지수' },
      { id: 'user-007', name: '송주영' },
      { id: 'user-008', name: '백현정' }
    ],
    participantCount: 6,
    lastUpdated: '2025-10-04',
    sections: [
      { id: 'section-1', title: '현재 브랜드 분석', verified: true },
      { id: 'section-2', title: '리뉴얼 방향 논의', verified: false },
      { id: 'section-3', title: '타임라인 및 예산', verified: true }
    ],
    todos: 5
  },
  {
    id: 'minutes-024',
    meetingId: 'meeting-025',
    title: '플랫폼 확장성 검토 회의',
    date: '2025-10-03',
    time: '10:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준', role: 'creator' },
      { id: 'user-003', name: '이준호' },
      { id: 'user-005', name: '정도현' },
      { id: 'user-007', name: '송주영' },
      { id: 'user-002', name: '박서연' }
    ],
    participantCount: 5,
    lastUpdated: '2025-10-03',
    sections: 4,
    todos: 6
  },
  {
    id: 'minutes-025',
    meetingId: 'meeting-026',
    title: '사용자 경험 개선 워크샵',
    date: '2025-10-02',
    time: '14:00',
    status: 'draft',
    participants: [
      { id: 'user-004', name: '최유진', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-006', name: '강지수' },
      { id: 'user-003', name: '이준호' },
      { id: 'user-005', name: '정도현' },
      { id: 'user-008', name: '백현정' }
    ],
    participantCount: 7,
    lastUpdated: '2025-10-02',
    completionRate: 85,
    sections: 5,
    todos: 8
  },
  {
    id: 'minutes-026',
    meetingId: 'meeting-027',
    title: '클라우드 인프라 마이그레이션 계획',
    date: '2025-10-01',
    time: '09:30',
    status: 'draft',
    participants: [
      { id: 'user-001', name: '김민준' },
      { id: 'user-003', name: '이준호' },
      { id: 'user-007', name: '송주영' , role: 'creator'},
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 4,
    lastUpdated: '2025-10-01',
    completionRate: 55,
    sections: 3,
    todos: 7
  },
  {
    id: 'minutes-027',
    meetingId: 'meeting-028',
    title: '월간 KPI 점검 회의',
    date: '2025-09-30',
    time: '16:00',
    status: 'complete',
    participants: [
      { id: 'user-002', name: '박서연', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-003', name: '이준호' },
      { id: 'user-004', name: '최유진' },
      { id: 'user-005', name: '정도현' },
      { id: 'user-006', name: '강지수' },
      { id: 'user-007', name: '송주영' },
      { id: 'user-008', name: '백현정' }
    ],
    participantCount: 8,
    lastUpdated: '2025-09-30',
    sections: 5,
    todos: 9
  },
  {
    id: 'minutes-028',
    meetingId: 'meeting-029',
    title: '예산 집행 검토 회의',
    date: '2025-09-29',
    time: '11:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준', role: 'creator' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 3,
    lastUpdated: '2025-09-29',
    sections: 3,
    todos: 4
  },
  {
    id: 'minutes-029',
    meetingId: 'meeting-030',
    title: '고객 이탈 방지 전략 논의',
    date: '2025-09-28',
    time: '15:00',
    status: 'draft',
    participants: [
      { id: 'user-002', name: '박서연', role: 'creator' },
      { id: 'user-001', name: '김민준' },
      { id: 'user-004', name: '최유진' },
      { id: 'user-006', name: '강지수' },
      { id: 'user-003', name: '이준호' }
    ],
    participantCount: 5,
    lastUpdated: '2025-09-28',
    completionRate: 35,
    sections: 2,
    todos: 4
  },
  {
    id: 'minutes-030',
    meetingId: 'meeting-031',
    title: '협력사 계약 검토 회의',
    date: '2025-09-27',
    time: '10:00',
    status: 'complete',
    participants: [
      { id: 'user-001', name: '김민준' },
      { id: 'user-002', name: '박서연' },
      { id: 'user-003', name: '이준호' , role: 'creator'},
      { id: 'user-005', name: '정도현' }
    ],
    participantCount: 4,
    lastUpdated: '2025-09-27',
    sections: 3,
    todos: 5
  }
];

// 샘플 Todo 데이터
// status: not_started(미시작), completed(완료)만 사용
const SAMPLE_TODOS = [
  {
    id: 'todo-001',
    title: 'API 명세서 작성',
    assignee: { id: 'user-003', name: '이준호', avatar: '이', avatarColor: 'yellow' },
    dueDate: '2025-10-23',
    priority: 'high',
    status: 'not_started',
    meetingId: 'meeting-001',
    meetingTitle: '2025년 1분기 제품 기획 회의'
  },
  {
    id: 'todo-002',
    title: '데이터베이스 스키마 설계',
    assignee: { id: 'user-003', name: '이준호', avatar: '이', avatarColor: 'yellow' },
    dueDate: '2025-10-20',
    priority: 'high',
    status: 'not_started',
    meetingId: 'meeting-001',
    meetingTitle: '2025년 1분기 제품 기획 회의'
  },
  {
    id: 'todo-003',
    title: 'UI 프로토타입 디자인',
    assignee: { id: 'user-004', name: '최유진', avatar: '최', avatarColor: 'pink' },
    dueDate: '2025-10-28',
    priority: 'medium',
    status: 'not_started',
    meetingId: 'meeting-001',
    meetingTitle: '2025년 1분기 제품 기획 회의'
  },
  {
    id: 'todo-004',
    title: '예산 편성안 검토',
    assignee: { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green' },
    dueDate: '2025-10-22',
    priority: 'high',
    status: 'not_started',
    meetingId: 'meeting-002',
    meetingTitle: '주간 스크럼 회의'
  },
  {
    id: 'todo-005',
    title: '사용자 피드백 분석',
    assignee: { id: 'user-002', name: '박서연', avatar: '박', avatarColor: 'blue' },
    dueDate: '2025-10-19',
    priority: 'medium',
    status: 'completed',
    meetingId: 'meeting-002',
    meetingTitle: '주간 스크럼 회의'
  },
  // 김민준에게 할당된 다양한 상태의 Todo 추가
  {
    id: 'todo-006',
    title: '고객사 제안서 작성',
    assignee: { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green' },
    dueDate: '2025-10-19',
    priority: 'high',
    status: 'not_started',
    meetingId: 'meeting-003',
    meetingTitle: '영업 전략 회의'
  },
  {
    id: 'todo-007',
    title: '분기 성과 보고서 검토',
    assignee: { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green' },
    dueDate: '2025-10-30',
    priority: 'medium',
    status: 'not_started',
    meetingId: 'meeting-004',
    meetingTitle: '경영진 보고 회의'
  },
  {
    id: 'todo-008',
    title: '시스템 보안 점검',
    assignee: { id: 'user-001', name: '김민준', avatar: '김', avatarColor: 'green' },
    dueDate: '2025-10-18',
    priority: 'low',
    status: 'completed',
    meetingId: 'meeting-002',
    meetingTitle: '주간 스크럼 회의'
  }
];

// ========================================
// 2. Data Utilities
// ========================================

/**
 * 회의록 검증완료율 계산
 * @param {Object} minute - 회의록 객체 (sections 배열 포함)
 * @returns {number} 검증완료율 (0-100)
 *
 * @example
 * const minute = {
 *   sections: [
 *     { id: 'section-1', verified: true },
 *     { id: 'section-2', verified: false },
 *     { id: 'section-3', verified: true }
 *   ]
 * };
 * calculateCompletionRate(minute); // 67 (2/3 * 100)
 */
function calculateCompletionRate(minute) {
  if (!minute || !minute.sections || !Array.isArray(minute.sections)) {
    return 0;
  }

  const totalSections = minute.sections.length;
  if (totalSections === 0) {
    return 0;
  }

  const verifiedSections = minute.sections.filter(section => section.verified === true).length;
  return Math.round((verifiedSections / totalSections) * 100);
}

// ========================================
// 3. DOM Utilities
// ========================================

/**
 * 요소 선택
 * @param {string} selector - CSS 선택자
 * @returns {Element|null}
 */
function $(selector) {
  return document.querySelector(selector);
}

/**
 * 여러 요소 선택
 * @param {string} selector - CSS 선택자
 * @returns {NodeList}
 */
function $$(selector) {
  return document.querySelectorAll(selector);
}

/**
 * 요소 생성
 * @param {string} tag - 태그명
 * @param {object} attrs - 속성 객체
 * @param {string} content - 내부 HTML
 * @returns {Element}
 */
function createElement(tag, attrs = {}, content = '') {
  const el = document.createElement(tag);
  Object.keys(attrs).forEach(key => {
    if (key === 'className') {
      el.className = attrs[key];
    } else if (key === 'dataset') {
      Object.keys(attrs[key]).forEach(dataKey => {
        el.dataset[dataKey] = attrs[key][dataKey];
      });
    } else {
      el.setAttribute(key, attrs[key]);
    }
  });
  if (content) {
    el.innerHTML = content;
  }
  return el;
}

// ========================================
// 3. UI Components
// ========================================

/**
 * 아바타 HTML 생성
 * @param {object} user - 사용자 객체
 * @param {string} size - 크기 (sm, md, lg)
 * @returns {string}
 */
function createAvatar(user, size = 'md') {
  const sizeClass = size !== 'md' ? `avatar-${size}` : '';
  return `<div class="avatar avatar-${user.avatarColor} ${sizeClass}">${user.avatar}</div>`;
}

/**
 * 배지 HTML 생성
 * @param {string} text - 배지 텍스트
 * @param {string} type - 배지 타입
 * @returns {string}
 */
function createBadge(text, type) {
  return `<span class="badge badge-${type}">${text}</span>`;
}

/**
 * 진행률 바 HTML 생성
 * @param {number} progress - 진행률 (0-100)
 * @returns {string}
 */
function createProgressBar(progress) {
  let barClass = 'progress-bar';
  if (progress === 100) barClass += ' progress-bar-success';
  else if (progress < 30) barClass += ' progress-bar-error';
  else if (progress < 70) barClass += ' progress-bar-warning';

  return `
    <div class="progress">
      <div class="${barClass}" style="width: ${progress}%"></div>
    </div>
  `;
}

// ========================================
// 4. Date & Time Utilities
// ========================================

/**
 * 날짜 포맷팅 (YYYY-MM-DD → YYYY년 MM월 DD일)
 * @param {string} dateStr - 날짜 문자열
 * @returns {string}
 */
function formatDate(dateStr) {
  const date = new Date(dateStr);
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  return `${year}년 ${month}월 ${day}일`;
}

/**
 * 시간 포맷팅 (HH:mm)
 * @param {string} timeStr - 시간 문자열
 * @returns {string}
 */
function formatTime(timeStr) {
  return timeStr;
}

/**
 * D-Day 계산
 * @param {string} dateStr - 목표 날짜
 * @returns {number} - D-Day (음수면 지연)
 */
function calculateDday(dateStr) {
  const today = new Date();
  today.setHours(0, 0, 0, 0);
  const target = new Date(dateStr);
  target.setHours(0, 0, 0, 0);
  const diff = target - today;
  return Math.ceil(diff / (1000 * 60 * 60 * 24));
}

/**
 * D-Day 텍스트 생성
 * @param {number} dday - D-Day 값
 * @returns {string}
 */
function getDdayText(dday) {
  if (dday === 0) return 'D-Day';
  if (dday > 0) return `D-${dday}`;
  return `D+${Math.abs(dday)} (지연)`;
}

// ========================================
// 5. Status Helpers
// ========================================

/**
 * Todo 상태 정보 가져오기
 * @param {object} todo - Todo 객체
 * @returns {object} - {badgeType, badgeText}
 */
function getTodoStatusInfo(todo) {
  const dday = calculateDday(todo.dueDate);

  if (todo.status === 'completed') {
    return { badgeType: 'complete', badgeText: '완료' };
  }
  if (dday < 0) {
    return { badgeType: 'overdue', badgeText: getDdayText(dday) };
  }
  if (dday === 0) {
    return { badgeType: 'dday', badgeText: 'D-Day' };
  }
  if (dday <= 3) {
    return { badgeType: 'warning', badgeText: `D-${dday}` };
  }
  if (dday <= 7) {
    return { badgeType: 'primary', badgeText: `D-${dday}` };
  }
  return { badgeType: 'secondary', badgeText: `D-${dday}` };
}

/**
 * 회의 상태 정보 가져오기
 * @param {object} meeting - 회의 객체
 * @returns {object} - {badgeType, badgeText}
 */
function getMeetingStatusInfo(meeting) {
  if (meeting.status === 'ongoing') {
    return { badgeType: 'ongoing', badgeText: '진행중' };
  }
  if (meeting.status === 'completed') {
    return { badgeType: 'complete', badgeText: '확정완료' };
  }
  return { badgeType: 'scheduled', badgeText: '예정' };
}

// ========================================
// 6. Modal Functions
// ========================================

/**
 * 모달 열기
 * @param {string} modalId - 모달 ID
 */
function openModal(modalId) {
  const modal = $(`#${modalId}`);
  if (modal) {
    modal.classList.add('show');
    document.body.style.overflow = 'hidden';
  }
}

/**
 * 모달 닫기
 * @param {string} modalId - 모달 ID
 */
function closeModal(modalId) {
  const modal = $(`#${modalId}`);
  if (modal) {
    modal.classList.remove('show');
    document.body.style.overflow = '';
  }
}

/**
 * 모달 오버레이 클릭 시 닫기
 */
function initModalClose() {
  $$('.modal-overlay').forEach(overlay => {
    overlay.addEventListener('click', (e) => {
      if (e.target === overlay) {
        closeModal(overlay.id);
      }
    });
  });

  $$('.modal-close').forEach(btn => {
    btn.addEventListener('click', () => {
      const modal = btn.closest('.modal-overlay');
      if (modal) {
        closeModal(modal.id);
      }
    });
  });
}

// ========================================
// 7. Navigation
// ========================================

/**
 * 활성 네비게이션 아이템 설정
 * @param {string} activeId - 활성화할 nav-item ID
 */
function setActiveNav(activeId) {
  $$('.nav-item').forEach(item => {
    item.classList.remove('active');
  });
  const activeItem = $(`#${activeId}`);
  if (activeItem) {
    activeItem.classList.add('active');
  }
}

/**
 * 페이지 이동
 * @param {string} url - 이동할 URL
 */
function navigateTo(url) {
  window.location.href = url;
}

// ========================================
// 8. Form Helpers
// ========================================

/**
 * 폼 데이터를 객체로 변환
 * @param {HTMLFormElement} form - 폼 요소
 * @returns {object}
 */
function getFormData(form) {
  const formData = new FormData(form);
  const data = {};
  for (let [key, value] of formData.entries()) {
    data[key] = value;
  }
  return data;
}

/**
 * 폼 초기화
 * @param {string} formId - 폼 ID
 */
function resetForm(formId) {
  const form = $(`#${formId}`);
  if (form) {
    form.reset();
  }
}

// ========================================
// 9. Toast Notification
// ========================================

/**
 * 토스트 알림 표시
 * @param {string} message - 메시지
 * @param {string} type - 타입 (success, error, info)
 */
function showToast(message, type = 'info') {
  const toast = createElement('div', {
    className: `toast toast-${type}`,
    style: `
      position: fixed;
      bottom: 80px;
      left: 50%;
      transform: translateX(-50%);
      background: ${type === 'success' ? 'var(--success)' : type === 'error' ? 'var(--error)' : 'var(--info)'};
      color: white;
      padding: 12px 24px;
      border-radius: 8px;
      box-shadow: 0 4px 12px rgba(0,0,0,0.2);
      z-index: 3000;
      animation: fadeIn 0.3s ease;
    `
  }, message);

  document.body.appendChild(toast);

  setTimeout(() => {
    toast.style.animation = 'fadeOut 0.3s ease';
    setTimeout(() => {
      document.body.removeChild(toast);
    }, 300);
  }, 3000);
}

// ========================================
// 10. Local Storage Helpers
// ========================================

/**
 * 로컬 스토리지에 데이터 저장
 * @param {string} key - 키
 * @param {any} value - 값
 */
function saveToStorage(key, value) {
  try {
    localStorage.setItem(key, JSON.stringify(value));
  } catch (e) {
    console.error('로컬 스토리지 저장 실패:', e);
  }
}

/**
 * 로컬 스토리지에서 데이터 가져오기
 * @param {string} key - 키
 * @returns {any}
 */
function getFromStorage(key) {
  try {
    const value = localStorage.getItem(key);
    return value ? JSON.parse(value) : null;
  } catch (e) {
    console.error('로컬 스토리지 로드 실패:', e);
    return null;
  }
}

// ========================================
// 11. Initialization
// ========================================

/**
 * 공통 초기화
 */
function initCommon() {
  // 모달 닫기 이벤트 설정
  initModalClose();

  // 외부 링크는 새 탭으로 열기
  $$('a[href^="http"]').forEach(link => {
    link.setAttribute('target', '_blank');
    link.setAttribute('rel', 'noopener noreferrer');
  });

  console.log('공통 스크립트 초기화 완료');
}

// DOM 로드 완료 시 공통 초기화 실행
if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', initCommon);
} else {
  initCommon();
}
