import { state, loadMasterDataFromDB } from './core/state';
import { renderNavigation } from './components/Navigation';
import { renderDashboard } from './views/DashboardView';
import { renderSWTable } from './views/SW_Table';
import { downloadTemplate, exportToExcel, parseExcel } from './core/excelHandler';
import { initBaseModal } from './components/Modal/BaseModal';
import { initHwModal, openHwModal } from './components/Modal/HWModal';
import { initSwModal, openSwModal } from './components/Modal/SWModal';
import { initSwUserModal } from './components/Modal/SWUserModal';
import { initDashboardDetailModal } from './components/Modal/DashboardDetailModal';
import { initGuide } from './components/Guide';
import { createIcons, Download, Upload, FileSpreadsheet, Plus, X, LayoutDashboard, Monitor, Server, Database, Laptop, CalendarClock, Key, Cpu, Layers, Users, Paperclip, Edit2, History, RefreshCcw, BookOpen, Settings } from 'lucide';

// --- DB 저장을 위한 세분화된 헬퍼 함수들 ---
async function apiBatchSave(url: string, data: any[], label: string) {
  try {
    const response = await fetch(url, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(data)
    });
    if (!response.ok) {
      const errorData = await response.json().catch(() => ({}));
      throw new Error(`${label} DB 저장 실패: ${errorData.error || response.statusText}`);
    }
    console.log(`✅ ${label} DB 저장 완료`);
  } catch (err) {
    console.error(`❌ ${label} DB 저장 오류:`, err);
    alert(`${label} 저장 중 오류가 발생했습니다: ${(err as any).message}`);
  }
}

const savePcToDB = () => apiBatchSave(`http://${location.hostname}:3000/api/pc/batch`, state.masterData.pc, '개인PC');
const saveServerToDB = () => apiBatchSave(`http://${location.hostname}:3000/api/server/batch`, state.masterData.server, '서버');
const saveStorageToDB = () => apiBatchSave(`http://${location.hostname}:3000/api/storage/batch`, state.masterData.storage, '스토리지');
const saveEquipToDB = () => apiBatchSave(`http://${location.hostname}:3000/api/equip/batch`, state.masterData.equip, '전산비품');
const saveMobileToDB = () => apiBatchSave(`http://${location.hostname}:3000/api/mobile/batch`, state.masterData.mobile, '모바일기기');
const saveSubSwToDB = () => apiBatchSave(`http://${location.hostname}:3000/api/sw/sub/batch`, state.masterData.subSw, '구독SW');
const savePermSwToDB = () => apiBatchSave(`http://${location.hostname}:3000/api/sw/perm/batch`, state.masterData.permSw, '영구SW');
const saveCloudToDB = () => apiBatchSave(`http://${location.hostname}:3000/api/cloud/batch`, state.masterData.cloud, '클라우드');
const saveSwUsersToDB = () => apiBatchSave(`http://${location.hostname}:3000/api/sw-users/batch`, state.masterData.swUsers, 'SW사용자');
const saveLogsToDB = () => apiBatchSave(`http://${location.hostname}:3000/api/logs/batch`, state.masterData.logs, '자산 로그');

// 화면 갱신 통합 핸들러 (대시보드 vs 리스트)
function refreshView() {
  const mainContent = document.getElementById('main-content')!;
  if (!mainContent) return;
  
  if (state.activeSubTab === '대시보드') {
    renderDashboard(mainContent);
  } else {
    renderSWTable(mainContent);
  }
}

// 모든 하드웨어 DB 동기화
async function saveAllHardwareToDB() {
  await Promise.all([
    savePcToDB(),
    saveServerToDB(),
    saveStorageToDB(),
    saveEquipToDB(),
    saveMobileToDB(),
    saveLogsToDB()
  ]);
  await loadMasterDataFromDB();
  refreshView();
}

// 모든 소프트웨어 DB 동기화
async function saveAllSoftwareToDB() {
  await Promise.all([
    saveSubSwToDB(),
    savePermSwToDB(),
    saveCloudToDB(),
    saveSwUsersToDB(),
    saveLogsToDB()
  ]);
  // 저장 후 최신 데이터 다시 로드 (정합성)
  await loadMasterDataFromDB();
  refreshView();
}

// --- App Initialization ---
function initApp() {
  const mainContent = document.getElementById('main-content')!;
  if (!mainContent) return;

  const { closeAllModals } = initBaseModal(); 

  try {
    // 네비게이션 렌더링 및 콜백 연결
    renderNavigation((tab) => {
      if (tab === '대시보드') {
        renderDashboard(mainContent);
      } else {
        renderSWTable(mainContent);
      }
    });

    // 각종 모달 및 가이드 초기화
    initHwModal(() => saveAllHardwareToDB(), closeAllModals); 
    initSwModal(() => saveAllSoftwareToDB(), closeAllModals);

    initSwUserModal(() => { 
      saveSwUsersToDB().then(() => {
        loadMasterDataFromDB().then(() => refreshView());
      });
    }, closeAllModals);

    initDashboardDetailModal();
    initGuide();

    // DB 데이터 로드 및 초기 화면 렌더링
    loadMasterDataFromDB().then((success) => {
      if (success) {
        refreshView();
      }
    });
  } catch (e) { console.error('❌ Initialization failed:', e); }

  // 버튼 이벤트 바인딩
  document.getElementById('btn-download-template')?.addEventListener('click', () => downloadTemplate());
  document.getElementById('btn-export-excel')?.addEventListener('click', () => exportToExcel(state.masterData));
  
  const uploadInput = document.getElementById('excel-upload') as HTMLInputElement;
  uploadInput?.addEventListener('change', async (e) => {
    const file = (e.target as HTMLInputElement).files?.[0];
    if (file) {
      const data = await parseExcel(file);
      state.masterData = { ...state.masterData, ...data };
      await Promise.all([saveAllHardwareToDB(), saveAllSoftwareToDB()]);
      refreshView();
    }
  });

  document.getElementById('btn-add-asset')?.addEventListener('click', () => {
    const tab = state.activeSubTab;
    const cat = state.activeCategory;
    if (cat === 'hw') {
      let defaultType = (tab === '개인PC') ? 'PC' : (tab === '서버' ? '서버' : (tab === '스토리지' ? '스토리지' : (tab === '전산비품' ? 'CPU' : '모바일')));
      openHwModal({ id: Math.random().toString(36).substring(2, 9), type: defaultType, 법인: '한맥', 자산코드: '', 명칭: '', 설치위치: '', MACaddress: '', HW사양: '', OS: '', 연락처: '', 담당부서: '' } as any, 'add');
    } else if (cat === 'sw') {
      openSwModal({ id: Math.random().toString(36).substring(2, 9), type: tab === '대시보드' ? '구독SW' : tab, 제품명: '', 금액: '', 수량: 1, 계정명: '', 납품업체: '', 비고: '', 법인: '한맥' } as any, 'add');
    }
  });

  createIcons({
    icons: { Download, Upload, FileSpreadsheet, Plus, X, LayoutDashboard, Monitor, Server, Database, Laptop, CalendarClock, Key, Cpu, Layers, Users, Paperclip, Edit2, History, RefreshCcw, BookOpen, Settings }
  });
}

document.addEventListener('DOMContentLoaded', initApp);
