#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15

import json
from utils.base import APIView, get_offset_count
from utils.logger import error_logger
from alpha_types.venus import USER_EXTRA_TYPE


class TopicListView(APIView):
    def get(self, request):
        
        pictorial_id = request.GET.get('pictorial_id', '')
        user_id = request.GET.get('user_id', '')
        page = int(request.GET.get('page', 1))
        limit = int(request.GET.get('size', 10))
        filters = json.loads(request.GET.get('filter', "{}"))
        sorts_by = list(map(lambda i: int(i), request.GET.getlist('sort_params[]', [3])))
        drop_score = request.GET.get('drop_score', None)
        product_id = request.GET.get('product_id', None)

        if user_id:
            filters.update({'user_id': user_id})
        if pictorial_id:
            filters.update({"pictorial_id": int(pictorial_id)})
        if drop_score is not None:
            if int(drop_score) == 0:
                filters.update({'drop_score': int(drop_score)})
            elif int(drop_score) == 1:
                filters.update({'drop_score__exclude': int(drop_score)})
        if filters.get("is_finished") is not None:
            filters["is_finished"] = True if filters.get("is_finished") else False

        user_type = filters.pop("user_type") if filters.get("user_type") else None

        if user_type:
            if int(user_type) == USER_EXTRA_TYPE.COMMON:
                filters["is_shadow"] = 0
                filters["is_edit"] = 0
            elif int(user_type) == USER_EXTRA_TYPE.SHADOW:
                filters["is_shadow"] = 1
            elif int(user_type) == USER_EXTRA_TYPE.KOL:
                filters["is_kol"] = 1
            elif int(user_type) == USER_EXTRA_TYPE.EDIT:
                filters["is_edit"] = 1

        if filters.get("has_product") is not None:
             filters["has_product"] = bool(filters["has_product"])

        res = self.rpc['physical/search/business/topic'](
            offset=(page-1) * limit,
            size=limit,
            filters=filters,
            sorts_by=sorts_by
        ).unwrap()

        topic_ids = res.get("topic_ids", [])
        total_count = res.get("total_count", 0)

        try:
            data = self.rpc['venus/sun/topic/list'](
                topic_ids=topic_ids, pictorial_id=pictorial_id, product_id=product_id,
            ).unwrap()
        except Exception as e:
            error_logger.error(u'获取帖子列表失败%s', e)
            raise

        result = {
            "data": data.get("data", []),
            "total": total_count,
        }

        return result


class TopicImageListView(APIView):
    def get(self, request):
        pictorial_id = request.GET.get('pictorial_id', '')
        page = int(request.GET.get('page', 1))
        limit = int(request.GET.get('limit', 50))
        filters = json.loads(request.GET.get('filter', "{}"))
        sorts_by = list(map(lambda i: int(i), request.GET.getlist('sort_params[]', [3])))
        filters.update({"has_image": True})
        if pictorial_id:
            filters.update({"pictorial_id": int(pictorial_id)})

        res = self.rpc['physical/search/business/topic'](
            offset=(page-1) * limit,
            size=limit,
            filters=filters,
            sorts_by=sorts_by
        ).unwrap()

        topic_ids = res.get("topic_ids", [])
        total_count = res.get("total_count", 0)

        try:
            data = self.rpc['venus/community/topic/images_info_dict'](
                topic_ids=topic_ids
            ).unwrap()
        except Exception as e:
            error_logger.error(u'获取帖子列表失败%s', e)
            raise

        result = []
        for topic_id in topic_ids:

            imgs_info = data.get(str(topic_id), [])
            if not imgs_info:
                continue

            result.append({
                "id": topic_id,
                "img_url": imgs_info[0].get("url", "") + '-w'
            })

        result = {
            "data": result,
            "total": total_count,
        }

        return result


class TopicUpdateOrCreateView(APIView):
    def get(self, request):
        id = request.GET.get('id')

        try:
            data = self.rpc['venus/sun/topic/get'](id=id).unwrap()
        except Exception as e:
            error_logger.error(u'获取%s-帖子信息失败%s' %(id, e))
            raise
        return {'data': data}

    def post(self, request):

        id = request.POST.get('id', '')
        topic_images = list(map(lambda x: x[:-2], json.loads(request.POST.get('topic_images', '[]'))))
        tag_ids = list(map(lambda x: x.split(':')[0], json.loads(request.POST.get('tags', '[]'))))
        collection_tag_ids = list(map(lambda x: x.split(':')[0], json.loads(request.POST.get('collection_tags', '[]'))))
        body_esthetics_tag_ids = list(
            map(lambda x: x.split(':')[0], json.loads(request.POST.get('body_esthetics_tags', '[]'))))
        pictorial_ids = list(json.loads(request.POST.get('pictorial_ids', '[]')))

        data = {
            'topic_images': topic_images,
            'video_url': request.POST.get('video_url', ''),
            'posting_time': request.POST.get('posting_time'),
            'content': request.POST.get('content', ''),
            'content_level': request.POST.get('content_level', 0),
            'pictorial_ids': pictorial_ids,
            'user_id': request.POST.get('user', '').split(':')[0],
            'star_id': request.POST.get('star', '').split(':')[0],
            'tag_ids': tag_ids,
            'collection_tag_ids': collection_tag_ids,
            'is_online': int(request.POST.get('is_online', 0)),
            'drop_score': int(request.POST.get('drop_score', 0)),
            'has_image': 1 if topic_images else 0,
            'has_video': 1 if request.POST.get('video_url', '') else 0,
            'virtual_vote_num': request.POST.get('virtual_vote_num', ''),
            'is_home': int(request.POST.get('is_home', 0)),
            'is_recommend': int(request.POST.get('is_recommend', 0)),
            'body_esthetics_tag_ids': body_esthetics_tag_ids,
            'product_id': request.POST.get('product_id'),
            'have_face': int(request.POST.get('have_face', 0)),
            'is_finished': int(request.POST.get('is_finished', 1)),
        }
        try:
            self.rpc['venus/sun/topic/edit'](id=id, data=data).unwrap()
        except Exception as e:
            error_logger.error(u'创建/编辑%s-帖子信息失败%s' % (id, e))
            raise
        return {
            'message': '更新成功'
        }


class TopicListBatchUpdate(APIView):

    def post(self, request):
        ids = request.POST.get('ids', '').split()
        updates = self.handle_filter(request.POST.get('updates', "{}"))
        extra = json.loads(request.POST.get('extra', '{}'))
        try:
            self.rpc['venus/sun/topic/batch/update'](updates=updates, ids=ids, extra=extra).unwrap()
        except Exception as e:
            error_logger.error(u'批量更新帖子失败%s', e)
            raise
        return {
            "message": "更新成功"
        }


class TopicRelatePictorialInfo(APIView):

    def get(self, request):
        id_ = request.GET.get('id')
        offset, count = get_offset_count(request)
        try:
            data = self.rpc['venus/sun/topic/relate_pictorial_info'](id_=id_, offset=offset, count=count).unwrap()
        except Exception as e:
            error_logger.error(u'获取帖子画报列表失败%s', e)
            raise
        return {'data': data}


class TopicBallot(APIView):

    def post(self, request):
        id_ = request.POST.get('id')
        pictorial_id = request.POST.get('pictorial_id')
        ballot_num = request.POST.get('ballot_num')

        try:
            self.rpc['venus/sun/topic/ballot'](id_=id_, pictorial_id=pictorial_id, ballot_num=ballot_num).unwrap()
        except Exception as e:
            error_logger.error(u'批量更新帖子失败%s', e)
            raise
        return {
            "message": "更新成功"
        }


class TopicProductAdd(APIView):
    """帖子添加商品关系"""

    def post(self, request):
        ids = json.loads(request.POST.get('ids', '[]'))
        product_id = request.POST.get('product_id')

        try:
            self.rpc['venus/sun/topic/add_product'](ids=ids, product_id=product_id).unwrap()
        except Exception as e:
            error_logger.error(u'编辑%s帖子信息失败%s' % (ids, e))
            raise
        return {
            'message': '更新成功'
        }


class TopicProductDel(APIView):
    """帖子删除商品关系"""

    def post(self, request):
        ids = json.loads(request.POST.get('ids', '[]'))
        product_id = request.POST.get('product_id')

        try:
            self.rpc['venus/sun/topic/del_product'](ids=ids, product_id=product_id).unwrap()
        except Exception as e:
            error_logger.error(u'编辑%s帖子信息失败%s' % (ids, e))
            raise
        return {
            'message': '更新成功'
        }


class TopicBallotBatch(APIView):
    """帖子批量投票"""

    def post(self, request):

        ids = json.loads(request.POST.get('ids', '[]'))
        ballot_num = int(request.POST.get('ballot_num', 0))

        try:
            self.rpc['venus/sun/topic/ballot_batch'](ids=ids, ballot_num=ballot_num).unwrap()
        except Exception as e:
            error_logger.error(u'编辑%s帖子信息失败%s' % (ids, e))
            raise
        return {
            'message': '更新成功'
        }