// content_evalign.js
// https://www.evalign.fun/ に注入され、
// background.js から受け取ったCSVをファイル入力欄へ自動セットする。

(async () => {
  // 多重実行ガード
  if (window.__evalignAutoUploadInstalled) return;
  window.__evalignAutoUploadInstalled = true;

  // ページが完全に描画されるまで少し待つ
  await waitForDocumentReady();
  await sleep(500);

  // backgroundにCSVファイル取得を依頼
  let res;
  try {
    res = await chrome.runtime.sendMessage({ type: 'EVALIGN_READY' });
  } catch (e) {
    console.warn('[evalign] background応答取得に失敗:', e);
    return;
  }

  if (!res || !res.csvFile) {
    // この拡張経由でない通常アクセス時は何もしない
    console.log('[evalign] CSVデータが保存されていないため、自動セットはスキップします');
    return;
  }

  try {
    // input[type=file] を探す（複数フォールバック）
    const fileInput = await waitForFileInput(15000);
    if (!fileInput) {
      const errMsg = 'ファイルアップロード欄が見つかりませんでした。手動でアップロードしてください。';
      alert(errMsg);
      chrome.runtime.sendMessage({ type: 'EVALIGN_ERROR', error: errMsg });
      return;
    }

    // Fileオブジェクトを生成
    const file = base64ToFile(res.csvFile.base64, res.csvFile.name, res.csvFile.type);

    // DataTransfer でinputへセット
    const dt = new DataTransfer();
    dt.items.add(file);
    fileInput.files = dt.files;

    // changeイベント発火（React等のフレームワーク対応）
    fileInput.dispatchEvent(new Event('input', { bubbles: true }));
    fileInput.dispatchEvent(new Event('change', { bubbles: true }));

    console.log('[evalign] ファイル自動セット完了:', file.name);

    // 自動アップロードボタンを押す（存在する場合のみ）
    await sleep(800);
    tryClickUploadButton();

    chrome.runtime.sendMessage({ type: 'EVALIGN_DONE' });
  } catch (e) {
    console.error('[evalign] 自動セット失敗:', e);
    chrome.runtime.sendMessage({ type: 'EVALIGN_ERROR', error: e.message });
    alert('evalign.fun への自動セットに失敗: ' + e.message);
  }

  // ---------------- ヘルパー ----------------

  function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }

  function waitForDocumentReady() {
    return new Promise(resolve => {
      if (document.readyState === 'complete') return resolve();
      window.addEventListener('load', () => resolve(), { once: true });
    });
  }

  // input[type=file] を見つかるまで待機
  async function waitForFileInput(timeout = 10000) {
    const selectors = [
      'input[type="file"][accept*="csv"]',
      'input[type="file"][accept*=".csv"]',
      'input[type="file"]'
    ];
    const start = Date.now();
    while (Date.now() - start < timeout) {
      for (const sel of selectors) {
        const el = document.querySelector(sel);
        if (el) return el;
      }
      await sleep(300);
    }
    return null;
  }

  // Base64文字列からFileオブジェクトを生成
  function base64ToFile(base64, filename, mime) {
    const binary = atob(base64);
    const len = binary.length;
    const bytes = new Uint8Array(len);
    for (let i = 0; i < len; i++) bytes[i] = binary.charCodeAt(i);
    return new File([bytes], filename, { type: mime || 'text/csv' });
  }

  // アップロード/送信ボタンらしきものをクリック
  function tryClickUploadButton() {
    const candidates = Array.from(document.querySelectorAll('button, input[type="submit"], a.btn'));
    const labels = ['アップロード', 'Upload', '送信', 'Submit', '解析', '読み込み', '取り込み'];
    for (const btn of candidates) {
      const t = (btn.textContent || btn.value || '').trim();
      if (labels.some(l => t.includes(l))) {
        // 「ファイルを選択」系ボタンは除外
        if (t.includes('選択') || t.toLowerCase().includes('choose')) continue;
        btn.click();
        console.log('[evalign] アップロードボタンをクリック:', t);
        return true;
      }
    }
    return false;
  }
})();
