/* global React, Icon, Btn, Avatar, PlatformIcon, Drawer, LISTS, CREATORS_DB, CAMPAIGNS, PLATFORMS, fmt */
// — Drawers: Create Plan, Send to Campaign, Add Creators —

// Small segmented control used across the Create Plan form.
const Seg = ({ value, onChange, options }) => (
  <div className="seg">
    {options.map(o => (
      <button key={o.value} type="button"
        className={value === o.value ? 'seg-on' : ''}
        onClick={() => onChange(o.value)}>{o.label}</button>
    ))}
  </div>
);

// Compact numeric field used in the Targets & Goals tab.
const GoalField = ({ label, value, onChange, step, prefix, suffix = '', hint, placeholder }) => (
  <div className="field" style={{ marginBottom: 0 }}>
    {label && <label className="field-label">{label}</label>}
    <div style={{ position: 'relative' }}>
      {prefix && <span style={{ position: 'absolute', left: 11, top: '50%', transform: 'translateY(-50%)', color: 'var(--ink-3)', fontSize: 13, pointerEvents: 'none' }}>{prefix}</span>}
      <input type="number" min="0" step={step || '1'}
        value={value === 0 || value === '' || value == null ? '' : value}
        placeholder={placeholder || '0'}
        onChange={e => onChange(e.target.value === '' ? 0 : Number(e.target.value))}
        style={{ width: '100%', paddingLeft: prefix ? 22 : 12, paddingRight: suffix ? 28 : 12 }} />
      {suffix && <span style={{ position: 'absolute', right: 11, top: '50%', transform: 'translateY(-50%)', color: 'var(--ink-3)', fontSize: 13, pointerEvents: 'none' }}>{suffix}</span>}
    </div>
    {hint && <span className="field-hint">{hint}</span>}
  </div>
);

// — Create Plan drawer (mirrors the existing Publish List drawer pattern) —
const CreatePlanDrawer = ({ open, fromListId, onClose, onCreate, lists, defaultCpm = 150.76, currency = 'GBP' }) => {
  const list = lists.find(l => l.id === fromListId);
  const [name, setName] = React.useState('');
  const cur = (window.CURRENCY && window.CURRENCY.symbol) || '£';
  const [targetBudget, setTargetBudget] = React.useState(0); // 0 = no goal
  const [targetViews, setTargetViews] = React.useState(0); // 0 = no goal
  const [targetCpm, setTargetCpm] = React.useState(defaultCpm); // fixed target CPM (£), set by market
  const [paidMedia, setPaidMedia] = React.useState(0);
  const [viewsModifier, setViewsModifier] = React.useState(0); // 0 = off; e.g. 80 / 120
  const [payoutBasis, setPayoutBasis] = React.useState('total'); // 'total' | 'perPost'
  const [payoutValue, setPayoutValue] = React.useState(0);
  const [agencyEnabled, setAgencyEnabled] = React.useState(false);
  const [agencyBasis, setAgencyBasis] = React.useState('total'); // 'total' | 'perPost'
  const [agencyType, setAgencyType] = React.useState('percentage'); // 'percentage' | 'flat'
  const [agencyValue, setAgencyValue] = React.useState(10);
  const [seedScope, setSeedScope] = React.useState('all'); // 'all' | 'approved'
  const [openListPicker, setOpenListPicker] = React.useState(false);
  const [chosenListId, setChosenListId] = React.useState(fromListId);
  const [tab, setTab] = React.useState('details'); // 'details' | 'goals'
  React.useEffect(() => { setChosenListId(fromListId); }, [fromListId]);
  React.useEffect(() => { if (open) setTargetCpm(defaultCpm); }, [open, defaultCpm]);
  React.useEffect(() => {
    if (open) {
      const def = list ? `${list.name} — plan` : 'New plan';
      setName(def);
    }
  }, [open, list, fromListId]);

  const chosen = lists.find(l => l.id === chosenListId);

  return (
    <Drawer open={open} title="Create Plan" onClose={onClose}
      footer={
        <>
          <Btn variant="ghost" onClick={onClose}>Cancel</Btn>
          <Btn variant="primary" icon="sparkles" disabled={!name || !chosenListId}
            onClick={()=>onCreate({ name, currency, targetBudget, targetViews, targetCpm, paidMedia, viewsModifier, payoutBasis, payoutValue, agencyFee: { enabled: agencyEnabled, basis: agencyBasis, type: agencyType, value: agencyValue }, listId: chosenListId, seedScope })}>
            Create plan
          </Btn>
        </>
      }>
      <div className="field">
        <label className="field-label">Plan name <span style={{color:'var(--red)',fontWeight:700}}>*</span></label>
        <input value={name} onChange={e=>setName(e.target.value)} placeholder="e.g. Lumen Launch — Wave 1"/>
      </div>

      <div className="field" style={{marginBottom:0}}>
        <label className="field-label">Source list <span style={{color:'var(--red)',fontWeight:700}}>*</span></label>
        {chosen ? (
          <div className="row gap-3" style={{padding:'10px 12px',border:'1px solid var(--border)',borderRadius:8,background:'#fbfbfd'}}>
            <Icon name="list" size={16}/>
            <div className="flex-1">
              <div style={{fontWeight:600,fontSize:13}}>{chosen.name}</div>
              <div className="muted" style={{fontSize:11}}>{chosen.creators} creators · {chosen.desc || 'no description'}</div>
            </div>
            <button className="btn-link" onClick={()=>setOpenListPicker(v=>!v)}>Change</button>
          </div>
        ) : (
          <button className="row gap-3" onClick={()=>setOpenListPicker(true)} style={{padding:'10px 12px',border:'1px dashed var(--border-strong)',borderRadius:8,background:'transparent',cursor:'pointer',width:'100%',color:'var(--ink-3)',textAlign:'left'}}>
            <Icon name="list" size={16}/>
            <span style={{flex:1}}>Pick a list to start with…</span>
            <Icon name="chevron-right" size={14}/>
          </button>
        )}
        {openListPicker && (
          <div className="card" style={{marginTop:6,padding:'4px 0',maxHeight:200,overflow:'auto'}}>
            {lists.map(l => (
              <button key={l.id} onClick={()=>{setChosenListId(l.id); setOpenListPicker(false);}}
                style={{width:'100%',display:'flex',alignItems:'center',gap:10,padding:'8px 12px',background:'transparent',border:0,fontSize:13,cursor:'pointer',textAlign:'left'}}>
                <Icon name="list" size={14}/>
                <div className="flex-1">
                  <div style={{fontWeight:600}}>{l.name}</div>
                  <div className="muted" style={{fontSize:11}}>{l.creators} creators</div>
                </div>
                {l.id === chosenListId && <Icon name="check" size={14}/>}
              </button>
            ))}
          </div>
        )}
      </div>

      <div style={{borderTop:'1px solid var(--border)',margin:'22px 0 18px'}}></div>
      <div className="field-label" style={{fontSize:13,fontWeight:700,marginBottom:14,color:'var(--ink)'}}>Targets &amp; Goals</div>
      <div className="banner banner-info" style={{marginBottom:18}}>
        <Icon name="sparkles" size={14}/>
        <span>All optional — set any targets you want the plan to track against. Leave a value at <b>0</b> to skip that goal. Everything here can be edited on the plan later.</span>
      </div>

      <div style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:14,marginBottom:14}}>
        <GoalField label="Target budget" value={targetBudget} onChange={setTargetBudget} prefix={cur} />
        <GoalField label="Misc additional fees" value={paidMedia} onChange={setPaidMedia} prefix={cur} hint="Optional pre-allocated spend" />
      </div>

      <div className="field">
        <label className="field-label">Target views</label>
        <GoalField label="" value={targetViews} onChange={setTargetViews} prefix="" suffix="views" />
      </div>

      <div style={{display:'grid',gridTemplateColumns:'1fr',gap:14,marginBottom:0}}>
        <div className="field">
          <label className="field-label">Target CPM</label>
          <div style={{display:'flex',alignItems:'center',height:36,padding:'0 10px',border:'1px solid var(--line)',borderRadius:6,background:'var(--bg-muted, #f5f5f5)',color:'var(--ink)',fontVariantNumeric:'tabular-nums'}}>{cur + Number(targetCpm).toLocaleString((window.CURRENCY&&window.CURRENCY.locale)||'en-GB', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}</div>
          <span className="field-hint">Fixed · cost per 1k views</span>
        </div>
      </div>
    </Drawer>
  );
};

// — Send to Campaign drawer —
const SendToCampaignDrawer = ({ open, plan, visibleCreators = [], onClose, onSend }) => {
  const [campaignName, setCampaignName] = React.useState('');
  const [startDate, setStartDate] = React.useState('');
  const [endDate, setEndDate] = React.useState('');
  React.useEffect(() => {
    if (open && plan) {
      setCampaignName(plan.name.replace(/ — plan$/,''));
      // Dates are intentionally NOT auto-populated — the user must choose them.
      setStartDate('');
      setEndDate('');
    }
  }, [open, plan]);

  if (!plan) return null;

  const visibleCount = visibleCreators.length;
  const stack = visibleCreators.slice(0, 6);
  const overflow = visibleCount - stack.length;
  const dateError = startDate && endDate && endDate < startDate;
  const canCreate = campaignName.trim() && startDate && endDate && !dateError;

  return (
    <Drawer open={open} title="Send to Campaign" onClose={onClose} width={520}
      footer={
        <>
          <Btn variant="ghost" onClick={onClose}>Cancel</Btn>
          <Btn variant="primary" icon="send" disabled={!canCreate}
            onClick={()=>onSend({ mode:'new', campaignName, startDate, endDate })}>
            Create campaign
          </Btn>
        </>
      }>
      {/* Creator count summary — what this campaign will be created with */}
      <div className="row gap-3" style={{alignItems:'center',padding:'14px 16px',border:'1px solid var(--border)',borderRadius:12,background:'#fbfbfd',marginBottom:18}}>
        <div className="col" style={{lineHeight:1}}>
          <span style={{fontSize:28,fontWeight:700,letterSpacing:'-.02em'}}>{visibleCount}</span>
          <span className="field-label" style={{marginTop:4}}>{`Creator${visibleCount===1?'':'s'} included`}</span>
        </div>
        <div style={{flex:1}}/>
        <div className="row" style={{alignItems:'center'}}>
          {stack.map((c,i)=>(
            <div key={c.id} style={{marginLeft: i===0?0:-8, border:'2px solid #fff', borderRadius:'50%', position:'relative', zIndex: stack.length - i}}>
              <Avatar name={c.name} color={c.avatar} size="sm"/>
            </div>
          ))}
          {overflow > 0 && (
            <div style={{marginLeft:-8,width:24,height:24,borderRadius:'50%',background:'#e6e8ee',border:'2px solid #fff',display:'flex',alignItems:'center',justifyContent:'center',fontSize:10,fontWeight:700,color:'var(--ink-2)'}}>+{overflow}</div>
          )}
        </div>
      </div>

      <div className="banner banner-info" style={{marginBottom:18}}>
        <Icon name="send" size={14}/>
        <span>Creates a campaign from this plan's <b>{visibleCount} visible creator{visibleCount===1?'':'s'}</b>. The plan stays editable; any creators you've removed from the plan are not sent.</span>
      </div>

      <div className="field">
        <label className="field-label">Campaign name <span style={{color:'var(--red)',fontWeight:700}}>*</span></label>
        <input value={campaignName} onChange={e=>setCampaignName(e.target.value)} placeholder="e.g. Lumen Launch — Wave 1"/>
      </div>

      <div style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:14,marginBottom: dateError ? 6 : 0}}>
        <div className="field" style={{marginBottom:0}}>
          <label className="field-label" style={{whiteSpace:'nowrap'}}>Start date <span style={{color:'var(--red)',fontWeight:700}}>*</span></label>
          <input type="date" value={startDate} onChange={e=>setStartDate(e.target.value)} max={endDate || undefined} style={{width:'100%'}}/>
        </div>
        <div className="field" style={{marginBottom:0}}>
          <label className="field-label" style={{whiteSpace:'nowrap'}}>End date <span style={{color:'var(--red)',fontWeight:700}}>*</span></label>
          <input type="date" value={endDate} onChange={e=>setEndDate(e.target.value)} min={startDate || undefined} style={{width:'100%'}}/>
        </div>
      </div>
      {dateError && <div style={{color:'var(--red)',fontSize:12,marginTop:2}}>End date can't be before the start date.</div>}
    </Drawer>
  );
};

// — Add Creators drawer —
const AddCreatorsDrawer = ({ open, plan, onClose, onAdd }) => {
  const [pickedIds, setPickedIds] = React.useState(new Set());
  React.useEffect(() => { if (open) setPickedIds(new Set()); }, [open]);
  if (!plan) return null;

  const existing = new Set(plan.creatorIds);
  const candidates = CREATORS_DB.filter(c => !existing.has(c.id));

  const toggle = (id) => {
    const next = new Set(pickedIds);
    if (next.has(id)) next.delete(id); else next.add(id);
    setPickedIds(next);
  };

  return (
    <Drawer open={open} title="Add creators" onClose={onClose} width={520}
      footer={
        <>
          <Btn variant="ghost" onClick={onClose}>Cancel</Btn>
          <Btn variant="primary" icon="plus" disabled={pickedIds.size===0}
            onClick={()=>onAdd(Array.from(pickedIds))}>
            Add {pickedIds.size || ''} creator{pickedIds.size===1?'':'s'}
          </Btn>
        </>
      }>
      <div className="banner banner-info" style={{marginBottom:14}}>
        <Icon name="grid" size={14}/>
        <span>Sourced from the <b>Pandora Creator Database</b>. Source list stays linked.</span>
      </div>

      <div className="search-wrap" style={{marginBottom:14}}>
        <span className="icon"><Icon name="search" size={14}/></span>
        <input className="search" placeholder="Search creators by name or @handle"/>
      </div>

      {candidates.length === 0 ? (
        <div className="muted" style={{fontSize:13,padding:'24px 0',textAlign:'center'}}>All creators in your lists are already in this plan.</div>
      ) : (
        <div className="col gap-2">
          {candidates.map(c => (
            <label key={c.id} className="row gap-3" style={{padding:'10px 12px',border:'1px solid var(--border)',borderRadius:10,cursor:'pointer'}}>
              <input type="checkbox" checked={pickedIds.has(c.id)} onChange={()=>toggle(c.id)}/>
              <Avatar name={c.name} color={c.avatar}/>
              <div className="flex-1">
                <div style={{fontWeight:600,fontSize:13}}>{c.name}</div>
                <div className="row gap-2" style={{marginTop:2}}>
                  {c.handles.map(h=>(<PlatformIcon key={h.platform} id={h.platform} size={13}/>))}
                  <span className="muted" style={{fontSize:11}}>{c.handles.length} handle{c.handles.length===1?'':'s'} · {c.bio}</span>
                </div>
              </div>
            </label>
          ))}
        </div>
      )}
    </Drawer>
  );
};

Object.assign(window, { CreatePlanDrawer, SendToCampaignDrawer, AddCreatorsDrawer });
