/**
 * 대시보드 공통 데이터 + 컴포넌트
 *   - C: 끼니저 컬러 토큰
 *   - DASH_DATA: 모든 변형이 공유하는 더미 데이터
 *   - 미니 컴포넌트들: KpiCard, AlertItem, TrendChart, BarChart, Sparkline 등
 */

const C = {
  primary:'#16a34a', primaryD:'#15803d', primary50:'#f0fdf4', primary100:'#dcfce7',
  danger:'#dc2626', danger50:'#fef2f2', warning:'#f59e0b', warning50:'#fffbeb',
  info:'#0ea5e9', info50:'#f0f9ff', violet:'#8b5cf6', violet50:'#f5f3ff',
  teal:'#0d9488', teal50:'#f0fdfa',
  fg1:'#0f172a', fg2:'#334155', fg3:'#64748b', fg4:'#94a3b8',
  border:'#e2e8f0', borderL:'#f1f5f9',
  bg:'#f8fafc', bgDeep:'#eef2f7',
};

const DASH_DATA = {
  // 오늘 (5/15 목요일)
  today: {
    deliveryCount: 47,
    deliveryCompanies: 23,
    deliveryQty: 412,
    deliveryAmount: 5_564_000,
    completed: 31,
    inProgress: 12,
    pending: 4,
  },
  // 미수금
  unpaid: {
    total: 8_750_000,
    companies: 12,
    overdue30: 3,  // 30일 이상
    overdue60: 1,  // 60일 이상
    items: [
      { name:'P업체', amount:1_240_000, days:62, level:'high' },
      { name:'A업체', amount:980_000, days:45, level:'high' },
      { name:'B업체', amount:870_000, days:38, level:'mid' },
      { name:'D업체', amount:620_000, days:21, level:'mid' },
      { name:'Q업체', amount:540_000, days:14, level:'low' },
    ],
  },
  // 매출
  sales: {
    thisMonth: 142_580_000,
    lastMonth: 128_450_000,
    diff: 11.0, // %
    daily: [4.2,4.8,5.1,4.6,5.3,5.7,5.2,4.9,5.4,5.6,5.1,5.8,6.2,5.9,5.4], // 만 단위
  },
  // 주문량
  orders: {
    thisMonth: 4823,
    lastMonth: 4521,
    diff: 6.7,
    daily: [320,340,355,330,360,380,365,345,370,385,360,395,410,395,375],
  },
  // 업체 증감
  companies: {
    total: 247,
    newThisMonth: 12,
    endThisMonth: 5,
    diff: 7,  // 순증
    monthly: [{m:'12월',n:8,e:6},{m:'1월',n:14,e:4},{m:'2월',n:11,e:5},{m:'3월',n:18,e:7},{m:'4월',n:9,e:3},{m:'5월',n:12,e:5}],
  },
  // 알림 카테고리
  alerts: {
    unpaid: [
      { name:'P업체', text:'62일 미수 · ₩1,240,000', age:'2일 전 등록' },
      { name:'A업체', text:'45일 미수 · ₩980,000', age:'5일 전 등록' },
      { name:'B업체', text:'38일 미수 · ₩870,000', age:'1주 전 등록' },
    ],
    complaint: [
      { name:'S업체', text:'배송 시 도시락 흔들려 국물 흘림', age:'오늘' },
      { name:'T업체', text:'반찬 양 부족 클레임', age:'어제' },
    ],
    expiring: [
      { name:'K업체', text:'5/22 종료 (D-7)', age:'' },
      { name:'한솔푸드', text:'5/25 종료 (D-10)', age:'' },
      { name:'동방산업', text:'5/30 종료 (D-15)', age:'' },
    ],
    todo: [
      { name:'P업체', text:'5/21 단가 협의 미팅', age:'D-6' },
      { name:'A업체', text:'정수기 필터 교체 일정', age:'D-3' },
    ],
    newSignup: [
      { name:'M업체', text:'그룹1, 카드결제, 5/12 등록', age:'3일 전' },
      { name:'N업체', text:'그룹2, 현금결제, 5/14 등록', age:'1일 전' },
    ],
  },
  // 메뉴 TOP
  topMenus: [
    { name:'도시락A', qty:1842, ratio:38 },
    { name:'도시락B', qty:1124, ratio:23 },
    { name:'도시락A+샐러드', qty:723, ratio:15 },
    { name:'프리미엄', qty:482, ratio:10 },
    { name:'기타', qty:652, ratio:14 },
  ],
};

// ──────────────────────────────────────────────────────────────
// 공통 미니 컴포넌트
// ──────────────────────────────────────────────────────────────

/* KPI 카드 — 끼니저 UI 키트 정통 스타일 (좌측 컬러박스 + 우측 정렬 숫자) */
const KpiCard = ({label, value, unit, sub, color=C.primary, bg='#fff', sparkline}) => {
  const iconBg = `${color}1a`;
  return <div style={{ background:bg, borderRadius:8, minHeight:88, display:'flex', alignItems:'center', boxShadow:'0 1px 4px rgba(0,0,0,0.06), 0 4px 12px rgba(0,0,0,0.04)', border:`1px solid ${C.border}`, borderLeft:`4px solid ${color}`, transition:'box-shadow .2s, transform .15s', flex:1, minWidth:140, position:'relative', overflow:'hidden' }}
    onMouseEnter={e=>{e.currentTarget.style.boxShadow='0 4px 16px rgba(0,0,0,0.10)';e.currentTarget.style.transform='translateY(-1px)'}}
    onMouseLeave={e=>{e.currentTarget.style.boxShadow='0 1px 4px rgba(0,0,0,0.06), 0 4px 12px rgba(0,0,0,0.04)';e.currentTarget.style.transform='none'}}>
    <div style={{ marginLeft:14, padding:10, borderRadius:8, background:iconBg, display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}>
      <div style={{ width:22, height:22, borderRadius:4, background:color, opacity:0.7 }}/>
    </div>
    <div style={{ flex:1, textAlign:'right', paddingRight:16, minWidth:0 }}>
      <div style={{ display:'flex', alignItems:'baseline', justifyContent:'flex-end', gap:3 }}>
        <span style={{ fontSize:22, fontWeight:800, color:C.fg1, lineHeight:1.2, letterSpacing:'-0.5px' }}>{value}</span>
        {unit && <span style={{ fontSize:12, color:C.fg3, fontWeight:700 }}>{unit}</span>}
      </div>
      <div style={{ fontSize:11, color:C.fg4, fontWeight:600, marginTop:4, letterSpacing:'0.3px', textTransform:'uppercase' }}>{label}</div>
      {sub && <div style={{ fontSize:10, color: typeof sub==='string' ? C.fg3 : (sub.color||C.fg3), fontWeight:600, marginTop:3, whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{typeof sub==='string'?sub:sub.text}</div>}
    </div>
  </div>;
};

/* 알림 아이템 — 카테고리 스택 안의 한 줄 */
const AlertItem = ({company, text, age, color, action='보기'}) => (
  <div style={{display:'flex',alignItems:'center',gap:10,padding:'10px 14px',borderBottom:`1px solid ${C.borderL}`,cursor:'pointer',transition:'background .15s'}}
       onMouseEnter={e=>e.currentTarget.style.background=C.bg}
       onMouseLeave={e=>e.currentTarget.style.background='transparent'}>
    <div style={{width:6,height:6,borderRadius:3,background:color,flexShrink:0}}/>
    <div style={{flex:1,minWidth:0}}>
      <div style={{fontSize:12,fontWeight:700,color:C.fg1,whiteSpace:'nowrap',overflow:'hidden',textOverflow:'ellipsis'}}>{company}</div>
      <div style={{fontSize:11,color:C.fg3,marginTop:1,whiteSpace:'nowrap',overflow:'hidden',textOverflow:'ellipsis'}}>{text}</div>
    </div>
    {age && <span style={{fontSize:10,color:C.fg4,fontWeight:600,flexShrink:0}}>{age}</span>}
  </div>
);

/* 알림 카테고리 박스 */
const AlertStack = ({title, count, color, items, badge='건', emptyText='없음'}) => (
  <div style={{background:'#fff',border:`1px solid ${C.border}`,borderRadius:10,overflow:'hidden',display:'flex',flexDirection:'column',minHeight:0}}>
    <div style={{padding:'12px 16px',display:'flex',alignItems:'center',justifyContent:'space-between',background:'#fafbfc',borderBottom:`1px solid ${C.border}`}}>
      <div style={{display:'flex',alignItems:'center',gap:8}}>
        <div style={{width:8,height:8,borderRadius:4,background:color}}/>
        <span style={{fontSize:13,fontWeight:800,color:C.fg1}}>{title}</span>
      </div>
      <span style={{fontSize:11,fontWeight:800,color:color,background:'#fff',border:`1px solid ${color}33`,padding:'2px 9px',borderRadius:11}}>{count}{badge}</span>
    </div>
    <div style={{flex:1,overflow:'auto',minHeight:0}}>
      {items.length===0 ? <div style={{padding:'20px',textAlign:'center',color:C.fg4,fontSize:11}}>{emptyText}</div> :
        items.map((it,i) => <AlertItem key={i} company={it.name} text={it.text} age={it.age} color={color}/>)}
    </div>
  </div>
);

/* 라인 차트 — 일별 매출/주문량 */
const LineChart = ({data, color=C.primary, height=120, fillOpacity=0.15, unit=''}) => {
  const max = Math.max(...data) * 1.1;
  const min = Math.min(...data) * 0.9;
  const w = 280, h = height;
  const pts = data.map((v,i) => ({x: (i/(data.length-1))*w, y: h - ((v-min)/(max-min))*h}));
  const line = pts.map((p,i) => `${i===0?'M':'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ');
  const fill = `${line} L${w},${h} L0,${h} Z`;
  return <svg viewBox={`0 0 ${w} ${h}`} preserveAspectRatio="none" style={{width:'100%',height,display:'block'}}>
    <defs>
      <linearGradient id={`grad-${color.slice(1)}`} x1="0" y1="0" x2="0" y2="1">
        <stop offset="0%" stopColor={color} stopOpacity={fillOpacity*2}/>
        <stop offset="100%" stopColor={color} stopOpacity="0"/>
      </linearGradient>
    </defs>
    <path d={fill} fill={`url(#grad-${color.slice(1)})`}/>
    <path d={line} stroke={color} strokeWidth="2" fill="none" strokeLinejoin="round" strokeLinecap="round"/>
    <circle cx={pts[pts.length-1].x} cy={pts[pts.length-1].y} r="4" fill={color}/>
    <circle cx={pts[pts.length-1].x} cy={pts[pts.length-1].y} r="7" fill={color} fillOpacity="0.2"/>
  </svg>;
};

/* 스파크라인 (KPI 카드용 작은 그래프) */
const Sparkline = ({data, color=C.primary, w=80, h=28}) => {
  const max = Math.max(...data), min = Math.min(...data);
  const pts = data.map((v,i) => `${(i/(data.length-1))*w},${h - ((v-min)/(max-min||1))*h}`).join(' ');
  return <svg width={w} height={h}><polyline points={pts} fill="none" stroke={color} strokeWidth="1.5" strokeLinejoin="round" strokeLinecap="round"/></svg>;
};

/* 막대 차트 (업체 증감) */
const BarChart = ({data, height=140}) => {
  const max = Math.max(...data.flatMap(d=>[d.n,d.e])) * 1.2;
  return <div style={{display:'flex',alignItems:'flex-end',justifyContent:'space-around',height,padding:'0 6px',gap:4}}>
    {data.map((d,i) => (
      <div key={i} style={{display:'flex',flexDirection:'column',alignItems:'center',gap:4,flex:1}}>
        <div style={{display:'flex',alignItems:'flex-end',gap:3,height:height-28}}>
          <div style={{width:10,height:`${(d.n/max)*100}%`,background:C.primary,borderRadius:'2px 2px 0 0',position:'relative'}} title={`신규 ${d.n}`}/>
          <div style={{width:10,height:`${(d.e/max)*100}%`,background:C.fg4,borderRadius:'2px 2px 0 0',position:'relative'}} title={`종료 ${d.e}`}/>
        </div>
        <span style={{fontSize:10,color:C.fg4,fontWeight:600}}>{d.m}</span>
      </div>
    ))}
  </div>;
};

/* 추세 뱃지 (▲ 11.0%) */
const TrendBadge = ({value, suffix='%', muted=false}) => {
  const up = value > 0;
  const color = muted ? C.fg3 : (up ? C.primary : C.danger);
  return <span style={{display:'inline-flex',alignItems:'center',gap:3,fontSize:11,fontWeight:800,color,background:muted?'#f1f5f9':(up?C.primary50:C.danger50),padding:'2px 7px',borderRadius:10}}>
    <span style={{fontSize:8}}>{up?'▲':'▼'}</span>{Math.abs(value)}{suffix}
  </span>;
};

/* 메인 페이지 셸 (사이드바 placeholder + 페이지 헤더) */
const DashShell = ({children, headline, subtitle, accent=C.primary}) => (
  <div style={{height:'100%',background:C.bgDeep,display:'flex',flexDirection:'column',overflow:'hidden'}}>
    {/* 페이지 헤더 (탑바 모방) */}
    <div style={{padding:'20px 28px 14px',background:'#fff',borderBottom:`1px solid ${C.border}`,display:'flex',alignItems:'center',justifyContent:'space-between'}}>
      <div>
        <div style={{fontSize:11,color:C.fg4,fontWeight:600,marginBottom:2}}>끼니저 · 대시보드</div>
        <div style={{fontSize:20,fontWeight:900,color:C.fg1,letterSpacing:'-0.4px'}}>{headline}</div>
        {subtitle && <div style={{fontSize:12,color:C.fg3,marginTop:3,fontWeight:500}}>{subtitle}</div>}
      </div>
      <div style={{display:'flex',alignItems:'center',gap:8}}>
        <button style={{height:36,padding:'0 14px',borderRadius:6,border:`1px solid ${C.border}`,background:'#fff',color:C.fg2,fontSize:12,fontWeight:600,cursor:'pointer'}}>📅 5월</button>
        <button style={{height:36,padding:'0 16px',borderRadius:6,border:'none',background:accent,color:'#fff',fontSize:12,fontWeight:700,cursor:'pointer',display:'flex',alignItems:'center',gap:5}}>+ 주문 추가</button>
      </div>
    </div>
    <div style={{flex:1,overflow:'auto'}}>{children}</div>
  </div>
);

Object.assign(window, { C, DASH_DATA, KpiCard, AlertItem, AlertStack, LineChart, Sparkline, BarChart, TrendBadge, DashShell });
