import { MasterAssetData, HardwareAsset, SoftwareAsset, SWUser } from './excelHandler';

const corps = ['한맥', '삼안', '바론'];
const users = ['홍길동', '김철수', '이영희', '박지훈', '김팀장', '신유진', '윤대웅', '마리아'];
const depts = ['설계팀', '기술팀', '경영지원팀', '영업팀'];

function rand(arr: any[]) {
  return arr[Math.floor(Math.random() * arr.length)];
}

function randDate(startYear: number, endYear: number) {
  const y = Math.floor(Math.random() * (endYear - startYear + 1)) + startYear;
  const m = String(Math.floor(Math.random() * 12) + 1).padStart(2, '0');
  const d = String(Math.floor(Math.random() * 28) + 1).padStart(2, '0');
  return `${y}-${m}-${d}`;
}

function randUser() { // 25% 확률로 유휴자산 할당
  return Math.random() < 0.25 ? '' : rand(users);
}

export function generateDummyData(): MasterAssetData {
  const hw: HardwareAsset[] = [];
  const sw: SoftwareAsset[] = [];
  const swUsers: SWUser[] = [];
  
  // 1. 개인PC 50개
  for (let i = 1; i <= 50; i++) {
    const purchaseYear = Math.floor(Math.random() * 10) + 2017; // 2017~2026
    hw.push({
      id: Math.random().toString(36).substring(2, 9),
      type: '개인PC',
      법인: rand(corps),
      자산코드: `HM-PC-${purchaseYear}-${String(i).padStart(3, '0')}`,
      명칭: '',
      위치: `${rand(['본사', '지사'])} ${Math.floor(Math.random()*5)+1}층`,
      사용자: randUser(),
      CPU: rand(['i5-10400', 'i7-12700', 'Ryzen 5', 'Ryzen 7']),
      GPU: rand(['-', 'GTX 1660', 'RTX 3060', 'RTX 4070']),
      RAM: rand(['16GB', '32GB']),
      SSD1: rand(['256GB', '512GB', '1TB']),
      SSD2: '',
      HDD1: rand(['-', '1TB', '2TB']),
      HDD2: '',
      구매일: randDate(purchaseYear, purchaseYear),
      금액: String(Math.floor(Math.random()*100 + 50) * 10000).replace(/\B(?=(\d{3})+(?!\d))/g, ','),
      납품업체: rand(['다나와', '컴퓨존', '오피스디포']),
      품의서명: '',
      관리자: '', IP주소: '', MACaddress: '', OS: '', HW사양: ''
    });
  }

  // 2. 서버 20개
  for (let i = 1; i <= 20; i++) {
    const purchaseYear = Math.floor(Math.random() * 10) + 2017; // 2017~2026
    hw.push({
      id: Math.random().toString(36).substring(2, 9),
      type: '서버',
      법인: rand(corps),
      자산코드: `HM-SV-${purchaseYear}-${String(i).padStart(3, '0')}`,
      명칭: `웹/DB 서버 #${i}`,
      용도: rand(['웹 서버', 'DB 서버', '백업 서버', '개발 서버']),
      storage유형: rand(['물리', 'VM']),
      위치: rand(['IDC 1센터', 'IDC 2센터', '본사 전산실']),
      관리자: rand(users),
      담당자_정: rand(users),
      담당자_부: rand(users),
      IP주소: `192.168.10.${i}`,
      원격접속: `ssh://192.168.10.${i}:22`,
      MACaddress: '00:11:22:33:44:' + String(i).padStart(2, '0'),
      OS: rand(['Windows Server 2019', 'Ubuntu 22.04 LTS', 'CentOS 7']),
      모델명: rand(['Dell PowerEdge R740', 'HP ProLiant DL380', 'Lenovo ThinkSystem']),
      CPU: rand(['Xeon Silver 4210', 'Xeon Gold 6248', 'EPYC 7702']),
      RAM: rand(['64GB', '128GB', '256GB']),
      GPU: rand(['-', 'RTX A4000', 'Tesla V100']),
      SSD1: rand(['512GB SSD', '1TB NVMe']),
      SSD2: rand(['-', '1TB SSD', '2TB SSD']),
      HDD1: rand(['-', '4TB HDD', '8TB HDD']),
      모니터링: rand(['Zabbix', 'Grafana', 'PRTG']),
      비고: i % 5 === 0 ? '정기 점검 대상' : '-',
      HW사양: 'Xeon 16Core, 64GB RAM',
      구매일: randDate(purchaseYear, purchaseYear),
      금액: '5,000,000',
      납품업체: '서버뱅크',
      품의서명: ''
    });
  }

  // 3. 스토리지 20개
  for (let i = 1; i <= 20; i++) {
    const purchaseYear = Math.floor(Math.random() * 10) + 2017; // 2017~2026
    hw.push({
      id: Math.random().toString(36).substring(2, 9),
      type: '스토리지',
      법인: rand(corps),
      storage유형: rand(['NAS', 'DAS']),
      자산코드: `HM-ST-${purchaseYear}-${String(i).padStart(3, '0')}`,
      명칭: `백업 스토리지 #${i}`,
      위치: '전산실',
      모델명: rand(['Synology DS920+', 'QNAP TS-453D']),
      용량: rand(['16TB', '32TB', '64TB']),
      담당자_정: randUser(),
      담당자_부: rand(users),
      IP주소: `192.168.20.${i}`,
      MACaddress: '',
      구매일: randDate(purchaseYear, purchaseYear),
      금액: '1,500,000',
      납품업체: '스토리지넷',
      품의서명: '',
      관리자: '', OS: '', HW사양: ''
    });
  }

  // 4. 전산비품 (노트북, 태블릿, 휴대폰 각각 5개씩)
  const equips = [
    { type: '노트북', code: 'NB', name: 'LG 그램 16인치', price: '1,800,000' },
    { type: '태블릿', code: 'TB', name: '아이패드 프로 12.9', price: '1,500,000' },
    { type: '휴대폰', code: 'PH', name: '갤럭시 S24', price: '1,200,000' }
  ];
  equips.forEach((eq) => {
    for (let i = 1; i <= 5; i++) {
      const purchaseYear = Math.floor(Math.random() * 8) + 2019; // 2019~2026
      hw.push({
        id: Math.random().toString(36).substring(2, 9),
        type: '전산비품',
        법인: rand(corps),
        비품유형: eq.type,
        자산코드: `HM-${eq.code}-${purchaseYear}-${String(i).padStart(3, '0')}`,
        명칭: eq.name,
        위치: rand(['본사', '지사']),
        관리자: randUser(),
        구매일: randDate(purchaseYear, purchaseYear),
        금액: eq.price,
        납품업체: '브랜드 총판',
        품의서명: '',
        IP주소: '', MACaddress: '', OS: '', HW사양: ''
      });
    }
  });

  // 5. 구독형 S/W 40개
  for (let i = 1; i <= 40; i++) {
    const swId = Math.random().toString(36).substring(2, 9);
    const purchaseYear = Math.random() < 0.3 ? 2026 : 2024;
    
    let isExpiring = Math.random() < 0.25;
    let endDt = new Date();
    if (isExpiring) {
      endDt.setDate(endDt.getDate() + Math.floor(Math.random() * 25) + 1); // 1~25일 뒤 만료
    } else {
      endDt.setMonth(endDt.getMonth() + Math.floor(Math.random() * 11) + 2); // 넉넉히 남음
    }
    const endStr = `${endDt.getFullYear()}.${String(endDt.getMonth()+1).padStart(2,'0')}.${String(endDt.getDate()).padStart(2,'0')}`;
    
    sw.push({
      id: swId,
      type: '구독SW',
      분야: rand(['업무공통', '개발S/W', '디자인', '설계S/W']),
      법인: rand(corps),
      부서: rand(depts),
      제품명: rand(['Adobe CC All Apps', 'Microsoft 365', 'Slack Pro', 'Notion Team']),
      구매일: `${purchaseYear}-01-01`,
      구독일: `${purchaseYear}.01.01 ~ ${endStr}`,
      금액: String(Math.floor(Math.random() * 100 + 10) * 10000).replace(/\B(?=(\d{3})+(?!\d))/g, ','),
      수량: Math.floor(Math.random() * 5) + 3, // 3~7
      계정명: `user${i}@hm.com`,
      납품업체: '총판',
      비고: '연간구독'
    });
    
    const assignCount = Math.floor(Math.random() * 2) + 1;
    for (let j=0; j<assignCount; j++) {
      swUsers.push({
        id: Math.random().toString(36).substring(2, 9),
        swId: swId,
        법인: rand(corps),
        부서: rand(depts),
        팀: rand(['1팀', '2팀', '기획팀']),
        직위: rand(['사원', '대리', '과장']),
        이름: rand(users),
        사용기간: '2024.01~12',
        신청서명: ''
      });
    }
  }

  // 6. 영구형 S/W 40개
  for (let i = 1; i <= 40; i++) {
    const swId = Math.random().toString(36).substring(2, 9);

    let isExpiring = Math.random() < 0.25;
    let endDt = new Date();
    if (isExpiring) {
      endDt.setDate(endDt.getDate() + Math.floor(Math.random() * 25) + 1); // 1~25일 뒤 만료
    } else {
      endDt.setMonth(endDt.getMonth() + Math.floor(Math.random() * 11) + 2); // 넉넉히 남음
    }
    const endStr = `${endDt.getFullYear()}.${String(endDt.getMonth()+1).padStart(2,'0')}.${String(endDt.getDate()).padStart(2,'0')}`;

    sw.push({
      id: swId,
      type: '영구SW',
      분야: rand(['업무공통', '개발S/W', '디자인', '설계S/W']),
      법인: rand(corps),
      부서: rand(depts),
      제품명: rand(['AutoCAD 2024', 'Windows 10 Pro', '한컴오피스 2022', 'Visual Studio 2022']),
      구매일: '2020-05-15',
      유지보수여부: true,
      비고: `유지보수: ~ ${endStr}`,
      금액: '1,500,000',
      수량: Math.floor(Math.random() * 3) + 2, // 2~4
      계정명: `sn-2020-${i}`,
      납품업체: '오토데스크 / MS'
    });
    const assignCount = Math.floor(Math.random() * 2) + 1;
    for (let j=0; j<assignCount; j++) {
      swUsers.push({
        id: Math.random().toString(36).substring(2, 9),
        swId: swId,
        법인: rand(corps),
        부서: rand(depts),
        팀: rand(['1팀', '2팀']),
        직위: rand(['과장', '차장', '부장']),
        이름: rand(users),
        사용기간: '영구',
        신청서명: ''
      });
    }
  }

  return { hw, sw, swUsers, logs: [] };
}
