import { findBoardCardByTaskRef, getBoardContext, refreshBoardRefManifest } from "./board-context.js";
import { loadBoardAuthStatus } from "./board-comments.js";
import { assignCloudIconToAllCards, bindAddCardButtons, loadTasksForBoard, preloadIcons } from "./board-cards.js";
import { showCardPopout } from "./board-popout.js";
import { bindBoardInteractions } from "./board-dnd.js";

var lastLoadedBoards = [];

function boardViewUrl(project, boardName) {
  var path = '/project/' + project + '/board/';
  var params = new URLSearchParams();
  if (boardName && boardName !== 'Tasks') params.set('b', boardName);
  var qs = params.toString();
  return qs ? path + '?' + qs : path;
}

function initBoardSelector() {
  var select = document.getElementById('board-board-select');
  if (!select) return;
  var ctx = getBoardContext();
  if (!ctx.project) return;

  fetch('/board/list?' + new URLSearchParams({ project: ctx.project }).toString())
    .then(function (res) { return res.ok ? res.json() : null; })
    .then(function (boards) {
      if (!Array.isArray(boards) || !boards.length) return;
      lastLoadedBoards = boards;
      var names = boards.map(function (b) { return b.name; });
      select.innerHTML = '';
      boards.forEach(function (b) {
        var opt = document.createElement('option');
        opt.value = b.name;
        var label = b.name;
        if (typeof b.task_count === 'number') label += ' (' + b.task_count + ')';
        opt.textContent = label;
        if (b.name === ctx.board) opt.selected = true;
        select.appendChild(opt);
      });
      if (names.indexOf(ctx.board) < 0) {
        var current = document.createElement('option');
        current.value = ctx.board;
        current.textContent = ctx.board;
        current.selected = true;
        select.insertBefore(current, select.firstChild);
      }
    })
    .catch(function () {});

  select.addEventListener('change', function () {
    var nextBoard = select.value;
    if (!nextBoard || nextBoard === ctx.board) return;
    location.assign(boardViewUrl(ctx.project, nextBoard));
  });
}

function openTaskFromQueryString() {
  var taskRef = (new URLSearchParams(location.search)).get("task");
  if (!taskRef) return;
  window.setTimeout(function () {
    var card = findBoardCardByTaskRef(taskRef);
    if (card && !card.classList.contains("board-card-popout")) {
      showCardPopout(card);
    }
  }, 0);
}

function suggestSprintName() {
  var max = 0;
  lastLoadedBoards.forEach(function(b) {
    var m = /^Sprint-(\d+)$/.exec(b.name || '');
    if (m) {
      var n = parseInt(m[1], 10);
      if (n > max) max = n;
    }
  });
  return 'Sprint-' + (max + 1);
}

function showBoardNewForm(prefill) {
  var form = document.getElementById('board-new-form');
  var input = document.getElementById('board-new-name');
  var err = document.getElementById('board-new-error');
  if (!form || !input) return;
  form.classList.remove('d-none');
  if (err) err.classList.add('d-none');
  input.value = prefill || '';
  input.focus();
  input.select();
}

function bindNewBoardForm() {
  var newBoardBtn = document.getElementById('board-new-board-btn');
  if (newBoardBtn) newBoardBtn.addEventListener('click', function() { showBoardNewForm(''); });

  var newSprintBtn = document.getElementById('board-new-sprint-btn');
  if (newSprintBtn) newSprintBtn.addEventListener('click', function() { showBoardNewForm(suggestSprintName()); });

  var newBoardCancel = document.getElementById('board-new-cancel');
  if (newBoardCancel) newBoardCancel.addEventListener('click', function() {
    var form = document.getElementById('board-new-form');
    if (form) form.classList.add('d-none');
  });

  var newBoardForm = document.getElementById('board-new-form');
  if (newBoardForm) {
    newBoardForm.addEventListener('submit', function(e) {
      e.preventDefault();
      var ctx = getBoardContext();
      var input = document.getElementById('board-new-name');
      var err = document.getElementById('board-new-error');
      var name = (input && input.value) ? input.value.trim().replace(/\s+/g, '-') : '';
      if (!ctx.project || !name) return;
      fetch('/board/create?' + new URLSearchParams({ project: ctx.project, name: name }).toString(), {
        method: 'POST',
        credentials: 'same-origin'
      }).then(function(res) {
        if (res.ok) {
          location.assign(boardViewUrl(ctx.project, name));
          return null;
        }
        return res.json().catch(function() { return {}; });
      }).then(function(body) {
        if (!body) return;
        if (err) {
          err.textContent = (body && body.detail) || 'Could not create board.';
          err.classList.remove('d-none');
        }
      }).catch(function() {
        if (err) {
          err.textContent = 'Could not create board.';
          err.classList.remove('d-none');
        }
      });
    });
  }
}

function initBoard() {
  preloadIcons();
  bindAddCardButtons();
  bindBoardInteractions();
  loadBoardAuthStatus();
  bindNewBoardForm();
  initBoardSelector();
  assignCloudIconToAllCards();
  refreshBoardRefManifest().then(function () {
    return loadTasksForBoard();
  }).then(function () {
    openTaskFromQueryString();
  });
}

if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', initBoard);
} else {
  initBoard();
}