#!/usr/bin/env python
# -*- coding: utf-8 -*-

from urllib.parse import urljoin

from django.conf import settings
from django.db.models import Q

from gm_dataquery.dataquery import DataBuilder, DataSQLQuery
from gm_dataquery.db import DB
from gm_dataquery.dict_mixin import to_dict

from talos.models.subscript_article import (
    SubscriptArticle,
    SubCategory,
    SubscriptArticleTag,
    SubscriptArticleCategory,
)
from talos.services.tag import TagService


class SubscriptArticleDB(DataBuilder):

    def getval_tag_ids(self, obj):
        tags = list(SubscriptArticleTag.objects.filter(
            article_id=obj.id, is_online=True).values_list("tag_id", flat=True))

        return tags

    def getval_category_ids(self, obj):
        category_ids = list(SubscriptArticleCategory.objects.filter(
            article_id=obj.id, is_online=True).values_list("category_id", flat=True))

        return category_ids

    def getval_tags_name(self, obj):

        tags = self.getval_tag_ids(obj)
        tag_info_list = TagService.get_tags_by_tag_ids(tags)

        return "、".join([tag.name for tag in tag_info_list])

    def getval_categoy_name(self, obj):

        category_ids = self.getval_category_ids(obj)
        cate_info_list = SubCategory.objects.filter(id__in=category_ids, is_online=True)

        return "、".join([category.name for category in cate_info_list])


@DB
class SubscriptArticleDQ(DataSQLQuery):
    model = SubscriptArticle
    data_model = SubscriptArticleDB

    # def filter_user_id(self, srch_key, srch_val, regex=False):
    #     return Q(user_id=srch_val)

    # def filter_last_modified(self, srch_key, srch_val, regex=False):
    #     return self._qry_time_range(srch_key, srch_val, regex)

    def update(self, updates, **kwargs):

        tag_ids = updates.pop('tag_ids', None)
        if tag_ids is not None:
            tag_ids = list(map(lambda i: int(i), tag_ids))

        category_ids = updates.pop('category_ids', None)
        if category_ids is not None:
            category_ids = list(map(lambda i: int(i), category_ids))

        obj = SubscriptArticle.objects.get(**kwargs)

        update_fields = [
            "name", "title", "url", "image_url", "share_img", "share_content",
            "is_header_article", "ordering", "is_online"
        ]

        to_update = False
        for field in update_fields:
            value = updates.pop(field, None)
            if value is not None:
                to_update = True
                setattr(obj, field, value)

        if to_update:
            obj.save()

        # 更新tag
        if tag_ids is not None:
            tags = list(SubscriptArticleTag.objects.filter(article_id=obj.id).values_list('tag_id', flat=True))

            rm_ids = set(tags) - set(tag_ids)
            if rm_ids:
                SubscriptArticleTag.objects.filter(article_id=obj.id, tag_id__in=rm_ids).update(is_online=False)

            _ids = set(tags) & set(tag_ids)
            if _ids:
                SubscriptArticleTag.objects.filter(article_id=obj.id, tag_id__in=_ids).update(is_online=True)

            new_ids = set(tag_ids) - set(tags)
            ats = [
                SubscriptArticleTag(
                    article_id=obj.id,
                    tag_id=tag_id
                )
                for tag_id in new_ids
            ]
            if ats:
                SubscriptArticleTag.objects.bulk_create(ats)

        # 更新category
        if category_ids is not None:
            cids = list(SubscriptArticleCategory.objects.filter(article_id=obj.id).values_list('category_id', flat=True))

            rm_ids = set(cids) - set(category_ids)
            if rm_ids:
                SubscriptArticleCategory.objects.filter(article_id=obj.id, category_id__in=rm_ids).update(is_online=False)

            _ids = set(cids) & set(category_ids)
            if _ids:
                SubscriptArticleCategory.objects.filter(article_id=obj.id, category_id__in=_ids).update(is_online=True)

            new_ids = set(category_ids) - set(cids)
            acs = [
                SubscriptArticleCategory(
                    article_id=obj.id,
                    category_id=tag_id
                )
                for tag_id in new_ids
            ]
            if acs:
                SubscriptArticleCategory.objects.bulk_create(acs)

        return {'id': obj.id}

    def create(self, **kwargs):

        tag_ids = kwargs.pop('tag_ids', None)
        category_ids = kwargs.pop('category_ids', None)

        obj = SubscriptArticle.objects.create(**kwargs)

        # 更新tag
        ats = [
            SubscriptArticleTag(
                article_id=obj.id,
                tag_id=tag_id
            )
            for tag_id in tag_ids
        ]
        if ats:
            SubscriptArticleTag.objects.bulk_create(ats)

        # 更新category
        acs = [
            SubscriptArticleCategory(
                article_id=obj.id,
                category_id=category_id
            )
            for category_id in category_ids
        ]
        if acs:
            SubscriptArticleCategory.objects.bulk_create(acs)

        return {'id': obj.id}




class SubCategoryDB(DataBuilder):
    pass


@DB
class SubCategoryDQ(DataSQLQuery):
    model = SubCategory
    data_model = SubCategoryDB