import os
import xml.etree.ElementTree as ET


def setup(app):
    """Setup connects events to the sitemap builder"""
    app.connect('html-page-context', add_html_link)
    app.connect('build-finished', create_sitemap)
    app.sitemap_links = []

    is_production = os.getenv('PRODUCTION') == 'YES'

    return {"version": "1.0.0",
            "parallel_read_safe": True,
            "parallel_write_safe": not is_production}


def add_html_link(app, pagename, templatename, context, doctree):
    """As each page is built, collect page names for the sitemap"""
    app.sitemap_links.append(pagename + ".html")


def create_sitemap(app, exception):
    """Generates the sitemap.xml from the collected HTML page links"""
    root = ET.Element("urlset")
    root.set("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9")
    app.sitemap_links.sort()

    for link in app.sitemap_links:
        url = ET.SubElement(root, "url")
        priority = 0.5
        if link == 'index.html':
            priority = 1.0
            link = ''
        elif link.endswith('index.html'):
            priority += 0.25
            link = link[:-len('index.html')]
        if link.endswith('.html'):
            link = link[:-len('.html')]
        ET.SubElement(url, "loc").text = app.builder.config.html_baseurl + '/' + link
        ET.SubElement(url, "priority").text = str(priority)

    filename = os.path.join(app.outdir, "sitemap.xml")
    ET.ElementTree(root).write(filename,
                               xml_declaration=True,
                               encoding='utf-8',
                               method="xml")

    with open(os.path.join(app.builder.outdir, 'robots.txt'), 'wt') as f:
        if os.getenv('PRODUCTION') != 'YES':
            f.write('User-agent: *\nDisallow: /\n')
        else:
            f.write('User-agent: *\nDisallow: \n\n'
                    'Sitemap: https://esphome.io/sitemap.xml\n')