/* ============================================
   회의록 작성 및 공유 개선 서비스 - 공통 Javascript
   ============================================ */

// === LocalStorage 키 상수 ===
const STORAGE_KEYS = {
  CURRENT_USER: 'currentUser',
  USERS: 'users',
  MEETINGS: 'meetings',
  TODOS: 'todos',
  INITIALIZED: 'initialized'
};

// === 예제 데이터 초기화 ===
function initializeData() {
  if (localStorage.getItem(STORAGE_KEYS.INITIALIZED)) {
    return;
  }

  // 사용자 데이터
  const users = [
    { id: 'user1', name: '김민준', email: 'minjun@example.com', avatar: '👤' },
    { id: 'user2', name: '박서연', email: 'seoyeon@example.com', avatar: '👩' },
    { id: 'user3', name: '이준호', email: 'junho@example.com', avatar: '👨' },
    { id: 'user4', name: '최유진', email: 'yujin@example.com', avatar: '👧' },
    { id: 'user5', name: '정도현', email: 'dohyun@example.com', avatar: '🧑' }
  ];

  // 회의 데이터
  const meetings = [
    {
      id: 'meeting1',
      title: '2025년 1분기 전략 회의',
      date: '2025-10-20',
      time: '14:00',
      endTime: '15:30',
      location: '3층 회의실',
      participants: ['user1', 'user2', 'user3'],
      template: 'general',
      status: 'scheduled', // scheduled, in_progress, completed
      content: {
        sections: {
          participants: '김민준, 박서연, 이준호',
          agenda: '1분기 목표 설정 및 전략 수립',
          discussion: '',
          decisions: '',
          todos: ''
        }
      },
      createdAt: new Date().toISOString()
    },
    {
      id: 'meeting2',
      title: '주간 스크럼 회의',
      date: '2025-10-18',
      time: '10:00',
      endTime: '10:30',
      location: '온라인',
      participants: ['user1', 'user2', 'user3', 'user4'],
      template: 'scrum',
      status: 'completed',
      content: {
        sections: {
          participants: '김민준, 박서연, 이준호, 최유진',
          yesterday: '- API 개발 완료\n- 테스트 코드 작성',
          today: '- 프론트엔드 개발 시작\n- 디자인 리뷰',
          blockers: '없음'
        }
      },
      createdAt: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString()
    }
  ];

  // Todo 데이터
  const todos = [
    {
      id: 'todo1',
      meetingId: 'meeting1',
      content: '1분기 마케팅 예산안 작성',
      assignee: 'user2',
      dueDate: '2025-10-25',
      priority: 'high', // high, normal, low
      status: 'pending', // pending, in_progress, completed
      progress: 0
    },
    {
      id: 'todo2',
      meetingId: 'meeting1',
      content: '경쟁사 분석 보고서 작성',
      assignee: 'user3',
      dueDate: '2025-10-22',
      priority: 'high',
      status: 'in_progress',
      progress: 60
    },
    {
      id: 'todo3',
      meetingId: 'meeting2',
      content: '테스트 커버리지 80% 달성',
      assignee: 'user3',
      dueDate: '2025-10-20',
      priority: 'normal',
      status: 'completed',
      progress: 100
    }
  ];

  // 현재 로그인 사용자
  const currentUser = users[0];

  // LocalStorage에 저장
  localStorage.setItem(STORAGE_KEYS.USERS, JSON.stringify(users));
  localStorage.setItem(STORAGE_KEYS.MEETINGS, JSON.stringify(meetings));
  localStorage.setItem(STORAGE_KEYS.TODOS, JSON.stringify(todos));
  localStorage.setItem(STORAGE_KEYS.CURRENT_USER, JSON.stringify(currentUser));
  localStorage.setItem(STORAGE_KEYS.INITIALIZED, 'true');
}

// === LocalStorage 헬퍼 함수 ===
function getFromStorage(key) {
  const data = localStorage.getItem(key);
  return data ? JSON.parse(data) : null;
}

function saveToStorage(key, data) {
  localStorage.setItem(key, JSON.stringify(data));
}

// === 날짜/시간 유틸리티 ===
function formatDate(dateString) {
  const date = new Date(dateString);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}

function formatTime(timeString) {
  return timeString; // HH:MM 형식 그대로 반환
}

function formatDateTime(dateString, timeString) {
  return `${formatDate(dateString)} ${formatTime(timeString)}`;
}

function getDdayText(dueDateString) {
  const today = new Date();
  today.setHours(0, 0, 0, 0);

  const dueDate = new Date(dueDateString);
  dueDate.setHours(0, 0, 0, 0);

  const diff = Math.ceil((dueDate - today) / (1000 * 60 * 60 * 24));

  if (diff < 0) return `D${diff} (지남)`;
  if (diff === 0) return '오늘';
  return `D-${diff}`;
}

function formatDuration(minutes) {
  const hours = Math.floor(minutes / 60);
  const mins = minutes % 60;
  if (hours > 0 && mins > 0) return `${hours}시간 ${mins}분`;
  if (hours > 0) return `${hours}시간`;
  return `${mins}분`;
}

// === 사용자 관련 함수 ===
function getCurrentUser() {
  return getFromStorage(STORAGE_KEYS.CURRENT_USER);
}

function getUserById(userId) {
  const users = getFromStorage(STORAGE_KEYS.USERS) || [];
  return users.find(u => u.id === userId);
}

function getUserName(userId) {
  const user = getUserById(userId);
  return user ? user.name : '알 수 없음';
}

// === 회의 관련 함수 ===
function getAllMeetings() {
  return getFromStorage(STORAGE_KEYS.MEETINGS) || [];
}

function getMeetingById(meetingId) {
  const meetings = getAllMeetings();
  return meetings.find(m => m.id === meetingId);
}

function saveMeeting(meeting) {
  const meetings = getAllMeetings();
  const index = meetings.findIndex(m => m.id === meeting.id);
  if (index >= 0) {
    meetings[index] = meeting;
  } else {
    meetings.push(meeting);
  }
  saveToStorage(STORAGE_KEYS.MEETINGS, meetings);
}

function getScheduledMeetings() {
  const meetings = getAllMeetings();
  return meetings.filter(m => m.status === 'scheduled');
}

function getRecentMeetings(limit = 6) {
  const meetings = getAllMeetings();
  return meetings
    .sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))
    .slice(0, limit);
}

// === Todo 관련 함수 ===
function getAllTodos() {
  return getFromStorage(STORAGE_KEYS.TODOS) || [];
}

function getTodoById(todoId) {
  const todos = getAllTodos();
  return todos.find(t => t.id === todoId);
}

function saveTodo(todo) {
  const todos = getAllTodos();
  const index = todos.findIndex(t => t.id === todo.id);
  if (index >= 0) {
    todos[index] = todo;
  } else {
    todos.push(todo);
  }
  saveToStorage(STORAGE_KEYS.TODOS, todos);
}

function getPendingTodos(userId) {
  const todos = getAllTodos();
  return todos.filter(t => t.assignee === userId && t.status !== 'completed');
}

function getTodosByStatus(status) {
  const todos = getAllTodos();
  return todos.filter(t => t.status === status);
}

// === Toast 알림 ===
function showToast(message, type = 'info') {
  // Toast 컨테이너 생성 (없으면)
  let container = document.querySelector('.toast-container');
  if (!container) {
    container = document.createElement('div');
    container.className = 'toast-container';
    document.body.appendChild(container);
  }

  // Toast 생성
  const toast = document.createElement('div');
  toast.className = `toast toast-${type}`;

  const icons = {
    success: '✓',
    error: '✗',
    warning: '⚠',
    info: 'ℹ'
  };

  toast.innerHTML = `
    <span style="font-size: 20px;">${icons[type]}</span>
    <span>${message}</span>
  `;

  container.appendChild(toast);

  // 4초 후 자동 제거
  setTimeout(() => {
    toast.style.animation = 'slideOut 150ms ease-in';
    setTimeout(() => toast.remove(), 150);
  }, 4000);
}

// slideOut 애니메이션 추가
if (!document.querySelector('style[data-toast-style]')) {
  const style = document.createElement('style');
  style.setAttribute('data-toast-style', 'true');
  style.textContent = `
    @keyframes slideOut {
      to {
        transform: translateX(400px);
        opacity: 0;
      }
    }
  `;
  document.head.appendChild(style);
}

// === 모달 제어 ===
function openModal(modalId) {
  const modal = document.getElementById(modalId);
  if (modal) {
    modal.classList.add('active');
  }
}

function closeModal(modalId) {
  const modal = document.getElementById(modalId);
  if (modal) {
    modal.classList.remove('active');
  }
}

// 모달 백드롭 클릭 시 닫기
document.addEventListener('click', (e) => {
  if (e.target.classList.contains('modal-backdrop')) {
    closeModal(e.target.id);
  }
});

// === 화면 전환 ===
function navigateTo(page) {
  window.location.href = page;
}

function goBack() {
  window.history.back();
}

// === 유틸리티 함수 ===
function generateId(prefix = 'id') {
  return `${prefix}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}

function debounce(func, wait) {
  let timeout;
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout);
      func(...args);
    };
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
  };
}

// === 템플릿 데이터 ===
const TEMPLATES = {
  general: {
    id: 'general',
    name: '일반 회의',
    description: '기본 회의 구조',
    sections: [
      { id: 'participants', name: '참석자', required: true },
      { id: 'agenda', name: '회의 목적', required: false },
      { id: 'discussion', name: '논의 내용', required: true },
      { id: 'decisions', name: '결정 사항', required: true },
      { id: 'todos', name: 'Todo', required: false }
    ]
  },
  scrum: {
    id: 'scrum',
    name: '스크럼 회의',
    description: '데일리 스탠드업',
    sections: [
      { id: 'participants', name: '참석자', required: true },
      { id: 'yesterday', name: '어제 한 일', required: true },
      { id: 'today', name: '오늘 할 일', required: true },
      { id: 'blockers', name: '이슈/블로커', required: false }
    ]
  },
  kickoff: {
    id: 'kickoff',
    name: '프로젝트 킥오프',
    description: '프로젝트 시작 회의',
    sections: [
      { id: 'participants', name: '참석자', required: true },
      { id: 'overview', name: '프로젝트 개요', required: true },
      { id: 'goals', name: '목표', required: true },
      { id: 'schedule', name: '일정', required: true },
      { id: 'roles', name: '역할 분담', required: true },
      { id: 'risks', name: '리스크', required: false }
    ]
  },
  weekly: {
    id: 'weekly',
    name: '주간 회의',
    description: '주간 진행 상황 리뷰',
    sections: [
      { id: 'participants', name: '참석자', required: true },
      { id: 'achievements', name: '주간 실적', required: true },
      { id: 'issues', name: '주요 이슈', required: false },
      { id: 'nextWeek', name: '다음 주 계획', required: true },
      { id: 'support', name: '지원 필요 사항', required: false }
    ]
  }
};

function getTemplate(templateId) {
  return TEMPLATES[templateId];
}

function getAllTemplates() {
  return Object.values(TEMPLATES);
}

// === 페이지 로드 시 데이터 초기화 ===
document.addEventListener('DOMContentLoaded', () => {
  initializeData();
});
