import { getBoardContext, showBoardError } from "./board-context.js";
import { attachBoardRefAutocomplete, setMarkdownElement } from "./board-markdown.js";

var boardAuth = { auth_enabled: false, username: null };

export function loadBoardAuthStatus() {
  return fetch('/auth/status', { credentials: 'same-origin' })
    .then(function(res) { return res.ok ? res.json() : null; })
    .then(function(s) {
      if (!s) return;
      boardAuth.auth_enabled = !!s.auth_enabled;
      boardAuth.username = s.username || null;
    })
    .catch(function() {});
}

function canAddComment() {
  return !boardAuth.auth_enabled || !!boardAuth.username;
}

export function commentCountLabel(n) {
  return n + ' comment' + (n !== 1 ? 's' : '');
}

export function updateCardCommentCount(card, count) {
  var n = count || 0;
  var meta = card.querySelector('.board-card-meta');
  if (meta) {
    var commentsSpan = meta.querySelector('.board-card-comments-count-meta') || meta.querySelector('.ms-auto');
    if (commentsSpan) commentsSpan.textContent = commentCountLabel(n);
  }
}

function commentAuthorInitials(author) {
  var parts = (author || '').trim().split(/\s+/).filter(Boolean);
  if (!parts.length) return '?';
  if (parts.length === 1) return parts[0].charAt(0).toUpperCase();
  return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();
}

function commentAvatarHtml(comment) {
  var wrap = document.createElement('span');
  wrap.className = 'board-card-comment-avatar';
  if (comment.gravatar_url) {
    var img = document.createElement('img');
    img.src = comment.gravatar_url;
    img.alt = '';
    img.width = 32;
    img.height = 32;
    img.onerror = function() {
      wrap.replaceChildren();
      var fb = document.createElement('span');
      fb.className = 'board-card-comment-avatar-fallback';
      fb.textContent = commentAuthorInitials(comment.author);
      wrap.appendChild(fb);
    };
    wrap.appendChild(img);
  } else {
    var fb = document.createElement('span');
    fb.className = 'board-card-comment-avatar-fallback';
    fb.textContent = commentAuthorInitials(comment.author);
    wrap.appendChild(fb);
  }
  return wrap;
}

function renderCommentsList(card, comments) {
  var list = card.querySelector('.board-card-comments-list');
  if (!list) return;
  list.innerHTML = '';
  if (!Array.isArray(comments) || !comments.length) return;
  comments.forEach(function(comment) {
    var row = document.createElement('div');
    row.className = 'board-card-comment-item';
    row.appendChild(commentAvatarHtml(comment));
    var body = document.createElement('div');
    body.className = 'board-card-comment-body';
    var authorEl = document.createElement('div');
    authorEl.className = 'board-card-comment-author';
    authorEl.textContent = comment.author || 'Unknown';
    var contentEl = document.createElement('div');
    contentEl.className = 'board-card-comment-content';
    setMarkdownElement(contentEl, comment.content || '');
    body.appendChild(authorEl);
    body.appendChild(contentEl);
    row.appendChild(body);
    list.appendChild(row);
  });
}

function syncCommentFormVisibility(card) {
  var form = card.querySelector('.board-card-comment-form');
  var hint = card.querySelector('.board-card-comment-signin-hint');
  if (!form || !hint) return;
  if (canAddComment()) {
    form.classList.remove('d-none');
    hint.classList.add('d-none');
  } else {
    form.classList.add('d-none');
    hint.classList.remove('d-none');
  }
}

export function loadCommentsForCard(card) {
  var taskRef = card.dataset.taskRef;
  if (!taskRef) return Promise.resolve();
  var ctx = getBoardContext();
  if (!ctx.project) return Promise.resolve();
  var listUrl = '/comments/list?' + new URLSearchParams({
    project: ctx.project,
    board: ctx.board,
    task: taskRef
  }).toString();
  return fetch(listUrl, { credentials: 'same-origin' })
    .then(function(res) { return res.ok ? res.json() : []; })
    .then(function(comments) {
      if (!Array.isArray(comments)) comments = [];
      renderCommentsList(card, comments);
      updateCardCommentCount(card, comments.length);
      return comments;
    })
    .catch(function() { return []; });
}

export function setupCommentForm(popoutCard) {
  var form = popoutCard.querySelector('.board-card-comment-form');
  if (!form || form.dataset.bound === '1') return;
  form.dataset.bound = '1';
  syncCommentFormVisibility(popoutCard);
  var commentInput = form.querySelector('.board-card-comment-input');
  attachBoardRefAutocomplete(commentInput);
  form.addEventListener('submit', function(e) {
    e.preventDefault();
    if (!canAddComment()) return;
    var taskRef = popoutCard.dataset.taskRef;
    if (!taskRef) return;
    var input = form.querySelector('.board-card-comment-input');
    var content = (input && input.value) ? input.value.trim() : '';
    if (!content) return;
    var ctx = getBoardContext();
    if (!ctx.project) return;
    var createUrl = '/comments/create?' + new URLSearchParams({
      project: ctx.project,
      board: ctx.board,
      task: taskRef,
      content: content
    }).toString();
    fetch(createUrl, { method: 'POST', credentials: 'same-origin' })
      .then(function(res) {
        if (!res.ok) {
          var msg = (res.status === 401 || res.status === 403)
            ? 'Not authorized to add comments (sign in again if needed).'
            : 'Could not post comment.';
          showBoardError(msg);
          return null;
        }
        if (input) input.value = '';
        return loadCommentsForCard(popoutCard);
      })
      .catch(function() {
        showBoardError('Could not post comment.');
      });
  });
}