# ToaruOS package index
"""
Use mod_python and place this in the root of your repostiory and it will
read the manifest file and list packages in a visually-pleasing format.
"""
from mod_python import apache

import tarfile
import configparser as ConfigParser
import os

VERSION_NUMBER=os.path.basename(os.path.dirname(__file__))
BASE_PATH='https://toaruos.org/msk/{dir}'.format(dir=VERSION_NUMBER)

def handler(req):
    os.chdir(os.path.dirname(__file__))
    req.content_type = 'text/html'
    root = BASE_PATH
    req.write("""<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <title>ToaruOS Repository Browser</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script>
        <script src="https://use.fontawesome.com/4c0c119c77.js"></script>
        <style>
            body {
              padding-bottom: 2rem;
            }

            h3 {
              margin-top: 2rem;
            }

            .row {
              margin-bottom: 1rem;
            }
            .row .row {
              margin-top: 1rem;
              margin-bottom: 0;
            }
            [class*="col-"] {
              padding-top: 1rem;
              padding-bottom: 1rem;
              background-color: rgba(86,61,124,.15);
              border: 1px solid rgba(86,61,124,.2);
            }

            hr {
              margin-top: 2rem;
              margin-bottom: 2rem;
            }

            .digest {
                font-size: 12px;
                color: #777;
                font-family: "monospace";
            }
        </style>
    </head>
    <body>
""")
    req.write("""
    <nav class="navbar navbar-toggleable-md navbar-inverse bg-inverse mb-4">
      <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
      <a class="navbar-brand" href="{root}">ToaruOS Repository Browser</a>
      <div class="collapse navbar-collapse" id="navbarCollapse">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item">
            <a class="nav-link" href="http://toaruos.org/">Home</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="{root}/manifest">Manifest</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="https://github.com/klange/toaruos">Github</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="https://gitlab.com/toaruos">Gitlab</a>
          </li>
        </ul>
      </div>
    </nav>
        <div class="container">
""".format(root=root))

    parser = ConfigParser.RawConfigParser(allow_no_value=True)
    parser.read("manifest")
    packages = parser.sections()
    #with open('manifest.json','r') as f:
    #    packages = json.loads(f.read())

    def package_path(package, member):
        tmp = package['destination'] + '/' + member.replace('./','/')
        while '//' in tmp:
            tmp = tmp.replace('//','/')
        return tmp

    def dumpPackage(name, deps=False, files=False):
        package = dict(parser.items(name))
        req.write("""<h2>{name} - {friendly} - {version}</h2>
                <p>
                    <a href="{base}{file}"><i class="fa fa-download" title="Download"></i></a>
                    <a href="?{name}"><i class="fa fa-search-plus" title="Details"></i></a>
                    {description}
                </p>""".format(
            name=name,
            friendly=package['friendly-name'],
            version=package['version'],
            description=package['description'],
            base=BASE_PATH,
            #digest=package['checksum'],
            file=package['source'] if 'source' in package else '#',
        ))
        if deps:
            if 'depends' in package and package['depends']:
                req.write("<h4>Dependencies</h4><ul>")
                for dep in package['depends']:
                    req.write('<li><a href="?' + dep + '">' + dep + "</a></li>\n")
                req.write("</ul>")
        if files and 'source' in package:
            req.write("<h4>Files</h4><ul>")
            empty = True
            with tarfile.open(os.path.dirname(__file__) + '/' + package['source'],'r:gz') as msk:
                for member in msk.getnames():
                    empty = False
                    req.write('<li>' + package_path(package, member) + '</li>')
            if empty:
                req.write('<li><i>This is a meta package and contains no files.</i></li>')
            req.write("</ul>")

    if req.args:
        if req.args.startswith(':'):
            matches = [x for x in packages if req.args[1:] in x]
            req.write("""
                <h1>Search Results</h1>
                <p class="lead">{count} match{es}</p>
""".format(count=len(matches),es="" if len(matches) == 1 else "es"))
            for name in matches:
                dumpPackage(name)
        elif req.args in packages:
            req.write("""
                <h1>Package Details</h1>
""")
            dumpPackage(req.args, deps=True, files=True)
        else:
            req.write('<h1>Package not found.</h1>')

    else:

        req.write("""
            <h1><img src="package.png" /> ToaruOS Package Index</h1>
            <p class="lead">Complete package listing for ToaruOS ({version})</p>
""".format(version=VERSION_NUMBER))

        for package in sorted(packages):
            dumpPackage(package,deps=True)

    req.write("""
        </div>
    </body>
</html>""")
    return apache.OK

