// 업무 플로우 설정 - menuDefinitions.js 기반 자동 생성
// 메뉴 구조와 비즈니스 로직 연결 정의

import { menuGroups, salesMenus, productionMenus, qualityMenus, inventoryMenus, accountingMenus } from './menuDefinitions';

// ============================================================
// 비즈니스 프로세스 연결 정의
// 작은 단위(화면) → 큰 단위(업무 흐름) 연결
// ============================================================

// 화면 간 데이터 흐름 정의
export const screenDataFlows = {
  // 판매관리 흐름
  'customer': {
    outputs: ['quote', 'order', 'site'],
    description: '거래처 정보 → 견적/수주/현장에 사용'
  },
  'quote': {
    inputs: ['customer', 'price'],
    outputs: ['order'],
    description: '견적 → 수주 전환'
  },
  'order': {
    inputs: ['quote', 'customer', 'site'],
    outputs: ['work-order', 'shipment'],
    description: '수주 → 작업지시/출하로 연결'
  },
  'site': {
    inputs: ['customer'],
    outputs: ['order', 'shipment'],
    description: '현장 정보 → 수주/출하에 사용'
  },
  'price': {
    outputs: ['quote'],
    description: '단가 정보 → 견적에 적용'
  },
  'shipment': {
    inputs: ['order', 'work-result', 'fqc'],
    outputs: ['sales-list', 'collection-list'],
    description: '출하 → 매출/수금 생성'
  },

  // 생산관리 흐름
  'item': {
    outputs: ['work-order', 'stock'],
    description: '품목 정보 → 작업지시/재고에 사용'
  },
  'work-order': {
    inputs: ['order', 'item'],
    outputs: ['work-result', 'pqc'],
    description: '작업지시 → 작업실적/중간검사'
  },
  'work-result': {
    inputs: ['work-order'],
    outputs: ['fqc', 'stock', 'shipment'],
    description: '작업실적 → 제품검사/재고/출하 가능'
  },
  'worker-task': {
    inputs: ['work-order'],
    outputs: ['work-result'],
    description: '작업자 화면에서 실적 입력'
  },

  // 품질관리 흐름
  'iqc': {
    inputs: ['inbound'],
    outputs: ['stock'],
    description: '입고검사 → 합격 시 재고 입고'
  },
  'pqc': {
    inputs: ['work-order'],
    outputs: ['work-result', 'defect'],
    description: '중간검사 → 부적합 발생 시 부적합품 관리'
  },
  'fqc': {
    inputs: ['work-result'],
    outputs: ['shipment', 'defect'],
    description: '제품검사 → 합격 시 출하 가능'
  },
  'defect': {
    inputs: ['pqc', 'fqc', 'iqc'],
    outputs: ['work-order'],
    description: '부적합품 → 재작업 지시'
  },

  // 자재관리 흐름
  'stock': {
    inputs: ['iqc', 'work-result'],
    outputs: ['work-order'],
    description: '재고 → 작업지시 시 자재 확인'
  },
  'inbound': {
    outputs: ['iqc', 'stock'],
    description: '입고 → 수입검사 또는 바로 재고'
  },

  // 회계관리 흐름
  'sales-list': {
    inputs: ['shipment'],
    outputs: ['sales-statement', 'sales-tax-invoice', 'collection-list'],
    description: '매출 → 거래명세서/세금계산서/수금'
  },
  'collection-list': {
    inputs: ['sales-list', 'shipment'],
    outputs: ['cashbook-list'],
    description: '수금 → 금전출납부'
  },
  'purchase-list': {
    inputs: ['inbound'],
    outputs: ['expense-list', 'cashbook-list'],
    description: '품의서 → 지출결의서/금전출납부'
  },
  'cashbook-list': {
    inputs: ['collection-list', 'expense-list'],
    outputs: ['cost-list'],
    description: '금전출납부 → 원가분석'
  },
  'cost-list': {
    inputs: ['cashbook-list', 'order'],
    description: '원가분석 - 수주별 원가 집계'
  },
};

// ============================================================
// 주요 업무 프로세스 정의 (큰 단위)
// ============================================================
export const businessProcesses = [
  {
    id: 'sales-process',
    name: '판매 프로세스',
    description: '거래처 등록부터 수주 확정까지',
    icon: 'DollarSign',
    color: 'blue',
    menuGroup: 'sales',
    steps: [
      { screenId: 'customer', action: '거래처 등록/조회', required: true },
      { screenId: 'site', action: '현장 등록', required: false },
      { screenId: 'quote', action: '견적서 작성', required: true },
      { screenId: 'order', action: '수주 확정', required: true },
    ],
  },
  {
    id: 'production-process',
    name: '생산 프로세스',
    description: '작업지시부터 생산완료까지',
    icon: 'Factory',
    color: 'green',
    menuGroup: 'production',
    steps: [
      { screenId: 'work-order', action: '작업지시 생성', required: true, trigger: 'order' },
      { screenId: 'worker-task', action: '작업자 실적 입력', required: true },
      { screenId: 'work-result', action: '작업실적 확인', required: true },
      { screenId: 'pqc', action: '중간검사', required: true },
    ],
  },
  {
    id: 'quality-process',
    name: '품질 프로세스',
    description: '입고검사부터 출하검사까지',
    icon: 'ShieldCheck',
    color: 'purple',
    menuGroup: 'quality',
    steps: [
      { screenId: 'iqc', action: '수입검사 (자재)', required: true, trigger: 'inbound' },
      { screenId: 'pqc', action: '중간검사 (공정)', required: true, trigger: 'work-order' },
      { screenId: 'fqc', action: '제품검사 (출하)', required: true, trigger: 'work-result' },
      { screenId: 'defect', action: '부적합품 처리', required: false },
    ],
  },
  {
    id: 'shipment-process',
    name: '출하 프로세스',
    description: '출하준비부터 배송완료까지',
    icon: 'Truck',
    color: 'orange',
    menuGroup: 'sales',
    steps: [
      { screenId: 'fqc', action: '제품검사 완료', required: true },
      { screenId: 'shipment', action: '출하 등록', required: true },
      { screenId: 'sales-list', action: '매출 확정', required: true },
      { screenId: 'sales-statement', action: '거래명세서 발행', required: false },
    ],
  },
  {
    id: 'accounting-process',
    name: '회계 프로세스',
    description: '매출부터 수금/지급까지',
    icon: 'CreditCard',
    color: 'indigo',
    menuGroup: 'accounting',
    steps: [
      { screenId: 'sales-list', action: '매출 조회', required: true, trigger: 'shipment' },
      { screenId: 'sales-tax-invoice', action: '세금계산서 발행', required: true },
      { screenId: 'collection-list', action: '수금 등록', required: true },
      { screenId: 'cashbook-list', action: '금전출납부 기록', required: true },
      { screenId: 'cost-list', action: '원가분석', required: false },
    ],
  },
  {
    id: 'inventory-process',
    name: '자재/재고 프로세스',
    description: '자재입고부터 재고관리까지',
    icon: 'Box',
    color: 'teal',
    menuGroup: 'inventory',
    steps: [
      { screenId: 'inbound', action: '자재 입고', required: true },
      { screenId: 'iqc', action: '수입검사', required: true },
      { screenId: 'stock', action: '재고 등록', required: true },
    ],
  },
];

// ============================================================
// 전체 업무 흐름 (End-to-End)
// ============================================================
export const endToEndFlows = [
  {
    id: 'order-to-cash',
    name: '수주-출하-수금 (Order to Cash)',
    description: '수주 접수부터 대금 회수까지의 전체 프로세스',
    color: 'blue',
    processes: ['sales-process', 'production-process', 'quality-process', 'shipment-process', 'accounting-process'],
    steps: [
      { screenId: 'customer', label: '거래처', phase: '판매' },
      { screenId: 'quote', label: '견적', phase: '판매' },
      { screenId: 'order', label: '수주', phase: '판매' },
      { screenId: 'work-order', label: '작업지시', phase: '생산' },
      { screenId: 'work-result', label: '작업실적', phase: '생산' },
      { screenId: 'pqc', label: '중간검사', phase: '품질' },
      { screenId: 'fqc', label: '제품검사', phase: '품질' },
      { screenId: 'shipment', label: '출하', phase: '물류' },
      { screenId: 'sales-list', label: '매출', phase: '회계' },
      { screenId: 'sales-tax-invoice', label: '세금계산서', phase: '회계' },
      { screenId: 'collection-list', label: '수금', phase: '회계' },
    ],
  },
  {
    id: 'procure-to-pay',
    name: '구매-입고-지급 (Procure to Pay)',
    description: '자재 구매부터 대금 지급까지의 전체 프로세스',
    color: 'green',
    processes: ['inventory-process', 'quality-process'],
    steps: [
      { screenId: 'purchase-list', label: '품의서', phase: '구매' },
      { screenId: 'inbound', label: '입고', phase: '자재' },
      { screenId: 'iqc', label: '수입검사', phase: '품질' },
      { screenId: 'stock', label: '재고', phase: '자재' },
      { screenId: 'expense-list', label: '지출결의', phase: '회계' },
      { screenId: 'cashbook-list', label: '지급', phase: '회계' },
    ],
  },
  {
    id: 'make-to-stock',
    name: '생산-재고 (Make to Stock)',
    description: '생산 계획부터 재고 적재까지',
    color: 'purple',
    processes: ['production-process', 'quality-process'],
    steps: [
      { screenId: 'item', label: '품목', phase: '기준정보' },
      { screenId: 'work-order', label: '작업지시', phase: '생산' },
      { screenId: 'worker-task', label: '작업', phase: '생산' },
      { screenId: 'work-result', label: '실적', phase: '생산' },
      { screenId: 'pqc', label: '중간검사', phase: '품질' },
      { screenId: 'stock', label: '재고', phase: '자재' },
    ],
  },
];

// ============================================================
// 메뉴 그룹별 화면 연결 자동 생성
// ============================================================
export const getMenuGroupFlows = () => {
  const flows = {};

  menuGroups.forEach(group => {
    flows[group.id] = {
      id: group.id,
      label: group.label,
      icon: group.icon,
      screens: [],
    };

    // subMenus 처리 (일반 메뉴 또는 중첩 메뉴)
    group.subMenus.forEach(menu => {
      if (menu.subMenus) {
        // 중첩 메뉴 (회계관리 등)
        menu.subMenus.forEach(subMenu => {
          flows[group.id].screens.push({
            id: subMenu.id,
            label: subMenu.label,
            type: subMenu.type,
            parentId: menu.id,
            parentLabel: menu.label,
          });
        });
      } else {
        // 일반 메뉴
        flows[group.id].screens.push({
          id: menu.id,
          label: menu.label,
          description: menu.description,
        });
      }
    });
  });

  return flows;
};

// ============================================================
// 화면 상세 정보 (화면 ID로 조회)
// ============================================================
export const getScreenInfo = (screenId) => {
  // 모든 메뉴에서 검색
  for (const group of menuGroups) {
    for (const menu of group.subMenus) {
      if (menu.id === screenId) {
        return {
          ...menu,
          group: group.id,
          groupLabel: group.label,
        };
      }
      // 중첩 메뉴 검색
      if (menu.subMenus) {
        for (const subMenu of menu.subMenus) {
          if (subMenu.id === screenId) {
            return {
              ...subMenu,
              group: group.id,
              groupLabel: group.label,
              parent: menu.id,
              parentLabel: menu.label,
            };
          }
        }
      }
    }
  }
  return null;
};

// ============================================================
// 연결된 화면 조회 (특정 화면의 입력/출력 화면)
// ============================================================
export const getConnectedScreens = (screenId) => {
  const flow = screenDataFlows[screenId];
  if (!flow) return { inputs: [], outputs: [] };

  return {
    inputs: (flow.inputs || []).map(id => ({
      id,
      ...getScreenInfo(id),
    })),
    outputs: (flow.outputs || []).map(id => ({
      id,
      ...getScreenInfo(id),
    })),
    description: flow.description,
  };
};

// ============================================================
// 전체 데이터 흐름 그래프 생성 (시각화용)
// ============================================================
export const generateFlowGraph = () => {
  const nodes = [];
  const edges = [];

  // 노드 생성
  Object.keys(screenDataFlows).forEach(screenId => {
    const info = getScreenInfo(screenId);
    if (info) {
      nodes.push({
        id: screenId,
        label: info.label,
        group: info.group || info.groupLabel,
        type: info.type,
      });
    }
  });

  // 엣지 생성
  Object.entries(screenDataFlows).forEach(([screenId, flow]) => {
    (flow.outputs || []).forEach(targetId => {
      edges.push({
        source: screenId,
        target: targetId,
        description: flow.description,
      });
    });
  });

  return { nodes, edges };
};

// ============================================================
// 프로세스 상태 정의 (각 화면의 상태값)
// ============================================================
export const processStates = {
  'quote': ['작성중', '제출', '승인', '반려', '만료'],
  'order': ['접수', '확정', '생산중', '생산완료', '출하완료', '취소'],
  'work-order': ['대기', '진행중', '완료', '보류'],
  'work-result': ['미등록', '등록', '검사대기', '검사완료'],
  'shipment': ['준비', '출하', '배송중', '도착', '완료'],
  'iqc': ['대기', '검사중', '합격', '불합격', '조건부합격'],
  'pqc': ['대기', '검사중', '합격', '불합격'],
  'fqc': ['대기', '검사중', '합격', '불합격', '재검사'],
  'sales-list': ['미확정', '확정', '발행완료'],
  'collection-list': ['미수금', '부분수금', '수금완료'],
};

// ============================================================
// 상태 전이 규칙 (어떤 상태에서 어떤 상태로 전이 가능한지)
// ============================================================
export const stateTransitions = {
  'order': {
    '접수': ['확정', '취소'],
    '확정': ['생산중', '취소'],
    '생산중': ['생산완료'],
    '생산완료': ['출하완료'],
  },
  'work-order': {
    '대기': ['진행중', '보류'],
    '진행중': ['완료', '보류'],
    '보류': ['진행중'],
  },
  'shipment': {
    '준비': ['출하'],
    '출하': ['배송중'],
    '배송중': ['도착'],
    '도착': ['완료'],
  },
};

export default {
  screenDataFlows,
  businessProcesses,
  endToEndFlows,
  getMenuGroupFlows,
  getScreenInfo,
  getConnectedScreens,
  generateFlowGraph,
  processStates,
  stateTransitions,
};
