import logging
from django.db.models import Q
from django.db import transaction
from copyright.models import CopyrightBrief, CopyrightDetails, CopyrightEntity, CopyrightDraftDetails, \
    CopyrightDraftBrief
from copyright.models import ProductMedia, ProductItem
from copyright.enum import CopyrightEnum, config_enum, get_choice_value
from domain.copyright.category_domain import CategoryConfigService
logger = logging.getLogger('refresh_entity')


class CopyrightService(object):
    @staticmethod
    def system_config():
        authorized_area = CategoryConfigService.get_category_by_type(1)
        types = [{'id': int(item[0]), 'name': item[1]} for item in ProductMedia.MOVE_TYPE_CHOICE]
        del (types[0])
        return {
            'type': types,
            'status_label': [{'id': item[0], 'name': item[1]} for item in CopyrightBrief.STATUS_LABEL_CHOICE],
            'authorized_area': list(authorized_area),
            'authorized_way': [{'id': item[0], 'name': item[1]} for item in CopyrightDetails.AUTHORIZED_WAY_CHOICE],
            'copyright_chain': [{'id': item[0], 'name': item[1]} for item in CopyrightBrief.CHAIN_CHOICE],
            'entity_category': CategoryConfigService.get_category_by_type(2),
            'entity': EntityService.get_entity_by_category(29),
            'with_granted': [{'id': item[0], 'name': item[1]} for item in CopyrightDetails.GRANTED_CHOICE],
            'extra': [{'id': item[0], 'name': item[1]} for item in CopyrightDetails.EXTRA_CHOICE],
            'terminals': CategoryConfigService.get_category_by_type(3),
            'buyer_company': [{'id': item[0], 'name': item[1]} for item in CopyrightBrief.BUYER_COMPANY_CHOICE],
            'item_level': [{'id': item[0], 'name': item[1]} for item in CopyrightBrief.ITEM_LEVEL_CHOICE],
            'definition': [{'id': item[0], 'name': item[1]} for item in CopyrightBrief.DEFINITION_CHOICE],
            'editing_program': [{'id': item[0], 'name': item[1]} for item in CopyrightDetails.EDITING_CHOICE],
            'vip_pay': [{'id': item[0], 'name': item[1]} for item in CopyrightDetails.VIP_CHOICE],
            'base_show_others': CopyrightEnum.BASE_SHOW_OTHER,
            'details_show_others': CopyrightEnum.DETAILS_SHOW_OTHER,
            'item_status': [{'id': item[0], 'name': item[1]} for item in ProductItem.ITEM_STATUS_CHOICE]
        }

    @staticmethod
    def system_product_config():
        types = [{'id': int(item[0]), 'name': item[1]} for item in ProductMedia.MOVE_TYPE_CHOICE]
        del (types[0])
        return {
            'type': types,
            'legal_compliance': [{'id': item[0], 'name': item[1]} for item in ProductItem.LEGAL_COMPLIANCE_DICT],
            'right': [{'id': item[0], 'name': item[1]} for item in ProductItem.AUTHORIZED_AREA_IN_CHOICE],
            'authorized_way': [{'id': item[0], 'name': item[1]} for item in ProductItem.BUY_AUTHORIZED_WAY_IN_CHOICE],
            'item_status': [{'id': item[0], 'name': item[1]} for item in ProductItem.ITEM_STATUS_CHOICE]
        }

    @staticmethod
    def get_update_entities(base_id, is_draft=0):
        categorys = CategoryConfigService.get_alias_by_type(2)
        entities = {}
        for category in categorys:
            entities[category['alias']] = {}

            if is_draft:
                details = CopyrightDraftDetails.objects.filter(entity_category_id=category['id'], copyright_id=base_id) \
                    .values().order_by('create_at')
            else:
                details = CopyrightDetails.objects.filter(entity_category_id=category['id'], copyright_id=base_id) \
                    .values().order_by('create_at')

            details = list(details)
            if details:
                entities[category['alias']]['is_white'] = details[0]['is_white']
                for detail in details:
                    detail['entity_ids'] = list(map(int, detail['entity_ids']))
                    detail['terminals'] = config_enum(detail['terminals'])
                    detail['editing_program'] = config_enum(detail['editing_program'])
                    detail['extra'] = config_enum(detail['extra'])
                entities[category['alias']]['group'] = details

        return entities

    @staticmethod
    def get_entities(base_id):
        entities = list(CopyrightDetails.objects.filter(copyright_id=base_id).values().order_by('create_at'))
        for entity in entities:
            entity['entity_ids'] = ','.join(entity['entity_ids'].values())
            entity['terminals'] = ','.join(entity['terminals'].values())
            entity['editing_program'] = ','.join(entity['editing_program'].values())
            entity['extra'] = ','.join(entity['extra'].values())
            entity['entity_category_id'] = CategoryConfigService.get_by_id(entity['entity_category_id']).id
            entity['authorized_way'] = get_choice_value(CopyrightDetails.AUTHORIZED_WAY_CHOICE,
                                                        entity['authorized_way'])
            entity['with_granted'] = get_choice_value(CopyrightDetails.GRANTED_CHOICE, entity['with_granted'])
            entity['vip_pay'] = get_choice_value(CopyrightDetails.VIP_CHOICE, entity['vip_pay'])
            entity['is_white'] = CopyrightDetails.IS_WHITE_CHOICE[entity['is_white']][1]

        return entities

    @staticmethod
    def get_empty_base():
        return {
            'id': '',
            'media_id': '',
            'document_name': '',
            'status_label': '',
            'copyright_chain': '',
            'product_id': '',
            'film_release_licence': '',
            'program_owner': '',
            'buyer_company': '',
            'remark': '',
            'entities': [],
        }


class EntityService(object):
    @staticmethod
    def get_entity_by_category(category_id):
        return list(CopyrightEntity.objects.all().filter(category_id=category_id).values('id', 'name'))


class ExportService(object):
    @staticmethod
    def get_queryset(status_label):
        queryset = CopyrightDetails.objects.filter(copyright__product__isnull=False).filter(
            ~Q(copyright__product__status=-2))
        if not status_label:
            return queryset.filter(copyright_id__status_label__has_any_keys=[1, 2, 3, 4, 5])  # 默认查询
        return queryset

    @staticmethod
    def get_product_title():
        return ['ID', '版权ID', '媒体ID', '节目名称', '状态标签', '产品状态', '节目类型', '授权区域', '授权开始时间', '授权结束时间',
                '黑白名单类型', '实体类型', '实体', '终端', '转授权', '定向转授区域', '授权方式', '评级', '主题', '集数',
                '实际集数', '单集时长', '总时长', '清晰度', '介质是否有龙标', '上映时间', '国别', '主演', '编剧', '导演',
                '剧情介绍', '制作经营许可证', '制作机构', '别名', '上映时间', '播出电视平台', '受众', '年龄段',
                '签署公司', '看点', '制作经营许可证', '所获奖项', '豆瓣评分', '地域特色', '节目播放量', 'IP资源', '衍生资源']

    @staticmethod
    def export_product_detail_list(queryset):
        details = queryset.values(
            'id', 'copyright_id', 'copyright__media_id', 'copyright__media__name', 'copyright__status_label',
            'copyright__product__item_status', 'copyright__media__type', 'copyright__product__right',
            'copyright__product__authorized_start_time', 'copyright__product__authorized_end_time', 'is_white',
            'entity_category__name', 'entity_ids', 'terminals', 'with_granted', 'granted_area', 'authorized_way',
            'copyright__product__grade', 'copyright__media__theme', 'copyright__product__episodes',
            'copyright__product__medium_episodes', 'copyright__media__episodes_time', 'copyright__media__total_time',
            'copyright__product__clarity', 'copyright__film_release_licence', 'copyright__media__production_time',
            'copyright__media__area', 'copyright__media__actor', 'copyright__media__writers',
            'copyright__media__director', 'copyright__media__plots', 'copyright__media__publish_licence',
            'copyright__media__make_company', 'copyright__media__alias', 'copyright__media__play_time',
            'copyright__media__play_app', 'copyright__media__audience_group', 'copyright__media__age_group',
            'copyright__buyer_company', 'copyright__media__sparkle', 'copyright__media__extension__制作经营许可证',
            'copyright__media__extension__所获奖项', 'copyright__media__extension__豆瓣评分',
            'copyright__media__extension__地域特色', 'copyright__media__extension__节目播放量',
            'copyright__media__extension__IP资源', 'copyright__media__extension__衍生资源',
        )
        return details

    @staticmethod
    def general_to_response(data):
        data.copyright__status_label = data.copyright__status_label.map(lambda x: ','.join(x.values()))
        data.is_white = data.is_white.map(dict(CopyrightDetails.IS_WHITE_CHOICE))
        data.copyright__media__type = data.copyright__media__type.map(dict(ProductMedia.MOVE_TYPE_CHOICE))
        data.copyright__product__item_status = \
            data.copyright__product__item_status.map(dict(ProductItem.ITEM_STATUS_CHOICE))
        data.copyright__product__clarity = \
            data.copyright__product__clarity.map(
                lambda x: '' if not x else get_choice_value(ProductItem.SHARPNESS_CHOICE, x))
        data.copyright__product__grade = data.copyright__product__grade.map(dict(ProductItem.ITEM_GRADE_DICT))
        data.copyright__buyer_company = data.copyright__buyer_company.map(dict(CopyrightBrief.BUYER_COMPANY_CHOICE))
        data.terminals = data.terminals.map(lambda x: ','.join(x.values()))
        data.entity_ids = data.entity_ids.map(lambda x: ','.join(x.values()))
        data.copyright__media__actor = data.copyright__media__actor.map(lambda x: ','.join(x) if x else '')
        data.copyright__media__writers = data.copyright__media__writers.map(lambda x: ','.join(x) if x else '')
        data.copyright__media__director = data.copyright__media__director.map(lambda x: ','.join(x) if x else '')
        data.copyright__media__audience_group = data.copyright__media__audience_group.map(
            lambda x: ','.join(x) if x else '')
        data.copyright__media__age_group = data.copyright__media__age_group.map(
            lambda x: ','.join(map(str, x)) if x else '')
        data.authorized_way = data.authorized_way.map(dict(CopyrightDetails.AUTHORIZED_WAY_CHOICE))
        data.copyright__product__right = data.copyright__product__right.map(dict(ProductItem.AUTHORIZED_AREA_IN_CHOICE))
        data.with_granted = data.with_granted.map(dict(CopyrightDetails.GRANTED_CHOICE))
        data.copyright__film_release_licence = \
            data.copyright__film_release_licence.map(dict(CopyrightBrief.FILM_RELEASE_LICENCE_CHOICE))

        return data


class InprocessCopyrightService(object):
    @staticmethod
    def get_brief_data(draft_brief_id):
        return CopyrightDraftBrief.objects.filter(id=draft_brief_id).values('media_id', 'document_name',
                                                                            'copyright_chain',
                                                                            'film_release_licence',
                                                                            'buyer_company',
                                                                            'status_label', 'program_owner',
                                                                            'remark')

    @staticmethod
    @transaction.atomic
    def bind_product(draft_brief, draft_brief_id, product_id, uid):
        draft_brief['user_id'] = uid
        draft_brief['product_id'] = product_id
        new_copyright_brief = CopyrightBrief.objects.create(**draft_brief)
        if new_copyright_brief:
            draft_details = CopyrightDraftDetails.objects.filter(copyright_id=draft_brief_id).values()
            for draft_detail in draft_details:
                draft_detail['copyright_id'] = new_copyright_brief.id
                draft_detail['status'] = 1
                draft_detail.pop('id')
                CopyrightDetails.objects.create(**draft_detail)

            CopyrightDraftBrief.objects.filter(id=draft_brief_id).delete()
