// content_moodle.js - 完全版
// 課題画面 / 提出画面のどちらからでも動作する。
// 提出画面でない場合は URL遷移を background に依頼する。

(() => {
  if (window.__moodleAutoDLInstalled) return;
  window.__moodleAutoDLInstalled = true;

  chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
    if (msg.type === 'MOODLE_DOWNLOAD') {
      runMoodleFlow()
        .then(result => sendResponse({ ok: true, result }))
        .catch(err => sendResponse({ ok: false, error: err.message }));
      return true;
    }
  });

  const sleep = (ms) => new Promise(r => setTimeout(r, ms));

  function isVisible(el) {
    if (!el) return false;
    const rect = el.getBoundingClientRect();
    return rect.width > 0 && rect.height > 0;
  }

  // ===== 提出ビューにいるかチェック =====
  function isOnSubmissionView() {
    // URLに action=grading があれば提出ビュー
    if (/[?&]action=grading/.test(location.href)) return true;

    // DOM上に「操作」ボタンや評定テーブルがあるかでも判定
    const buttons = document.querySelectorAll('button, a.btn');
    for (const b of buttons) {
      const t = (b.textContent || '').trim();
      if (t === '操作' || t.startsWith('操作')) return true;
    }
    return false;
  }

  // ===== 「評定ワークシートをダウンロードする」を選択 =====
  async function clickDownloadGradingWorksheet() {
    const targetTexts = [
      '評定ワークシートをダウンロードする',
      '評定ワークシートのダウンロード',
      'Download grading worksheet'
    ];

    // 方法A: 既にDOM上に項目がある
    let item = findItemAnchor(targetTexts);
    if (item) {
      console.log('[content_moodle] 項目を直接発見、クリックします');
      item.click();
      return true;
    }

    // 方法B: 「操作」ボタンをクリックしてメニュー展開
    const actionBtn = findActionButton();
    if (actionBtn) {
      console.log('[content_moodle] 操作ボタンをクリック');
      actionBtn.click();
      await sleep(500);

      item = await waitForItemAnchor(targetTexts, 4000);
      if (item) {
        console.log('[content_moodle] 展開後の項目をクリック');
        item.click();
        return true;
      }
    }

    // 方法C: <select name="operation"> 形式（旧UI）
    const selectEl = document.querySelector('select[name="operation"], select#id_operation');
    if (selectEl) {
      const opts = Array.from(selectEl.options || []);
      const target = opts.find(o => targetTexts.some(t => (o.textContent || '').trim().includes(t)));
      if (target) {
        selectEl.value = target.value;
        selectEl.dispatchEvent(new Event('change', { bubbles: true }));
        await sleep(500);
        return true;
      }
    }

    // 方法D: URL直接遷移（最終手段）
    console.log('[content_moodle] URL直接遷移にフォールバック');
    const u = new URL(location.href);
    const id = u.searchParams.get('id');
    if (id) {
      const dlUrl = `${u.origin}${u.pathname}?id=${id}&plugin=offline&pluginsubtype=assignfeedback&action=viewpluginpage&pluginaction=downloadgrades`;
      location.href = dlUrl;
      return true;
    }

    throw new Error('ダウンロード項目が見つかりませんでした');
  }

  function findItemAnchor(texts) {
    const candidates = document.querySelectorAll('a, button, [role="menuitem"]');
    for (const el of candidates) {
      const t = (el.textContent || '').trim();
      if (texts.some(target => t === target || t.includes(target))) {
        return el;
      }
    }
    return null;
  }

  async function waitForItemAnchor(texts, timeout) {
    const start = Date.now();
    while (Date.now() - start < timeout) {
      const el = findItemAnchor(texts);
      if (el && isVisible(el)) return el;
      await sleep(200);
    }
    return null;
  }

  function findActionButton() {
    const buttons = document.querySelectorAll('button, a.btn, [role="button"]');
    for (const btn of buttons) {
      const t = (btn.textContent || '').trim();
      if (
        t === '操作' || t.startsWith('操作') ||
        t === 'Choose' || t.includes('Choose...') ||
        t === 'アクション' || t === 'Action'
      ) {
        return btn;
      }
    }
    const labeled = document.querySelector(
      '[aria-label="操作"], [title="操作"], [aria-label="Choose"], [aria-label*="Action"]'
    );
    if (labeled) return labeled;
    return null;
  }

  // ===== メイン =====
  async function runMoodleFlow() {
    // 提出ビューでなければ、background にURL遷移を依頼して終了する
    // （遷移後に background が改めて content script を注入する）
    if (!isOnSubmissionView()) {
      console.log('[content_moodle] 提出ビューでないため遷移を要求');
      const u = new URL(location.href);
      const id = u.searchParams.get('id');
      if (!id) throw new Error('課題IDが取得できません');
      const gradingUrl = `${u.origin}${u.pathname}?id=${id}&action=grading`;
      // backgroundへ遷移依頼
      chrome.runtime.sendMessage({ type: 'NAVIGATE_TO_GRADING', url: gradingUrl });
      return 'navigating';
    }

    // 既に提出ビューならダウンロード処理を実行
    await sleep(300);
    await clickDownloadGradingWorksheet();
    console.log('[content_moodle] ダウンロード操作を実行しました');
    return 'downloading';
  }
})();
