<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Info</title>
    <script>
    let layerInfo = allLayerInfo = null;
    let sortFieldName = '';
    let sortAscending = true;

    function sortBy(name) {
        let fieldname;
        switch(name) {
            case 'schema': 
              fieldname = 'f_table_schema';
              break;
            case 'name': 
              fieldname = 'f_table_name';
              break;
            case 'geom_column': 
              fieldname = 'f_geometry_column';
              break;
            case 'geom_type':
              fieldname = 'type';
              break;
            case 'dim': 
              fieldname = 'coord_dimension';
              break;
            case 'type':
              fieldname = 'table_type';
              break;
            case 'count':
              fieldname = 'estimated_rows'
              break;
            default:
              fieldname = name;
        }
        
        if (sortFieldName != fieldname) {
            sortFieldName = fieldname;
            sortAscending = true;
        } else {
            sortAscending = !sortAscending;
        }
        updateLayerInfo(fieldname, sortAscending);
    }

    function updateLayerInfo(field, ascending) {
        const table = document.querySelector('#layerinfo');
        switch (field) {
            case 'f_table_schema':
                layerInfo.sort((item1, item2) => ('' + item1.f_table_schema + item1.f_table_name).localeCompare(item2.f_table_schema + item2.f_table_name))
                break;
            case 'f_table_name':
                layerInfo.sort((item1, item2) => ('' + item1[field]).localeCompare(item2[field]));
                break;
            case 'f_geometry_column':
            case 'type':
            case 'table_type':
            case 'coord_dimension':
                layerInfo.sort((item1, item2) => ('' + item1[field] + '.' +  item1.f_table_schema + '.' + item1.f_table_name).localeCompare(item2[field] + '.' + item2.f_table_schema + '.' + item2.f_table_name));
                break;
            case 'srid':
            layerInfo.sort((item1, item2)=>item1.srid-item2.srid?item1.srid-item2.srid:('' + item1.f_table_schema + item1.f_table_name).localeCompare(item2.f_table_schema + item2.f_table_name));
                break;
            case 'estimated_rows':
                layerInfo.sort((item1, item2)=>item1.estimated_rows-item2.estimated_rows);
        }
        if (!ascending) {
            layerInfo.reverse();
        }            
        table.innerHTML = '<tr><th>schema</th><th>name</th><th>geom_column</th><th>srid</th><th>geom_type</th><th>dim</th><th>type</th><th>count</th></tr>' +
            layerInfo.map(item=>`<tr>
                <td>${item.f_table_schema}</td>
                <td><a href="tableinfo.html?table=${item.f_table_schema}.${item.f_table_name}&geom_column=${item.f_geometry_column}&srid=${item.srid}&geomtype=${item.type}&dimensions=${item.coord_dimension}&estimated_rows=${item.estimated_rows}">${item.f_table_name}</a></td>
                <td>${item.f_geometry_column}</td>
                <td>${item.srid}</td>
                <td>${item.type}</td>
                <td>${item.coord_dimension}D</td>
                <td>${item.table_type}</td>
                <td>${item.estimated_rows}</td></tr>`).join('\n');
        const tableHeaders = document.querySelectorAll('tr > th');
        for (let i = 0; i < tableHeaders.length; i++) {
            tableHeaders[i].innerHTML = `<a href="#" onclick="sortBy('${tableHeaders[i].textContent}')">${tableHeaders[i].textContent}</a>`
        }
    }

    function filterLayerInfo() {
        const filterWords = document.querySelector('#filter')
            .value.split(' ')
            .filter(word=>word !== '')
            .map(word=>word.toLocaleLowerCase());
        if (filterWords.length) {
            layerInfo = allLayerInfo.filter(layer=>{
                const layerText = Object.values(layer).join(' ').toLocaleLowerCase();
                return filterWords.filter(word=>layerText.indexOf(word)>-1).length == filterWords.length;
            })
        } else {
            layerInfo = allLayerInfo;
        }
        updateLayerInfo(sortFieldName, sortAscending);
    }

    function init() {
        fetch('data/list_layers').then(response=>{
            if (response.ok) {
                response.json().then(json=> {
                    layerInfo = allLayerInfo = json;
                    filterLayerInfo();
                    sortBy('schema');
                })
            } else {
                layerInfo = allLayerInfo = [];
                response.json().then(json =>{
                    document.querySelector('#layerinfo').innerHTML = `<tr><td>Error fetching layers: ${json.error}</td></tr>`
                }).catch(err => {
                    document.querySelector('#layerinfo').innerHTML = `<tr><td>Error fetching layers: ${err}</td></tr>`
                });
            }
        })
    }

    </script>
</head>
<body onload="init()">
    <h1>Layers in database</h1>
    <input id="filter" type="text" placeholder="Search..." size="20" oninput="filterLayerInfo()"><br>
    <table id="layerinfo"></table>
</body>
</html>