/**
 * CEO Dashboard 타입 정의
 */

import type React from 'react';
import type { ModuleId } from '@/modules/types';

// 체크포인트 타입 (경고/성공/에러/정보)
export type CheckPointType = 'success' | 'warning' | 'error' | 'info';

// 하이라이트 색상 타입
export type HighlightColor = 'red' | 'green' | 'blue';

// 개별 하이라이트 항목
export interface HighlightItem {
  text: string;
  color: HighlightColor;
}

export interface CheckPoint {
  id: string;
  type: CheckPointType;
  message: string;
  highlight?: string; // 기존 호환용 (단일 하이라이트, 빨간색)
  highlights?: HighlightItem[]; // 다중 하이라이트 + 색상 지원
}

// 서브 아이템 타입 (매출, 입금 등)
export interface SubItem {
  label: string;
  value: number | string;
}

// 금액 카드 타입
export interface AmountCard {
  id: string;
  label: string;
  amount: number;
  subAmount?: number;
  subLabel?: string;
  previousAmount?: number;
  previousLabel?: string;
  subItems?: SubItem[]; // 다중 서브 정보 (매출, 입금 등)
  unit?: string; // 건, 원 등
  currency?: 'KRW' | 'USD'; // 통화 (기본: KRW)
  isHighlighted?: boolean; // 빨간색 강조
  changeRate?: string; // 어제 대비 변동률 (예: "+5.2%", "-3.1%")
  changeDirection?: 'up' | 'down'; // 변동 방향
  path?: string; // 클릭 시 이동할 경로
  displayValue?: string; // 포맷팅된 표시값 (예: "6.2개월") - amount 대신 사용
}

// 오늘의 이슈 항목 (카드 형태 - 현황판용)
export interface TodayIssueItem {
  id: string;
  label: string;
  count: number | string;
  subLabel?: string; // 예: "부가세 신고 D-15"
  isHighlighted?: boolean; // 빨간색 강조 (반전 재고)
  path: string; // 클릭 시 이동할 경로
  icon?: React.ComponentType<{ className?: string }>; // 카드 아이콘
}

// 오늘의 이슈 notification_type 코드 (API 고정값 - 색상 매핑용)
export type TodayIssueNotificationType =
  | 'sales_order'      // 수주등록
  | 'bad_debt'         // 추심이슈
  | 'safety_stock'     // 안전재고
  | 'expected_expense' // 지출 승인대기
  | 'vat_report'       // 세금 신고
  | 'approval_request' // 결재 요청
  | 'new_vendor'       // 신규거래처
  | 'deposit'          // 입금
  | 'withdrawal'       // 출금
  | 'other';           // 기타

// 오늘의 이슈 뱃지 타입 (한글 표시용)
// 백엔드 TodayIssue.php BADGE 상수와 동기화!
export type TodayIssueListBadgeType =
  | '수주등록'
  | '추심이슈'
  | '안전재고'
  | '지출 승인대기'
  | '세금 신고'
  | '결재 요청'
  | '신규거래처'
  | '입금'
  | '출금'
  | '기타';

// 오늘의 이슈 리스트 아이템 (리스트 형태 - 새로운 오늘의 이슈용)
export interface TodayIssueListItem {
  id: string;
  badge: TodayIssueListBadgeType; // 한글 표시용
  notificationType: TodayIssueNotificationType; // 색상 매핑용 코드값
  content: string;
  time: string; // "10분 전", "1시간 전" 등
  date?: string; // ISO date string (캘린더 표시용)
  needsApproval?: boolean; // 승인/반려 버튼 표시 여부
  path?: string; // 클릭 시 이동할 경로
}

// 일일 일보 데이터
export interface DailyReportData {
  date: string; // "2026년 1월 5일 월요일"
  cards: AmountCard[];
  checkPoints: CheckPoint[];
}

// 당월 예상 지출 데이터
export interface MonthlyExpenseData {
  cards: AmountCard[];
  checkPoints: CheckPoint[];
}

// 카드/가지급금 관리 데이터
export interface CardManagementData {
  cards: AmountCard[];
  checkPoints: CheckPoint[];
  warningBanner?: string; // 상단 경고 배너 메시지
}

// 접대비 현황 데이터
export interface EntertainmentData {
  cards: AmountCard[];
  checkPoints: CheckPoint[];
}

// 복리후생비 현황 데이터
export interface WelfareData {
  cards: AmountCard[];
  checkPoints: CheckPoint[];
}

// 미수금 현황 데이터
export interface ReceivableData {
  cards: AmountCard[];
  checkPoints: CheckPoint[];
  detailButtonLabel?: string;
  detailButtonPath?: string;
}

// 채권추심 현황 데이터
export interface DebtCollectionData {
  cards: AmountCard[];
  checkPoints: CheckPoint[];
  detailButtonPath?: string;
}

// 부가세 현황 데이터
export interface VatData {
  cards: AmountCard[];
  checkPoints: CheckPoint[];
}

// 캘린더 일정 타입
export interface CalendarScheduleItem {
  id: string;
  title: string;
  startDate: string; // ISO date string
  endDate: string;
  startTime?: string; // "09:00"
  endTime?: string; // "12:00"
  isAllDay?: boolean;
  type: 'schedule' | 'order' | 'construction' | 'other' | 'bill'
    | 'expected_expense' | 'delivery' | 'shipment'; // 일정, 발주, 시공, 어음, 결제예정, 납기, 출고
  department?: string; // 부서명
  personName?: string; // 담당자명
  color?: string;
}

// 캘린더 뷰 타입
export type CalendarViewType = 'week' | 'month';

// 캘린더 부서 필터 타입
export type CalendarDeptFilterType = 'all' | 'department' | 'personal';

// 캘린더 업무 필터 타입
export type CalendarTaskFilterType = 'all' | 'schedule' | 'order' | 'construction' | 'bill'
    | 'expected_expense' | 'delivery' | 'shipment';

// ===== 매출 현황 데이터 =====
export interface SalesMonthlyTrend {
  month: string; // "7월", "8월" ...
  amount: number;
}

export interface SalesClientData {
  name: string;
  amount: number;
}

export interface SalesDailyItem {
  date: string;
  client: string;
  item: string;
  amount: number;
  status: '입금완료' | '미입금' | '부분입금';
}

export interface SalesStatusData {
  cumulativeSales: number;
  achievementRate: number;
  yoyChange: number; // +12.5 or -5.0
  monthlySales: number;
  monthlyTrend: SalesMonthlyTrend[];
  clientSales: SalesClientData[];
  dailyItems: SalesDailyItem[];
  dailyTotal: number;
}

// ===== 매입 현황 데이터 =====
export interface PurchaseMonthlyTrend {
  month: string;
  amount: number;
}

export interface PurchaseMaterialRatio {
  name: string;
  value: number;
  percentage: number;
  color: string;
}

export interface PurchaseDailyItem {
  date: string;
  supplier: string;
  item: string;
  amount: number;
  status: '결제완료' | '미결제' | '부분결제';
}

export interface PurchaseStatusData {
  cumulativePurchase: number;
  unpaidAmount: number;
  yoyChange: number;
  monthlyTrend: PurchaseMonthlyTrend[];
  materialRatio: PurchaseMaterialRatio[];
  dailyItems: PurchaseDailyItem[];
  dailyTotal: number;
}

// ===== 생산 현황 데이터 =====
export interface ProductionProcessData {
  processName: string; // "스크린", "슬루", "절곡"
  totalWork: number; // 전체 작업
  todo: number; // 할일
  inProgress: number; // 작업중
  completed: number; // 완료
  urgent: number;
  subLine: number;
  regular: number;
  workerCount: number;
  workItems: {
    id: string;
    orderNo: string;
    client: string;
    product: string;
    quantity: number;
    status: '진행중' | '대기' | '완료';
  }[];
  workers: {
    name: string;
    assigned: number;
    completed: number;
    rate: number;
  }[];
}

export interface ShipmentData {
  expectedAmount: number;
  expectedCount: number;
  actualAmount: number;
  actualCount: number;
}

export interface DailyProductionData {
  date: string; // "2026년 2월 23일 월요일"
  processes: ProductionProcessData[];
  shipment: ShipmentData;
}

// ===== 미출고 내역 데이터 =====
export interface UnshippedItem {
  id: string;
  portNo: string;
  siteName: string;
  orderClient: string;
  dueDate: string;
  daysLeft: number;
}

export interface ConstructionItem {
  id: string;
  siteName: string;
  client: string;
  startDate: string;
  endDate: string;
  progress: number;
  status: '진행중' | '예정' | '완료';
}

export interface UnshippedData {
  items: UnshippedItem[];
}

// ===== 시공 현황 데이터 =====
export interface ConstructionData {
  thisMonth: number;
  completed: number;
  items: ConstructionItem[];
}

// ===== 근태 현황 데이터 =====
export interface AttendanceEmployee {
  id: string;
  department: string;
  position: string;
  name: string;
  status: '출근' | '휴가' | '지각' | '결근';
}

export interface DailyAttendanceData {
  present: number;
  onLeave: number;
  late: number;
  absent: number;
  employees: AttendanceEmployee[];
}

// CEO Dashboard 전체 데이터
// 모든 필드 optional: mock 제거 후 API 미구현 섹션은 undefined
export interface CEODashboardData {
  todayIssue: TodayIssueItem[]; // 현황판용 (구 오늘의 이슈)
  todayIssueList: TodayIssueListItem[]; // 새 오늘의 이슈 (리스트 형태)
  dailyReport?: DailyReportData;
  monthlyExpense?: MonthlyExpenseData;
  cardManagement?: CardManagementData;
  entertainment?: EntertainmentData;
  welfare?: WelfareData;
  receivable?: ReceivableData;
  debtCollection?: DebtCollectionData;
  vat?: VatData;
  calendarSchedules?: CalendarScheduleItem[];
  salesStatus?: SalesStatusData;
  purchaseStatus?: PurchaseStatusData;
  dailyProduction?: DailyProductionData;
  unshipped?: UnshippedData;
  constructionData?: ConstructionData;
  dailyAttendance?: DailyAttendanceData;
}

// ===== 섹션 순서 관리 =====

// 대시보드 섹션 키
export type SectionKey =
  | 'todayIssueList'
  | 'dailyReport'
  | 'statusBoard'
  | 'monthlyExpense'
  | 'cardManagement'
  | 'entertainment'
  | 'welfare'
  | 'receivable'
  | 'debtCollection'
  | 'vat'
  | 'calendar'
  | 'salesStatus'
  | 'purchaseStatus'
  | 'production'
  | 'shipment'
  | 'unshipped'
  | 'construction'
  | 'attendance';

export const DEFAULT_SECTION_ORDER: SectionKey[] = [
  'todayIssueList',
  'dailyReport',
  'statusBoard',
  'monthlyExpense',
  'cardManagement',
  'entertainment',
  'welfare',
  'receivable',
  'debtCollection',
  'vat',
  'calendar',
  'salesStatus',
  'purchaseStatus',
  'production',
  'shipment',
  'unshipped',
  'construction',
  'attendance',
];

export const SECTION_LABELS: Record<SectionKey, string> = {
  todayIssueList: '오늘의 이슈',
  dailyReport: '자금현황',
  statusBoard: '현황판',
  monthlyExpense: '당월 예상 지출 내역',
  cardManagement: '가지급금 현황',
  entertainment: '접대비 현황',
  welfare: '복리후생비 현황',
  receivable: '미수금 현황',
  debtCollection: '채권추심 현황',
  vat: '부가세 현황',
  calendar: '캘린더',
  salesStatus: '매출 현황',
  purchaseStatus: '매입 현황',
  production: '생산 현황',
  shipment: '출고 현황',
  unshipped: '미출고 내역',
  construction: '시공 현황',
  attendance: '근태 현황',
};

// ===== 대시보드 설정 타입 =====

// 오늘의 이슈 개별 항목 설정
export interface TodayIssueSettings {
  orders: boolean; // 수주
  debtCollection: boolean; // 채권 추심
  safetyStock: boolean; // 안전 재고
  taxReport: boolean; // 세금 신고
  newVendor: boolean; // 신규 업체 등록
  annualLeave: boolean; // 연차
  vehicle: boolean; // 차량
  equipment: boolean; // 장비
  purchase: boolean; // 발주
  approvalRequest: boolean; // 결재 요청
  fundStatus: boolean; // 자금 현황
}

// 접대비 한도 관리 타입
export type EntertainmentLimitType = 'annual' | 'quarterly';

// 기업 구분 타입
export type CompanyType = 'large' | 'medium' | 'small';

// 복리후생비 한도 관리 타입
export type WelfareLimitType = 'annual' | 'quarterly';

// 복리후생비 계산 방식 타입
export type WelfareCalculationType = 'fixed' | 'ratio';

// 접대비 설정
export interface EntertainmentSettings {
  enabled: boolean;
  limitType: EntertainmentLimitType;
  companyType: CompanyType;
  highAmountThreshold: number; // 고액 결제 기준 금액
}

// 복리후생비 설정
export interface WelfareSettings {
  enabled: boolean;
  limitType: WelfareLimitType;
  calculationType: WelfareCalculationType;
  fixedAmountPerMonth: number; // 직원당 정해 금액/월
  ratio: number; // 연봉 총액 X 비율 (%)
  annualTotal: number; // 연간 복리후생비총액
  singlePaymentThreshold: number; // 1회 결제 기준 금액
}

// 대시보드 전체 설정
export interface DashboardSettings {
  // 오늘의 이슈 섹션 (새 리스트 형태)
  todayIssueList: boolean;
  // 현황판 섹션 (구 오늘의 이슈 - 카드 형태)
  statusBoard: {
    enabled: boolean;
    items: TodayIssueSettings;
  };
  // 메인 섹션들
  dailyReport: boolean;
  monthlyExpense: boolean;
  cardManagement: boolean;
  entertainment: EntertainmentSettings;
  welfare: WelfareSettings;
  receivable: boolean;
  debtCollection: boolean;
  vat: boolean;
  calendar: boolean;
  // 신규 섹션 설정
  salesStatus: boolean;
  purchaseStatus: boolean;
  production: boolean;
  shipment: boolean;
  unshipped: boolean;
  construction: boolean;
  attendance: boolean;
  // 섹션 순서
  sectionOrder?: SectionKey[];
  // Legacy: 기존 todayIssue 호환용 (deprecated, statusBoard로 대체)
  todayIssue: {
    enabled: boolean;
    items: TodayIssueSettings;
  };
}

// ===== 상세 모달 공통 타입 =====

// 요약 카드 타입
export interface SummaryCardData {
  label: string;
  value: string | number;
  isComparison?: boolean; // 전월 대비 등 비교 값인 경우
  isPositive?: boolean; // 비교 값일 때 증가/감소 여부
  unit?: string;
}

// 막대 차트 데이터 타입
export interface BarChartDataItem {
  name: string;
  value: number;
  [key: string]: string | number;
}

// 막대 차트 설정 타입
export interface BarChartConfig {
  title: string;
  data: BarChartDataItem[];
  dataKey: string;
  xAxisKey: string;
  color?: string;
}

// 도넛 차트 데이터 타입
export interface PieChartDataItem {
  name: string;
  value: number;
  percentage: number;
  color: string;
}

// 도넛 차트 설정 타입
export interface PieChartConfig {
  title: string;
  data: PieChartDataItem[];
}

// 가로 막대 차트 데이터 타입
export interface HorizontalBarChartDataItem {
  name: string;
  value: number;
}

// 가로 막대 차트 설정 타입
export interface HorizontalBarChartConfig {
  title: string;
  data: HorizontalBarChartDataItem[];
  dataKey?: string;
  yAxisKey?: string;
  color?: string;
}

// 테이블 컬럼 타입
export interface TableColumnConfig {
  key: string;
  label: string;
  align?: 'left' | 'center' | 'right';
  format?: 'number' | 'currency' | 'date' | 'text';
  width?: string;
  highlightValue?: string; // 이 값일 때 주황색으로 강조 표시
  highlightColor?: 'red' | 'orange' | 'blue' | 'green'; // 컬럼 전체에 적용할 색상
}

// 테이블 필터 옵션 타입
export interface TableFilterOption {
  value: string;
  label: string;
}

// 테이블 필터 설정 타입
export interface TableFilterConfig {
  key: string;
  options: TableFilterOption[];
  defaultValue: string;
}

// 테이블 하단 요약 항목 타입
export interface FooterSummaryItem {
  label: string;
  value: string | number;
  format?: 'number' | 'currency';
}

// 테이블 설정 타입
export interface TableConfig {
  title: string;
  columns: TableColumnConfig[];
  data: Record<string, unknown>[];
  filters?: TableFilterConfig[];
  showTotal?: boolean;
  totalLabel?: string;
  totalValue?: string | number;
  totalColumnKey?: string; // 합계가 들어갈 컬럼 키
  footerSummary?: FooterSummaryItem[]; // 하단 다중 합계 섹션
}

// 비교 박스 아이템 타입
export interface ComparisonBoxItem {
  label: string;
  value: string | number;
  unit?: string;
}

// 비교 박스 설정 타입
export interface ComparisonBoxConfig {
  title: string;
  items: ComparisonBoxItem[];
  borderColor: 'orange' | 'blue';
}

// VS 중앙 세부 항목 타입
export interface VsBreakdownItem {
  label: string;
  value: string | number;
  unit?: string;
}

// VS 비교 섹션 설정 타입
export interface ComparisonSectionConfig {
  leftBox: ComparisonBoxConfig;
  rightBox: ComparisonBoxConfig;
  vsLabel: string;
  vsValue: string | number;
  vsSubLabel?: string;
  vsBreakdown?: VsBreakdownItem[]; // VS 중앙에 표시할 세부 항목들
}

// 참조 테이블 설정 타입 (필터 없는 정보성 테이블)
export interface ReferenceTableConfig {
  title: string;
  columns: TableColumnConfig[];
  data: Record<string, unknown>[];
}

// 계산 카드 아이템 타입 (접대비 계산 등)
export interface CalculationCardItem {
  label: string;
  value: number;
  unit?: string;
  operator?: '+' | '=' | '-' | '×'; // 연산자 표시
}

// 계산 카드 섹션 설정 타입
export interface CalculationCardsConfig {
  title: string;
  subtitle?: string; // 서브타이틀 (예: "직원당 정액 금액/월 200,000원")
  cards: CalculationCardItem[];
}

// 분기별 테이블 행 타입
export interface QuarterlyTableRow {
  label: string;
  q1?: number | string;
  q2?: number | string;
  q3?: number | string;
  q4?: number | string;
  total?: number | string;
}

// 분기별 테이블 설정 타입
export interface QuarterlyTableConfig {
  title: string;
  rows: QuarterlyTableRow[];
}

// 검토 필요 카드 아이템 타입
export interface ReviewCardItem {
  label: string;
  amount: number;
  subLabel: string; // e.g., "미증빙 5건"
}

// 검토 필요 카드 섹션 설정 타입
export interface ReviewCardsConfig {
  title: string;
  cards: ReviewCardItem[];
}

// 기간 필터 설정 타입
export type DateFilterPreset = '당해년도' | '전전월' | '전월' | '당월' | '어제' | '오늘';

export interface DateFilterConfig {
  enabled: boolean;
  presets?: DateFilterPreset[]; // 기간 버튼 목록 (기본: 전체)
  defaultPreset?: DateFilterPreset; // 기본 선택 프리셋
  showSearch?: boolean; // 검색 입력창 표시 여부
}

// 신고기간 셀렉트 설정 타입
export interface PeriodSelectConfig {
  enabled: boolean;
  options: { value: string; label: string }[];
  defaultValue?: string;
  onPeriodChange?: (value: string) => void;
}

// 상세 모달 전체 설정 타입
export interface DetailModalConfig {
  title: string;
  dateFilter?: DateFilterConfig; // 기간선택기 + 검색
  periodSelect?: PeriodSelectConfig; // 신고기간 셀렉트 (부가세 등)
  summaryCards: SummaryCardData[];
  reviewCards?: ReviewCardsConfig; // 검토 필요 카드 섹션
  barChart?: BarChartConfig;
  pieChart?: PieChartConfig;
  horizontalBarChart?: HorizontalBarChartConfig; // 가로 막대 차트 (도넛 차트 대신 사용)
  comparisonSection?: ComparisonSectionConfig; // VS 비교 섹션
  referenceTable?: ReferenceTableConfig; // 참조 테이블 (필터 없음)
  referenceTables?: ReferenceTableConfig[]; // 다중 참조 테이블
  calculationCards?: CalculationCardsConfig; // 계산 카드 섹션
  quarterlyTable?: QuarterlyTableConfig; // 분기별 테이블
  table?: TableConfig;
}

// ===== 모듈별 섹션 매핑 (Phase 2: Dashboard Decoupling) =====

/** 특정 모듈이 필요한 섹션 매핑 (여기 없는 섹션은 공통 = 항상 표시) */
export const MODULE_DEPENDENT_SECTIONS: Partial<Record<SectionKey, ModuleId>> = {
  production: 'production',
  shipment: 'production',
  construction: 'construction',
  // unshipped는 공통(outbound/logistics) — 모듈 의존성 없음
};

/** 섹션이 요구하는 모듈 ID 반환. 공통 섹션이면 null */
export function sectionRequiresModule(sectionKey: SectionKey): ModuleId | null {
  return MODULE_DEPENDENT_SECTIONS[sectionKey] ?? null;
}

// 기본 설정값
export const DEFAULT_DASHBOARD_SETTINGS: DashboardSettings = {
  // 새 오늘의 이슈 (리스트 형태)
  todayIssueList: true,
  // 현황판 (구 오늘의 이슈 - 카드 형태)
  statusBoard: {
    enabled: true,
    items: {
      orders: true,
      debtCollection: true,
      safetyStock: true,
      taxReport: true,
      newVendor: true,
      annualLeave: true,
      vehicle: false,
      equipment: false,
      purchase: false,
      approvalRequest: true,
      fundStatus: true,
    },
  },
  dailyReport: true,
  monthlyExpense: true,
  cardManagement: true,
  entertainment: {
    enabled: true,
    limitType: 'annual',
    companyType: 'medium',
    highAmountThreshold: 500000,
  },
  welfare: {
    enabled: true,
    limitType: 'quarterly',
    calculationType: 'fixed',
    fixedAmountPerMonth: 200000,
    ratio: 20.5,
    annualTotal: 20000000,
    singlePaymentThreshold: 500000,
  },
  receivable: true,
  debtCollection: true,
  vat: true,
  calendar: true,
  // 신규 섹션
  salesStatus: true,
  purchaseStatus: true,
  production: true,
  shipment: true,
  unshipped: true,
  construction: true,
  attendance: true,
  // 섹션 순서
  sectionOrder: DEFAULT_SECTION_ORDER,
  // Legacy: 기존 todayIssue 호환용 (statusBoard와 동일)
  todayIssue: {
    enabled: true,
    items: {
      orders: true,
      debtCollection: true,
      safetyStock: true,
      taxReport: true,
      newVendor: true,
      annualLeave: true,
      vehicle: false,
      equipment: false,
      purchase: false,
      approvalRequest: true,
      fundStatus: true,
    },
  },
};