(function(){
  var root=document.querySelector('.atv-padel-data');
  if(!root)return;

  var urls={
    standen:'https://docs.google.com/spreadsheets/d/e/2PACX-1vQcb_Jyckg2Xe2_13Y6URrUJnj6_g4mPQaPgkydO6WoK3ZIwm6J3onRi08E6MjT-JXss8RtBWKB6qeQ/pub?gid=625378478&single=true&output=csv',
    uitslagen:'https://docs.google.com/spreadsheets/d/e/2PACX-1vQcb_Jyckg2Xe2_13Y6URrUJnj6_g4mPQaPgkydO6WoK3ZIwm6J3onRi08E6MjT-JXss8RtBWKB6qeQ/pub?gid=1886957883&single=true&output=csv',
    programma:'https://docs.google.com/spreadsheets/d/e/2PACX-1vQcb_Jyckg2Xe2_13Y6URrUJnj6_g4mPQaPgkydO6WoK3ZIwm6J3onRi08E6MjT-JXss8RtBWKB6qeQ/pub?gid=1997915445&single=true&output=csv'
  };

  var names=['standen','uitslagen','programma'];
  var cache={};
  var active='standen';
  var content=root.querySelector('.atv-data-content');
  var status=root.querySelector('.atv-data-status');
  var updated=root.querySelector('.atv-data-updated');
  var buttons=root.querySelectorAll('.atv-data-tab');
  var refresh=root.querySelector('.atv-data-refresh');

  if(!content)return;

  function setStatus(t){
    if(status) status.textContent=t;
  }

  function setUpdated(t){
    if(updated) updated.textContent=t;
  }

  var st=document.createElement('style');
  st.textContent=
    '.atv-padel-data *{box-sizing:border-box}'+
    '.atv-padel-data .atv-data-tabs{display:flex;gap:8px;align-items:center;flex-wrap:wrap}'+
    '.atv-padel-data .atv-data-tab{background:#0052ac!important;color:#fff!important}'+
    '.atv-padel-data .atv-data-tab.active{background:#fd7e14!important;color:#fff!important}'+
    '.atv-padel-data .atv-data-refresh{margin-left:auto;background:#fff!important;color:#0052ac!important;border:1px solid #cfd7e2!important}'+
    '.atv-padel-data .atv-data-info{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:10px 2px;color:#6c7480;font-size:12px;flex-wrap:wrap}'+
    '.atv-padel-data .atv-table-wrap{width:100%;overflow-x:auto;background:#fff;border:1px solid #e2e6ea;border-radius:10px}'+
    '.atv-padel-data table{width:100%!important;border-collapse:collapse!important;border:0!important;background:#fff;margin:0!important}'+
    '.atv-padel-data th,.atv-padel-data td{padding:10px 12px!important;border:0!important;border-bottom:1px solid #e8ebef!important;text-align:left;vertical-align:middle;white-space:nowrap}'+
    '.atv-padel-data th{background:#0052ac!important;color:#fff!important;font-weight:700}'+
    '.atv-padel-data tr.section-row td{background:#eef4fb!important;color:#0052ac!important;font-weight:700;font-size:17px;border-bottom:2px solid #0052ac!important}'+
    '.atv-padel-data tr:nth-child(even):not(.section-row) td{background:#fafbfc}'+
    '.atv-padel-data .atv-message{padding:28px;text-align:center;color:#6c7480;background:#fff;border:1px solid #e2e6ea;border-radius:10px}'+
    '.atv-padel-data .atv-error{padding:18px;color:#a61b1b;background:#fff3f3;border-left:5px solid #c62828;border-radius:8px}'+
    '@media(max-width:700px){'+
      '.atv-padel-data .atv-data-tab{flex:1;padding:11px 6px!important;font-size:14px!important}'+
      '.atv-padel-data .atv-data-refresh{width:100%;margin-left:0!important;padding:10px!important}'+
      '.atv-padel-data th,.atv-padel-data td{padding:8px 9px!important;font-size:13px}'+
      '.atv-padel-data tr.section-row td{font-size:15px}'+
    '}';
  document.head.appendChild(st);

  function esc(v){
    return String(v==null?'':v)
      .replace(/&/g,'&amp;')
      .replace(/</g,'&lt;')
      .replace(/>/g,'&gt;')
      .replace(/"/g,'&quot;');
  }

  function parseCSV(text){
    var rows=[],row=[],cell='',q=false,i=0,c,n;
    text=String(text||'').replace(/^\uFEFF/,'');
    for(i=0;i<text.length;i++){
      c=text.charAt(i);
      n=text.charAt(i+1);
      if(q){
        if(c==='"' && n==='"'){cell+='"';i++;}
        else if(c==='"'){q=false;}
        else{cell+=c;}
      }else{
        if(c==='"'){q=true;}
        else if(c===','){row.push(cell);cell='';}
        else if(c==='\n'){row.push(cell);rows.push(row);row=[];cell='';}
        else if(c!=='\r'){cell+=c;}
      }
    }
    row.push(cell);
    if(row.length>1 || row[0]!=='' || rows.length===0)rows.push(row);
    return rows;
  }

  function trimRows(rows){
    while(rows.length && rows[0].every(function(x){return String(x).trim()==='';}))rows.shift();
    while(rows.length && rows[rows.length-1].every(function(x){return String(x).trim()==='';}))rows.pop();

    var max=0;
    rows.forEach(function(r){
      for(var i=r.length-1;i>=0;i--){
        if(String(r[i]||'').trim()!==''){
          if(i+1>max)max=i+1;
          break;
        }
      }
    });

    return rows.map(function(r){
      var out=r.slice(0,max);
      while(out.length<max)out.push('');
      return out;
    });
  }

  function nonEmptyCount(row){
    var n=0;
    row.forEach(function(v){
      if(String(v||'').trim()!=='')n++;
    });
    return n;
  }

  function looksHeader(row){
    var s=row.join(' ').toLowerCase();
    return /\b(team|datum|tijd|baan|categorie|poule|gespeeld|punten|saldo|games|team 1|team 2)\b/.test(s);
  }

  function render(rows){
    rows=trimRows(rows);

    if(!rows.length){
      content.innerHTML='<div class="atv-message">Geen gegevens gevonden.</div>';
      return;
    }

    var cols=rows[0].length;
    var html='<div class="atv-table-wrap"><table><tbody>';
    var expectHeader=true;

    rows.forEach(function(row){
      var count=nonEmptyCount(row);
      if(count===0)return;

      if(count===1 && cols>1){
        var val='';
        for(var k=0;k<row.length;k++){
          if(String(row[k]||'').trim()!==''){
            val=row[k];
            break;
          }
        }
        html+='<tr class="section-row"><td colspan="'+cols+'">'+esc(val)+'</td></tr>';
        expectHeader=true;
        return;
      }

      var header=expectHeader;
      html+='<tr>';
      row.forEach(function(cell){
        if(header) html+='<th>'+esc(cell)+'</th>';
        else html+='<td>'+esc(cell)+'</td>';
      });
      html+='</tr>';

      expectHeader=false;
    });

    html+='</tbody></table></div>';
    content.innerHTML=html;
  }

  function setActive(name){
    active=name;
    for(var i=0;i<buttons.length;i++){
      if(names[i]===name)buttons[i].classList.add('active');
      else buttons[i].classList.remove('active');
    }
  }

  function load(name,force){
    if(!urls[name])return;

    setActive(name);
    setStatus('Gegevens laden...');

    if(cache[name] && !force){
      render(cache[name]);
      setStatus('Gereed');
      return;
    }

    var sep=urls[name].indexOf('?')>=0?'&':'?';

    fetch(urls[name]+sep+'_='+Date.now(),{cache:'no-store'})
      .then(function(r){
        if(!r.ok)throw new Error('HTTP '+r.status);
        return r.text();
      })
      .then(function(text){
        cache[name]=parseCSV(text);
        if(active===name)render(cache[name]);
        setStatus('Gereed');
        setUpdated('Bijgewerkt: '+new Date().toLocaleTimeString('nl-NL',{
          hour:'2-digit',
          minute:'2-digit'
        }));
      })
      .catch(function(err){
        setStatus('Fout');
        content.innerHTML=
          '<div class="atv-error"><b>Gegevens konden niet worden geladen.</b><br>'+
          esc(err && err.message ? err.message : err)+'</div>';
      });
  }

  for(var i=0;i<buttons.length && i<names.length;i++){
    (function(name,button){
      button.onclick=function(){
        load(name,false);
      };
    })(names[i],buttons[i]);
  }

  if(refresh){
    refresh.onclick=function(){
      cache[active]=null;
      load(active,true);
    };
  }

  load('standen',true);
})();