import logging
from copyright.models import CopyrightEntity

logger = logging.getLogger('refresh_entity')


class DetailsService(object):
    @staticmethod
    def entity_to_white(entity_category_id, models):
        logger.info(models.__name__ + '刷新黑名单实体开始----------' + "\n")
        if entity_category_id != 0:
            details = models.objects.filter(is_white=0). \
                filter(entity_category_id=entity_category_id). \
                values('id', 'entity_category_id', 'entity_ids', 'white_entity_ids')
        else:
            details = models.objects.filter(is_white=0). \
                values('id', 'entity_category_id', 'entity_ids', 'white_entity_ids')

        for detail in details:
            update_details = {
                'white_entity_ids': DetailsService.black_to_white(detail['entity_category_id'], detail['entity_ids'])
            }
            models.objects.filter(id=detail['id']).update(**update_details)
            if entity_category_id != 0:
                logger.info(models.__name__ + '新增实体-刷新黑名单实体 id:' + str(detail['id']) + ' 更新前:' + str(detail) + "\n")
                logger.info(models.__name__ + '新增实体-刷新黑名单实体 id:' + str(detail['id']) + ' 更新后:' +
                            str(update_details['white_entity_ids']) + "\n")
            else:
                logger.info(models.__name__ + '刷新所有黑名单转白名单 id:' + str(detail['id']) + ' 更新前:' + str(detail) + "\n")
                logger.info(models.__name__ + '刷新所有黑名单转白名单 id:' + str(detail['id']) +
                            ' 更新后:' + str(update_details['white_entity_ids']) + "\n")

        logger.info(models.__name__ + '黑名单转白名单完成，共  ' + str(details.count()) + ' 条数据 ' + "\n")

    @staticmethod
    def edit_entity(entity_category_id, entity_id, models):
        logger.info(models.__name__ + '更新实体脚本开始---------- ' + "\n")
        DetailsService.refresh_white_entity_ids(entity_category_id, entity_id, models)
        DetailsService.refresh_entity_ids(entity_category_id, entity_id, models)

    @staticmethod
    def refresh_white_entity_ids(entity_category_id, entity_id, models):
        white_entity_details = models.objects.filter(entity_category_id=entity_category_id). \
            filter(white_entity_ids__has_key=entity_id). \
            values('id', 'is_white', 'entity_category_id', 'white_entity_ids')

        for detail in white_entity_details:
            entitys = CopyrightEntity.objects.filter(id__in=list(map(int, detail['white_entity_ids']))).values('id',
                                                                                                               'name')
            update_white_details = {
                'white_entity_ids': {entity['id']: entity['name'] for entity in entitys}
            }

            models.objects.filter(id=detail['id']).update(**update_white_details)

            logger.info(models.__name__ + '更新实体 white_entity_ids ：id : ' + str(detail['id']) + ' 刷新前：' +
                        str(detail) + "\n")
            logger.info(models.__name__ + '更新实体 white_entity_ids ：id : ' + str(detail['id']) + ' 刷新后：' +
                        str(update_white_details['white_entity_ids']) + "\n")

        logger.info(
            models.__name__ + '更新实体 white_entity_ids 完成，共  ' + str(white_entity_details.count()) + ' 条数据 ' + "\n")

    @staticmethod
    def refresh_entity_ids(entity_category_id, entity_id, models):
        entity_details = models.objects.filter(entity_category_id=entity_category_id). \
            filter(entity_ids__has_key=entity_id). \
            values('id', 'is_white', 'entity_category_id', 'entity_ids')

        for detail in entity_details:
            entitys = CopyrightEntity.objects.filter(id__in=list(map(int, detail['entity_ids']))).values('id', 'name')
            update_details = {
                'entity_ids': {entity['id']: entity['name'] for entity in entitys}
            }

            models.objects.filter(id=detail['id']).update(**update_details)

            logger.info(models.__name__ + '更新实体 entity_ids ：id : ' + str(detail['id']) + ' 刷新前：' +
                        str(detail) + "\n")
            logger.info(models.__name__ + '更新实体 entity_ids ：id : ' + str(detail['id']) + ' 刷新后：' +
                        str(update_details['entity_ids']) + "\n")

        logger.info(models.__name__ + '更新实体 entity_ids 完成，共  ' + str(entity_details.count()) + ' 条数据 ' + "\n")

    @staticmethod
    def black_to_white(category_id, entity_ids):
        white_entitys = CopyrightEntity.objects.filter(category_id=category_id). \
            exclude(id__in=entity_ids.keys()).values('id', 'name')
        return {entity['id']: entity['name'] for entity in white_entitys}