class Generator:
    def __init__(self, config, context):
        self.config = config
        self.context = context

    def generate_context(self, pages, static_files):
        # static_files
        self.context['static_files'] = static_files

        published_pages = []
        for page in pages:
            if page.status == "published":
                published_pages.append(page)


        # pages
        all_pages = {}
        for page in published_pages:
            if page.lang not in all_pages:
                all_pages[page.lang] = {}
            if page.slug in all_pages[page.lang]:
                raise Exception("duplicate language (",lang,") for slug '", slug ,"'")
            all_pages[page.lang][page.slug] = page
        self.context['pages'] = all_pages

        # pages_modified
        pages_modified = {}
        for lang in self.config['lang']['supported']:
            lang_pages = []
            for page in published_pages:
                if page.lang == lang:
                    lang_pages.append(page)
            lang_pages.sort()
            pages_modified[lang] = lang_pages
        self.context['pages_modified'] = pages_modified

        # TODO hidden pages
        # TODO draft pages
        # TODO authors

        # categories
        categories = {}
        for page in published_pages:
            if page.category not in categories:
                categories[page.category] = {}
            if page.lang not in categories[page.category]:
                categories[page.category][page.lang] = []
            categories[page.category][page.lang].append(page)
        self.context['categories'] = categories

        # tags
        tags = {}
        for page in published_pages:
            for tag in page.tags:
                if tag not in tags:
                    tags[tag] = {}
                if page.lang not in tags[tag]:
                    tags[tag][page.lang] = []
                tags[tag][page.lang].append(page)
        self.context['tags'] = tags



    def generate_homepage(self, writer, lang, path):
            page = self.context['pages'][lang][self.config['theme']['homepage_slug']]
            writer.write_template(page.template, path , lang, {'page': page})


    def generate_output(self, writer):
        for sf, raw in self.context['static_files'].items():
                print ("writing binary file: ", sf)
                writer.write_file(sf, raw, mode="wb")

        for lang in self.config['lang']['supported']:
            # all pages
            for page in self.context['pages'][lang].values():
                writer.write_template(page.template, page.url, lang, {'page': page})

            # homepages for languages
            self.generate_homepage(writer, lang, lang + "/index.html")
        
            
        # homepage
        self.generate_homepage(writer, self.config['lang']['default'], "index.html")