(function() {
  var projectNameInput = document.getElementById('project_name');
  var nameValidTimeout = null;
  if (!projectNameInput) return;

  function setProjectNameBorder(valid) {
    projectNameInput.classList.remove('border', 'border-success', 'border-danger');
    projectNameInput.classList.add('border');
    if (valid === true) {
      projectNameInput.classList.add('border-success');
    } else if (valid === false) {
      projectNameInput.classList.add('border-danger');
    } else {
      projectNameInput.classList.remove('border');
    }
  }

  function checkProjectName() {
    var name = (projectNameInput.value || '').trim();
    if (!name) {
      setProjectNameBorder(null);
      return;
    }
    var url = '/projectnamevalid?name=' + encodeURIComponent(name);
    fetch(url, { credentials: 'same-origin' })
      .then(function(res) {
        setProjectNameBorder(res.ok);
      })
      .catch(function() {
        setProjectNameBorder(null);
      });
  }

  projectNameInput.addEventListener('blur', function() {
    checkProjectName();
  });
  projectNameInput.addEventListener('input', function() {
    clearTimeout(nameValidTimeout);
    var name = (projectNameInput.value || '').trim();
    if (!name) {
      setProjectNameBorder(null);
      return;
    }
    nameValidTimeout = setTimeout(checkProjectName, 400);
  });
})();

(function() {
  var sourceRadios = Array.prototype.slice.call(document.querySelectorAll('input[name="project_source_type"]'));
  var emptyTab = document.getElementById('tab-empty-repo');
  var zipTab = document.getElementById('tab-upload-zip');
  var remoteInput = document.getElementById('pull_from_remote');
  var zipInput = document.getElementById('repo_zip');
  if (!emptyTab || !zipTab || !remoteInput || !zipInput) return;

  function getSelectedSource() {
    for (var i = 0; i < sourceRadios.length; i++) {
      if (sourceRadios[i].checked) {
        return sourceRadios[i].value;
      }
    }
    return 'empty';
  }

  function updateSourceTabs() {
    var selected = getSelectedSource();
    var isZip = selected === 'zip';
    emptyTab.classList.toggle('d-none', isZip);
    zipTab.classList.toggle('d-none', !isZip);
    if (isZip) {
      remoteInput.value = '';
    } else {
      zipInput.value = '';
      zipInput.dispatchEvent(new Event('change'));
    }
  }

  sourceRadios.forEach(function(radio) {
    radio.addEventListener('change', updateSourceTabs);
  });
  updateSourceTabs();
})();

(function() {
  var dropzone = document.getElementById('dropzone');
  var input = document.getElementById('repo_zip');
  if (!dropzone || !input) return;
  var placeholder = dropzone.querySelector('[data-dropzone-placeholder]');
  var filenameEl = dropzone.querySelector('[data-dropzone-filename]');
  if (!placeholder || !filenameEl) return;

  function showFile(name) {
    if (name) {
      placeholder.classList.add('d-none');
      filenameEl.classList.remove('d-none');
      filenameEl.textContent = 'Selected: ' + name;
    } else {
      placeholder.classList.remove('d-none');
      filenameEl.classList.add('d-none');
      filenameEl.textContent = '';
    }
  }

  dropzone.addEventListener('click', function() { input.click(); });
  dropzone.addEventListener('dragover', function(e) { e.preventDefault(); dropzone.classList.add('border-primary'); });
  dropzone.addEventListener('dragleave', function() { dropzone.classList.remove('border-primary'); });
  dropzone.addEventListener('drop', function(e) {
    e.preventDefault();
    dropzone.classList.remove('border-primary');
    var files = e.dataTransfer.files;
    if (files.length && files[0].name.toLowerCase().endsWith('.zip')) {
      input.files = files;
      showFile(files[0].name);
    }
  });
  input.addEventListener('change', function() {
    showFile(input.files.length ? input.files[0].name : null);
  });
})();