// ai.jsx — Gemini AI 自動化 + Google Calendar / Drive OAuth2

const GM_MODEL = 'gemini-1.5-flash-latest';

// ─── Gemini API ────────────────────────────────────────────
async function callGemini(prompt) {
  const key = (localStorage.getItem('gm_gemini_key') || '').trim();
  if (!key) throw new Error('no-key');
  const res = await fetch(
    `https://generativelanguage.googleapis.com/v1beta/models/${GM_MODEL}:generateContent?key=${key}`,
    { method:'POST', headers:{'Content-Type':'application/json'},
      body: JSON.stringify({ contents:[{ parts:[{ text: prompt }] }], generationConfig:{ temperature:0.2 } }) }
  );
  if (!res.ok) { const e=await res.json().catch(()=>({})); throw new Error(e.error?.message || `Gemini 錯誤 (${res.status})`); }
  const data = await res.json();
  let t = data.candidates?.[0]?.content?.parts?.[0]?.text || '';
  return t.replace(/^```json\s*/i,'').replace(/^```\s*/i,'').replace(/```\s*$/i,'').trim();
}
async function callGeminiJSON(prompt) {
  const t = await callGemini(prompt);
  try { return JSON.parse(t); } catch {
    const m = t.match(/\{[\s\S]*\}/);
    if (m) try { return JSON.parse(m[0]); } catch {}
    throw new Error('AI 回傳格式錯誤，請重試');
  }
}

// Feature 1 — 信件解析
async function parseEmailWithAI(email, riskKind) {
  return callGeminiJSON(
    `你是廣告業務助手，分析廠商來信並以 JSON 回傳，只回傳 JSON 不含其他文字。\n\n來信：\n${email}\n\n回傳格式（繁體中文）：\n{"vendor":"廠商名稱","contact":"窗口姓名","contactRole":"職稱","product":"產品名稱","budgetHint":"預算（無則填未提供）","wants":["需求1","需求2"],"riskKind":"food 或 cosmetic 或 general"}`
  );
}

// Feature 2 — 風控分析
async function analyzeRiskWithAI(c) {
  const laws = (window.LAW_LIB[c.riskKind]||window.LAW_LIB.general).map(l=>`${l.code}：${l.t}`).join('\n');
  const avoidWords = (window.AVOID_WORDS[c.riskKind]||window.AVOID_WORDS.general).join('、');
  return callGeminiJSON(
    `你是台灣廣告法規專家與 KOL 合作顧問，對以下產品進行合作風控評估，只回傳 JSON。\n\n廠商：${c.vendor}｜產品：${c.product}｜類別：${c.category}\n來信：${c.email}\n\n相關法規：\n${laws}\n禁用字眼：${avoidWords}\n\n回傳格式（繁體中文）：\n{"pros":["優點1","優點2"],"cons":["疑慮1","疑慮2"],"disputes":[{"y":"年份","t":"事件"}],"okAngle":"建議切入角度","risk":"high 或 mid 或 low","riskLabel":"需注意 或 待評估 或 低風險"}\n\n若無爭議 disputes 回傳 []`
  );
}

// Feature 3 — AI 產生報價信
async function generateQuoteWithAI(c, items, subtotal, situation) {
  const S = window.STUDIO;
  const situLabel = {s1:'情境一（接受洽談，友善專業）',s2:'情境二（婉拒，語氣婉轉）',s3:'情境三（團購+稿費）'}[situation]||'情境一';
  const itemLines = items.map(i=>`· ${i.name}　NT$ ${window.fmtNum(i.fee)}`).join('\n')||'（尚未選擇項目）';
  return callGeminiJSON(
    `你是廣告業務助手（多多），幫 KOL「${S.creator}」撰寫繁體中文報價信，根據廠商來信產生個人化自然的報價信，只回傳 JSON。\n\n廠商來信：\n${c.email}\n\n合作情境：${situLabel}\n廠商窗口：${c.contact}（${c.vendor}）\n產品：${c.product}\n合作項目（未稅）：\n${itemLines}\n小計：NT$ ${window.fmtNum(subtotal)}\n乙方：${S.name}　LINE：@942njuhl\n\n回傳格式：\n{"subject":"信件主旨","body":"信件全文（繁體中文，結尾署名：多多\\n${S.name}）"}`
  );
}

// Feature 6 — 廠商回覆溝通表解析
async function parseCommReplyWithAI(replyText, c) {
  return callGeminiJSON(
    `你是廣告業務助手，解析廠商回覆的需求確認信，整理成製作 brief 格式，只回傳 JSON。\n\n廠商回覆：\n${replyText}\n\n產品：${c.product}｜廠商：${c.vendor}\n\n回傳格式（繁體中文）：\n{"selling":"產品核心賣點（2-3點）","theme":"本次主打訴求或活動主題","onlineWindow":"期望上線時段","mustSay":"必提重點或指定台詞","avoid":"NG事項或禁用字眼","refLinks":"參考連結（無則留空）","materials":"廠商提供素材（無則留空）","sampleNeeded":"是 或 否","deliveryAddr":"收件地址（無則留空）","special":"其他特殊需求（無則留空）"}`
  );
}

// ─── Google OAuth2 (GIS Token Model) ──────────────────────
let _gToken = null;

function isGoogleConnected() {
  return !!(_gToken && _gToken.expiry > Date.now() + 5000);
}
function getGoogleAccessToken() {
  return isGoogleConnected() ? _gToken.access_token : null;
}
function getGoogleClientId() {
  return (localStorage.getItem('gm_gcal_clientid') || '').trim();
}
function requestGoogleToken(cb) {
  const clientId = getGoogleClientId();
  if (!clientId) { cb(null, 'no-client-id'); return; }
  if (!window.google?.accounts?.oauth2) { cb(null, 'GIS 未載入，請確認網路連線'); return; }
  try {
    const client = window.google.accounts.oauth2.initTokenClient({
      client_id: clientId,
      scope: 'https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/spreadsheets',
      callback: (resp) => {
        if (resp.error) { cb(null, resp.error); return; }
        _gToken = { access_token: resp.access_token, expiry: Date.now() + (+resp.expires_in - 30) * 1000 };
        cb(_gToken, null);
      }
    });
    // hint 指定帳號，跳過 Google 的選帳號畫面（瀏覽器裡同時登入多個 Google 帳號時，沒有 hint 每次都會跳出選擇畫面）
    // 預設帳號是 eae55556（果米工作室主帳號），可在 AI 設定裡改成其他已授權帳號（如 5cmgomei）
    const hint = (localStorage.getItem('gm_google_hint') || 'eae55556@gmail.com').trim();
    client.requestAccessToken(hint ? { prompt: '', hint } : { prompt: '' });
  } catch (e) { cb(null, e.message); }
}

// Feature 4 — Google Calendar 推送
async function pushCalendarEvents(events) {
  if (!isGoogleConnected()) throw new Error('尚未連結 Google 帳號');
  const token = _gToken.access_token;
  const fmt8 = (d) => d ? `${d.slice(0,4)}-${d.slice(4,6)}-${d.slice(6,8)}` : null;
  const nextDay = (s) => { const d=new Date(s); d.setDate(d.getDate()+1); return d.toISOString().slice(0,10); };
  for (const e of events) {
    const gc = e.color==='red' ? window.GCAL_COLOR.red : window.GCAL_COLOR.yellow;
    const startDate = e.kind==='range' ? fmt8(e.start) : fmt8(e.date);
    const endDate = e.kind==='range' ? nextDay(fmt8(e.end)) : nextDay(startDate);
    const res = await fetch('https://www.googleapis.com/calendar/v3/calendars/primary/events', {
      method:'POST',
      headers:{'Authorization':`Bearer ${token}`,'Content-Type':'application/json'},
      body: JSON.stringify({ summary:e.summary, description:e.desc||'', colorId:gc.id, start:{date:startDate}, end:{date:endDate} })
    });
    if (!res.ok) { const err=await res.json().catch(()=>({})); throw new Error(err.error?.message||'Calendar API 錯誤'); }
  }
}

// Feature 5 — Google Drive 資料夾建立
async function createDriveFolder(name, parentId) {
  if (!isGoogleConnected()) throw new Error('尚未連結 Google 帳號');
  const token = _gToken.access_token;
  const meta = { name, mimeType:'application/vnd.google-apps.folder' };
  if (parentId) meta.parents = [parentId];
  const res = await fetch('https://www.googleapis.com/drive/v3/files', {
    method:'POST',
    headers:{'Authorization':`Bearer ${token}`,'Content-Type':'application/json'},
    body: JSON.stringify(meta)
  });
  if (!res.ok) { const err=await res.json().catch(()=>({})); throw new Error(err.error?.message||'Drive API 錯誤'); }
  return res.json();
}

// ─── UI Components ─────────────────────────────────────────
function AIBtn({ onClick, disabled, loading, children, style }) {
  return (
    <button className="btn" onClick={onClick} disabled={disabled||loading}
      style={{ background:'oklch(0.91 0.06 288)', border:'1px solid oklch(0.81 0.1 288)', color:'oklch(0.33 0.12 288)', gap:6, ...style }}>
      {loading ? <><span className="ai-spin">◌</span> AI 分析中…</> : children}
    </button>
  );
}

function AISettingsModal({ open, onClose }) {
  const { Modal } = window;
  const [key, setKey] = React.useState(()=>localStorage.getItem('gm_gemini_key')||'');
  const [cid, setCid] = React.useState(()=>localStorage.getItem('gm_gcal_clientid')||'');
  const [sheetId, setSheetIdField] = React.useState(()=>window.getSheetId ? window.getSheetId() : '');
  const [hint, setHint] = React.useState(()=>localStorage.getItem('gm_google_hint')||'');
  const [testing, setTesting] = React.useState(false);
  const [testMsg, setTestMsg] = React.useState('');
  const save = () => {
    localStorage.setItem('gm_gemini_key', key.trim());
    localStorage.setItem('gm_gcal_clientid', cid.trim());
    localStorage.setItem('gm_google_hint', hint.trim());
    if (window.setSheetId) window.setSheetId(sheetId);
    setTestMsg(''); onClose();
  };
  const test = async () => {
    setTesting(true); setTestMsg('');
    try {
      localStorage.setItem('gm_gemini_key', key.trim());
      await callGemini('只回傳「OK」，不含其他文字');
      setTestMsg('✓ 連線成功');
    } catch (e) { setTestMsg('✗ ' + e.message); }
    setTesting(false);
  };
  return (
    <Modal open={open} onClose={onClose} width={520} title="AI 自動化設定" sub="Gemini API 金鑰・Google Calendar / Drive / Sheets OAuth2">
      <div style={{padding:'4px 20px 18px'}}>
        <div style={{marginBottom:18}}>
          <div style={{fontWeight:700,fontSize:12.5,marginBottom:4}}>✦ Gemini API 金鑰</div>
          <div className="faint" style={{fontSize:10.5,marginBottom:8,lineHeight:1.6}}>
            前往 <a href="https://aistudio.google.com/app/apikey" target="_blank" rel="noreferrer" style={{color:'oklch(0.45 0.12 288)'}}>Google AI Studio</a> 取得免費 API 金鑰（登入 Google 帳號即可申請），供信件解析、風控分析、報價信撰寫、溝通表整理使用。
          </div>
          <input className="inp" type="password" value={key} placeholder="AIza…" onChange={e=>setKey(e.target.value)} />
          <div style={{display:'flex',gap:8,marginTop:8,alignItems:'center'}}>
            <button className="btn" style={{height:28,fontSize:11.5}} onClick={test} disabled={testing||!key.trim()}>{testing?'測試中…':'測試連線'}</button>
            {testMsg && <span style={{fontSize:11.5,color:testMsg.startsWith('✓')?'var(--sage-ink)':'var(--rose-ink)'}}>{testMsg}</span>}
          </div>
        </div>
        <div style={{borderTop:'1px solid var(--line)',paddingTop:16}}>
          <div style={{fontWeight:700,fontSize:12.5,marginBottom:4}}>📅 Google OAuth2 Client ID</div>
          <div className="faint" style={{fontSize:10.5,marginBottom:8,lineHeight:1.6}}>
            前往 <a href="https://console.cloud.google.com/apis/credentials" target="_blank" rel="noreferrer" style={{color:'oklch(0.45 0.12 288)'}}>Google Cloud Console</a> 建立「網頁應用程式」OAuth2 用戶端 ID，並將此頁網址加入「已授權的 JavaScript 來源」。供 Calendar 推送及 Drive 資料夾建立使用。
          </div>
          <input className="inp" value={cid} placeholder="XXXXXX.apps.googleusercontent.com" onChange={e=>setCid(e.target.value)} />
        </div>
        <div style={{borderTop:'1px solid var(--line)',paddingTop:16,marginTop:16}}>
          <div style={{fontWeight:700,fontSize:12.5,marginBottom:4}}>📊 案件資料 Google 試算表 ID</div>
          <div className="faint" style={{fontSize:10.5,marginBottom:8,lineHeight:1.6}}>
            填入共用案件資料庫的試算表 ID（網址 .../d/ 與 /edit 之間那一段）。留空則使用本機內建範例資料。
          </div>
          <input className="inp" value={sheetId} placeholder="1AbCDeFGhijKLmnoPQRstuVWxyz..." onChange={e=>setSheetIdField(e.target.value)} />
        </div>
        <div style={{borderTop:'1px solid var(--line)',paddingTop:16,marginTop:16}}>
          <div style={{fontWeight:700,fontSize:12.5,marginBottom:4}}>👤 Google 登入帳號</div>
          <div className="faint" style={{fontSize:10.5,marginBottom:8,lineHeight:1.6}}>
            瀏覽器同時登入多個 Google 帳號時，填這裡可以跳過「選擇帳號」畫面，直接用指定帳號連線。留空預設用 eae55556@gmail.com。
          </div>
          <input className="inp" value={hint} placeholder="eae55556@gmail.com" onChange={e=>setHint(e.target.value)} />
        </div>
      </div>
      <div className="modalfoot">
        <button className="btn" onClick={onClose}>取消</button>
        <button className="btn primary" onClick={save}>儲存設定</button>
      </div>
    </Modal>
  );
}

Object.assign(window, {
  callGemini, callGeminiJSON,
  parseEmailWithAI, analyzeRiskWithAI, generateQuoteWithAI, parseCommReplyWithAI,
  isGoogleConnected, getGoogleClientId, getGoogleAccessToken, requestGoogleToken,
  pushCalendarEvents, createDriveFolder,
  AIBtn, AISettingsModal,
});
