import datatypes

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

    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()
            lang_pages.reverse()
            pages_modified[lang] = lang_pages
        self.context['pages_modified'] = pages_modified

        # TODO hidden pages
        # TODO draft pages
        # TODO authors


        # tags
        self.context['tags'] = self.factories['tag'].all()

        # categories
        self.context['categories'] = {}
        for lang in self.config['lang']['supported']:
            self.context['categories'][lang] = {}
            for tag in self.context['tags'][lang].values():
                if tag.is_category:
                    self.context['categories'][lang][tag.name] = tag

        # build_date
        self.context['build_date'] = datatypes.Date("now", self.config)

        # relevant_pages
        relevant_pages_tuple = []
        for page in published_pages:
            if page.relevance['is_relevant']:
                relevant_pages_tuple.append((page.relevance['prio'], page))
        relevant_pages_tuple.sort(key=lambda x: x[0])
        relevant_pages_tuple.reverse()
        relevant_pages = {}
        for prio, page in relevant_pages_tuple:
            if page.lang not in relevant_pages:
                relevant_pages[page.lang] = []
            relevant_pages[page.lang].append(page)
        self.context['relevant_pages'] = relevant_pages
        self.context['relevant_pages_tuple'] = relevant_pages_tuple




    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.link.path, lang, {'page': page})

            # all tags
            for tag in self.context['tags'][lang].values():
                writer.write_template('tag.html', tag.link.path, lang, {'tag': tag})

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