import {
  findBoardCardByTaskRef,
  getBoardContext,
  showBoardError,
  updateColumnBadge,
} from "./board-context.js";
import { fetchBoardTasksJson, reorderBoardDomToTaskList } from "./board-cards.js";
import { showCardPopout } from "./board-popout.js";

var draggedCard = null;
var didDrag = false;

function boardRoot() {
  return document.querySelector('.board-columns');
}

function clearColumnDropHighlight() {
  document.querySelectorAll('.board-column.dropzone.border-primary').forEach(function(el) {
    el.classList.remove('border-primary');
  });
}

function dragTransferLooksLikeTask(e) {
  if (draggedCard) return true;
  var types = e.dataTransfer && e.dataTransfer.types;
  if (!types || !types.length) return false;
  for (var i = 0; i < types.length; i++) {
    if (types[i] === 'text/plain' || types[i] === 'Text') return true;
  }
  return false;
}

function handleDragStart(e) {
  var card = e.target.closest && e.target.closest('.board-card');
  if (!card) return;
  didDrag = true;
  draggedCard = card;
  e.dataTransfer.effectAllowed = 'move';
  try {
    e.dataTransfer.setData('text/plain', card.dataset.taskRef || '');
  } catch (err) {
    /* ignore setData failures in restricted environments */
  }
  card.classList.add('opacity-50');
}

function handleDragEnd(e) {
  var card = (draggedCard && draggedCard.classList.contains('opacity-50') ? draggedCard : null) ||
    (e.target.closest && e.target.closest('.board-card'));
  if (card) card.classList.remove('opacity-50');
  clearColumnDropHighlight();
  window.setTimeout(function() {
    draggedCard = null;
    didDrag = false;
  }, 0);
}

function handleCardClick(e) {
  if (didDrag) return;
  var card = e.target.closest && e.target.closest('.board-card');
  if (!card || card.classList.contains('board-card-popout')) return;
  e.preventDefault();
  showCardPopout(card);
}

function handleBoardDragOver(e) {
  var root = boardRoot();
  if (!root || !root.contains(e.target)) return;
  var col = e.target.closest && e.target.closest('.board-column.dropzone');
  if (!col || !dragTransferLooksLikeTask(e)) return;
  e.preventDefault();
  e.dataTransfer.dropEffect = 'move';
  clearColumnDropHighlight();
  col.classList.add('border-primary');
}

function pushTaskStatusUpdate(card, newStatus) {
  var taskRef = card && card.dataset.taskRef;
  if (!taskRef) return Promise.resolve({ ok: false, status: 0 });
  var ctx = getBoardContext();
  if (!ctx.project) return Promise.resolve({ ok: false, status: 0 });
  return fetch('/tasks/update?' + new URLSearchParams({ project: ctx.project, board: ctx.board, task: taskRef }).toString(), {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ status: newStatus || 'TODO' })
  }).then(function(res) {
    return { ok: res.ok, status: res.status };
  }).catch(function() {
    return { ok: false, status: 0 };
  });
}

function handleBoardDrop(e) {
  var root = boardRoot();
  var col = e.target.closest && e.target.closest('.board-column.dropzone');
  if (!col || !root || !root.contains(e.target)) return;
  e.preventDefault();
  e.stopPropagation();
  clearColumnDropHighlight();
  var taskRef = '';
  try {
    taskRef = e.dataTransfer.getData('text/plain') || '';
  } catch (err2) {
    taskRef = '';
  }
  var card = draggedCard || findBoardCardByTaskRef(taskRef);
  if (!card) return;
  var targetColumn = col;
  var targetCards = targetColumn.querySelector('.board-column-cards');
  if (!targetCards) return;
  var sourceColumn = card.closest && card.closest('.board-column');
  if (sourceColumn === targetColumn) return;
  var newStatus = targetColumn.dataset.status || 'TODO';
  var prevStatus = card.dataset.taskStatus || 'TODO';
  var sourceCards = sourceColumn && sourceColumn.querySelector('.board-column-cards');
  var nextSibling = card.nextSibling;
  card.dataset.taskStatus = newStatus;
  targetCards.appendChild(card);
  updateColumnBadge(sourceColumn);
  updateColumnBadge(targetColumn);
  pushTaskStatusUpdate(card, newStatus).then(function(result) {
    if (result.ok) {
      fetchBoardTasksJson().then(function(tasks) {
        if (tasks) reorderBoardDomToTaskList(tasks);
      });
      return;
    }
    card.dataset.taskStatus = prevStatus;
    if (sourceCards) {
      if (nextSibling && nextSibling.parentNode === sourceCards) {
        sourceCards.insertBefore(card, nextSibling);
      } else {
        sourceCards.appendChild(card);
      }
    }
    updateColumnBadge(sourceColumn);
    updateColumnBadge(targetColumn);
    var st = result.status;
    var msg = (st === 401 || st === 403)
      ? 'Not authorized to update tasks (sign in again if needed). The card was moved back.'
      : 'Could not save the task move. The card was moved back.';
    showBoardError(msg);
  });
}

export function bindBoardInteractions() {
  var root = boardRoot();
  if (!root) return;
  root.addEventListener('dragstart', handleDragStart);
  root.addEventListener('dragend', handleDragEnd);
  root.addEventListener('click', handleCardClick);
  root.addEventListener('dragover', handleBoardDragOver, true);
  root.addEventListener('drop', handleBoardDrop, true);
}