from flask import url_for
from werkzeug.exceptions import NotFound

from .feed import FeedItem
from ..models.article import Article
from ..models.magazine import Magazine
from ..schemas.magazine_issue import MagazineIssueSchema


class MagazineIssue(FeedItem):
    schema = MagazineIssueSchema()
    default_fields = [
        'year',
        'issue_number',
        'issue_label',
        'magazine',
        'language',
        'cover_image',
        'promo_image',
    ]

    @property
    def magazine(self):
        id = self.data['magazine_id']
        return {
            'uuid': id,
            'name': Magazine.manager.get(id).data['name']
        }

    def relationships(self, format='jsonapi'):
        data = {}
        stories = []
        for story in self.data['stories']:
            try:
                article = Article.manager.get(story['article_id'])
                stories.append({
                    'data': {
                        'id': article.key,
                        'type': article.data['content_type'],
                        'meta': {
                            'title': article.data['title'],
                            'genre': story['genre'],
                            'series': story['series'],
                            'lead_media': article.data.get('lead_media', {})
                        }
                    },
                    'links': {
                        'related': url_for('feeddetail',
                                           _external=True,
                                           pk=article.key,
                                           format=format),
                        'href': article.data['uri']
                    }
                })
            except NotFound:
                stories.append({
                    'data': {'id': story['article_id']}
                })
        data['stories'] = stories
        return data

    def validate(self, data):
        super(MagazineIssue, self).validate(data)
        self._map_domain_article(data)

    def _validate_taxonomy_topics(self):
        pass

    def _initialize_data(self, data, domain):
        data = super(MagazineIssue, self)._initialize_data(data, domain)
        data.setdefault('last_modified_datetime', data['meta']['last_update'])
        return data

    def _map_domain_article(self, data):
        for story in data['stories']:
            try:
                article_id = '-'.join(story['article_id'].split('-')[1:])
                response = self.manager.search_by_field('id', article_id)
                story['article_id'] = '{}:{}'.format(response[0].domain, story['article_id'])
            except NotFound:
                pass
