
(function(){
  function qs(sel, root){ return (root || document).querySelector(sel); }
  function qsa(sel, root){ return Array.prototype.slice.call((root || document).querySelectorAll(sel)); }
  function normalizeModo(val){
    val = String(val || '').toUpperCase();
    if(val.indexOf('FIJO') >= 0) return 'FIJO';
    if(val.indexOf('TASA') >= 0 || val.indexOf('POR PORCENTAJE') >= 0) return 'TASA';
    if(val.indexOf('CANTIDAD') >= 0) return 'CANTIDAD';
    return val || 'FIJO';
  }
  function normalizeTipo(val){
    val = String(val || '').toUpperCase();
    if(val.indexOf('ASIG') >= 0 || val.indexOf('ASIGN') >= 0) return 'ASIG';
    if(val.indexOf('DED') >= 0 || val.indexOf('DEDU') >= 0) return 'DED';
    if(val.indexOf('PATR') >= 0) return 'PATR';
    if(val.indexOf('PROV') >= 0) return 'PROV';
    return val || 'ASIG';
  }
  var body = document.body || {};
  var page = body.getAttribute && body.getAttribute('data-nomina-page');

  function setText(el, text){ if(el) el.textContent = text; }

  function initConceptos(){
    var form = qs('form');
    if(!form) return;
    var grid = qs('.grid', form);
    if (grid && !qs('.ux-panel', form)) {
      var split = document.createElement('div');
      split.className = 'ux-split';
      var left = document.createElement('div');
      var right = document.createElement('aside');
      right.className = 'ux-panel';
      right.innerHTML = '' +
        '<h3>Ejemplo automático del concepto</h3>' +
        '<div class="ux-note" id="concept-mode-note">Selecciona el tipo y la forma de cálculo para ver una explicación más clara.</div>' +
        '<div class="ux-preview-box" id="concept-preview-box"></div>';
      grid.parentNode.insertBefore(split, grid);
      left.appendChild(grid);
      var actions = grid.nextElementSibling;
      if(actions){ left.appendChild(actions); }
      split.appendChild(left);
      split.appendChild(right);
    }

    var codigo = qs('#codigo');
    var tipo = qs('#tipo');
    var modo = qs('#modo_calculo');
    var tasa = qs('#tasa');
    var modoHint = qs('#modoHint');
    var preview = qs('#concept-preview-box');
    var note = qs('#concept-mode-note');
    var nombre = qs('#nombre');
    if(!modo || !tasa) return;

    function prefixForTipo(val){
      if(val === 'ASIG') return 'A-';
      if(val === 'DED') return 'B-';
      if(val === 'PATR') return 'P-';
      if(val === 'PROV') return 'R-';
      return '';
    }

    function updateConcept(){
      var mode = normalizeModo(modo.value || 'FIJO');
      var type = normalizeTipo(tipo ? tipo.value : 'ASIG');
      var name = nombre && nombre.value ? nombre.value : 'Concepto actual';
      var rate = (tasa.value || '').trim();
      var rateNum = parseFloat(String(rate).replace(',', '.'));
      var modeMap = {
        'FIJO': {
          hint: 'Usa un monto exacto por período. Ejemplo: préstamo Bs 500 o pago manual de vacaciones.',
          note: 'Este concepto aplica un mismo monto cuando el sistema o RRHH lo capture.',
          calc: 'Monto fijo por período',
          example: 'Ejemplo: Bs 500 exactos en la quincena.'
        },
        'TASA': {
          hint: 'Usa un porcentaje en decimal. Ejemplo: 0.04 = 4%, 0.025 = 2.5%.',
          note: 'Úsalo cuando el cálculo sea un porcentaje sobre una base, por ejemplo salario base o base de cotización.',
          calc: 'Porcentaje sobre base',
          example: 'Ejemplo: base Bs 10.000 × 0.04 = Bs 400.'
        },
        'CANTIDAD': {
          hint: 'Multiplica una cantidad por un valor base. Ejemplo: 2 horas extra × valor hora.',
          note: 'Úsalo para días laborados, horas extra, ausencias o cantidades similares.',
          calc: 'Cantidad × valor',
          example: 'Ejemplo: 2 horas × Bs 150 = Bs 300.'
        },
      };
      var typeMap = {
        'ASIG': 'Asignación',
        'DED': 'Deducción',
        'PATR': 'Patronal',
        'PROV': 'Provisión'
      };
      var current = modeMap[mode] || modeMap.FIJO;
      if(modoHint) modoHint.textContent = current.hint;
      if(note) note.textContent = current.note;
      var disableRate = mode !== 'TASA';
      tasa.disabled = disableRate;
      tasa.classList.toggle('ux-disabled', disableRate);
      if(disableRate){
        tasa.setAttribute('placeholder', 'No aplica');
      } else {
        tasa.setAttribute('placeholder', 'Ej: 0.04 = 4%');
      }
      var warning = '';
      if(mode === 'TASA' && rate !== '' && !isNaN(rateNum) && rateNum > 1){
        warning = '<div class="ux-field-help" style="color:#b45309;">Parece que escribiste <b>'+ rate +'</b>. Para 4% normalmente debes colocar <b>0.04</b>.</div>';
      }
      if(preview){
        preview.innerHTML = '' +
          '<div class="ux-preview-row"><span>Nombre</span><strong>' + name + '</strong></div>' +
          '<div class="ux-preview-row"><span>Tipo</span><strong>' + (typeMap[type] || type) + '</strong></div>' +
          '<div class="ux-preview-row"><span>Cómo se calcula</span><strong>' + current.calc + '</strong></div>' +
          '<div class="ux-preview-row"><span>Porcentaje</span><strong>' + (mode === 'TASA' ? (rate || 'Pendiente') : 'No aplica') + '</strong></div>' +
          '<div class="ux-field-help">' + current.example + '</div>' + warning;
      }
      if(codigo && (!codigo.value || /^([ABPR]-)?$/.test(codigo.value))){
        codigo.value = prefixForTipo(type);
      }
    }
    updateConcept();
    [tipo, modo, tasa, nombre].forEach(function(el){ if(el){ el.addEventListener('input', updateConcept); el.addEventListener('change', updateConcept); } });
  }

  function initPeriodos(){
    var codigo = qs('#codigo');
    var tipo = qs('#tipo');
    var desde = qs('#fecha_desde');
    var hasta = qs('#fecha_hasta');
    var ultima = qs('#es_ultima_quincena');
    if(!codigo || !tipo || !desde || !hasta) return;
    var userChanged = false;
    codigo.addEventListener('input', function(){ userChanged = true; });
    function fmtMonth(m){ return String(m).padStart(2,'0'); }
    function buildCode(){
      if(userChanged && codigo.value.trim() !== '') return;
      if(!desde.value || !hasta.value) return;
      var d = new Date(desde.value+'T00:00:00');
      var h = new Date(hasta.value+'T00:00:00');
      if (isNaN(d) || isNaN(h)) return;
      var code = '';
      if(tipo.value === 'QUINCENAL'){
        var part = d.getDate() <= 15 ? 'Q1' : 'Q2';
        code = d.getFullYear() + '-' + fmtMonth(d.getMonth()+1) + '-' + part;
      } else if(tipo.value === 'MENSUAL') {
        code = d.getFullYear() + '-' + fmtMonth(d.getMonth()+1) + '-M1';
      } else {
        code = d.getFullYear() + '-' + fmtMonth(d.getMonth()+1) + '-S' + Math.ceil(d.getDate()/7);
      }
      codigo.value = code;
    }
    [tipo,desde,hasta].forEach(function(el){ el.addEventListener('change', buildCode); });
    buildCode();
    if(ultima){
      [tipo,desde,hasta].forEach(function(el){ el.addEventListener('change', function(){
        if(tipo.value !== 'QUINCENAL' || !desde.value || !hasta.value) return;
        var d = new Date(desde.value+'T00:00:00');
        var h = new Date(hasta.value+'T00:00:00');
        if(d.getDate() >= 16 && h.getDate() >= 28 && d.getMonth() === h.getMonth() && d.getFullYear() === h.getFullYear()) ultima.checked = true;
      }); });
    }
    qsa('.stat').forEach(function(card){
      var label = card.textContent.toLowerCase();
      var num = parseFloat((qs('b', card)||{}).textContent || '0');
      if(label.indexOf('pagos') >= 0 && num > 0) card.classList.add('ux-stat-warning');
      if(label.indexOf('corridas') >= 0 && num > 0) card.classList.add('ux-stat-ok');
    });
  }

  function initNovedades(){
    setText(qs('h2'), 'Excepciones del período por trabajador');
    var headers = qsa('.table thead th');
    headers.forEach(function(th){
      var text = th.textContent.replace(/\s+/g,' ').trim();
      if(text === 'Días de ausencia no remunerada') th.innerHTML = 'Ausencias';
      if(text === 'Horas de retardo') th.innerHTML = 'Retardos';
      if(text === 'Ausencias del mes para cestaticket') th.innerHTML = 'Ausencias del mes';
      if(text === 'Bonificación manual Bs') th.innerHTML = 'Bonificación manual';
      if(text === 'Otros descuentos Bs') th.innerHTML = 'Descuentos';
      if(text === 'Cuota de préstamo Bs') th.innerHTML = 'Préstamo';
      if(text === 'Vacaciones Bs') th.innerHTML = 'Vacaciones';
    });
  }

  function initCalculo(){
    qsa('.stat').forEach(function(card){
      var label = (card.textContent || '').toLowerCase();
      var value = parseFloat(((qs('b', card)||{}).textContent || '0').replace(',','.')) || 0;
      if((label.indexOf('sin salario') >= 0 || label.indexOf('datos salariales incompletos') >= 0 || label.indexOf('sin cargo') >= 0 || label.indexOf('sin turno') >= 0) && value > 0){
        card.classList.add(value > 5 ? 'ux-stat-danger' : 'ux-stat-warning');
      }
      if(label.indexOf('novedades') >= 0 && value > 0){
        card.classList.add('ux-stat-ok');
      }
    });
    var headers = qsa('.table thead th');
    headers.forEach(function(th){
      var text = th.textContent.replace(/\s+/g,' ').trim();
      if(text.indexOf('A-001') === 0) th.innerHTML = 'A-001<br>Días laborados';
      if(text.indexOf('A-002') === 0) th.innerHTML = 'A-002<br>Días de descanso';
      if(text.indexOf('A-003') === 0) th.innerHTML = 'A-003<br>Descanso trabajado';
      if(text.indexOf('A-004') === 0) th.innerHTML = 'A-004<br>Feriado trabajado';
      if(text.indexOf('A-007') === 0) th.innerHTML = 'A-007<br>HE diurna';
      if(text.indexOf('A-008') === 0) th.innerHTML = 'A-008<br>HE nocturna';
    });
  }

  if(page === 'conceptos') initConceptos();
  if(page === 'periodos') initPeriodos();
  if(page === 'novedades') initNovedades();
  if(page === 'calculo') initCalculo();
})();
