const weapons = {
  rifle: {
    name: 'Rifle',
    damage: '4L',
    shortRange: '1-27',
    longRange: '28-75'
  },
  smg: {
    name: 'SMG',
    damage: '3L',
    shortRange: '1-15',
    longRange: '16-25'
  },
  blazer: {
    name: 'Blazer',
    damage: '4L',
    shortRange: '1-17',
    longRange: '18-105'
  }
}

function createIcon(number) {
  const [icon, use, text] = ['svg', 'use', 'text'].map(t => document.createElementNS(svgns, t));

  icon.setAttributeNS(null, 'viewBox', '-6 -6 12 12');
  icon.setAttribute('xmlns', svgns);

  use.setAttributeNS(null, 'href', `assets/images/counters.svg#counter-base`);

  text.textContent = number;

  icon.appendChild(use);
  icon.appendChild(text);

  return icon;
}

function createWeaponIcon(type) {
  const [icon, use] = ['svg', 'use'].map(t => document.createElementNS(svgns, t));

  icon.setAttributeNS(null, 'viewBox', '-6 -6 12 12');
  icon.setAttribute('xmlns', svgns);
  icon.classList.add('weapon-icon');

  use.setAttributeNS(null, 'href', `assets/images/counters.svg#${type}`);

  icon.appendChild(use);

  return icon;
}

function createRecord(unit) {
  const { dataset: { allegiance, number, squad }} = unit,
    primaryWeapon = unit.querySelector('.primary-weapon'),
    pw = primaryWeapon?.getAttribute('href').replace('#', '') || 'rifle',
    div = document.createElement('div', { is: 'soldier-record-block' }),
    spans = Array(6).fill('span').map(t => document.createElement(t)),
    [tn, sn, pwt, pwd, pwrs, pwrl] = spans;

  div.setAttribute('class', 'soldier-record');
  div.dataset.number = number;
  div.dataset.allegiance = allegiance;

  tn.setAttribute('slot', 'troop-number');
  tn.appendChild(createIcon(number));

  sn.setAttribute('slot', 'squad-number');
  sn.appendChild(createIcon(squad || 1));

  pwt.setAttribute('slot', 'primary-weapon-type');
  pwt.textContent = ' ' + weapons[pw].name;
  pwt.prepend(createWeaponIcon(pw));

  pwd.setAttribute('slot', 'primary-weapon-damage');
  pwd.textContent = weapons[pw].damage;

  pwrs.setAttribute('slot', 'primary-weapon-range-short');
  pwrs.textContent = weapons[pw].shortRange;

  pwrl.setAttribute('slot', 'primary-weapon-range-long');
  pwrl.textContent = weapons[pw].longRange;

  spans.forEach(el => div.appendChild(el));

  return div;
}

function createRecords(units) {
  const grouped = Array.from(units).reduce((acc, unit) => {
    acc[unit.dataset.allegiance]?.push(unit) || (acc[unit.dataset.allegiance] = [unit]);
    return acc;
  }, {});

  for (const al in grouped) {
    grouped[al] = grouped[al].map(createRecord);
  }

  return grouped;
}

function addEventListeners(unSelectCounter, selectCounter) {
  document.querySelectorAll('.soldier-record').forEach(el =>
    el.addEventListener('click', () => {
      if (el.classList.contains('selected')) {
        el.classList.remove('selected');
        unSelectCounter();
        unSelect();
      } else {
        selectCounter(el);
      }
    })
  );
}

export function clear() {
  document.querySelectorAll('#record-sheet .soldier-record').forEach(el => el.remove());
  document.querySelector('#attacker-record .name').textContent = 'attacker';
  document.querySelector('#defender-record .name').textContent = 'defender';
}

export function unSelect() {
  const selected = getSelected();

  if (selected) {
    selected.classList.remove('selected');
  }

  document.getElementById('toggle-prone-counter').checked = false;
}

export function getSelected() {
  return document.querySelector('.soldier-record.selected');
}

export function select(data) {
  unSelect();

  if (!data) {
    return;
  }

  const { allegiance: al, number: n } = data,
    selector = `.soldier-record[data-number="${n}"][data-allegiance="${al}"]`;

  document.querySelector(selector).classList.add('selected');
  document.querySelector('#toggle-prone-counter').checked = data.prone;
}

export function endMove() {
  const selected = getSelected();

  if (selected) {
    selected.classList.toggle('movement-ended');
  }

  unSelect();
}

export function start(startLoc, units, gbUnSelect, gbSelect) {
  clear();
  const forces = createRecords(units);

  for (const affiliation in forces) {
    const container = document.querySelector(`#${affiliation}-record`);
    const records = container.querySelector('.records');
    const name = startLoc.dataset[`${affiliation}Name`];

    if (name) {
      container.querySelector('.name').textContent = name;
    }
    forces[affiliation].forEach(r => records.appendChild(r));
  }

  addEventListeners(gbUnSelect, gbSelect);
}
