#! /usr/bin/env python3
# -*- coding:utf-8 -*-

from injector.models import InjectedFieldChangeModel
from domain.dataset import DataSet
from imdb.models import EpisodeEffectiveTimeModel


class InjectedFieldChange(DataSet):
    model = InjectedFieldChangeModel

    def get_by_search(self, media_id, partner_id):
        obj = self.model.objects.filter(media=media_id, partner=partner_id).first()
        return obj

    # 注宁夏、安徽、银河额外配置了是否收费字段，其它都没有
    def get_injected_fields(self, media_id, partner_id, param_dict):
        injected = self.get_by_search(media_id=media_id, partner_id=partner_id)
        result = param_dict
        if injected:
            for key, value in param_dict.items():
                change_value = injected.__dict__.get(key)
                result[key] = change_value if change_value != "" else value
        return result

    # 获取是否还能变更注入合作商媒资参数及变更后参数
    def get_injected_param(self, media_id, partner_id, keys):
        injected = self.get_by_search(media_id, partner_id)
        result = {key: {"flag": True, "value": "" if key != "is_charge" else 1} for key in keys}
        if injected:
            result["save"] = False
            for key in keys:
                result[key]["flag"] = False
                result[key]["value"] = injected.__dict__.get(key)
        else:
            result["save"] = True
        return result

    @staticmethod
    def to_dict(obj):
        result = {
            'id': obj.id,
            "media_id": obj.media_id,
            "media_name": obj.media.name,
            'partner_id': obj.partner_id,
            "partner_name": obj.partner.name,
            'category': obj.category
        }

        return result

    def update_or_create(self, search, data):
        # 修改时可能还未添加扩展信息
        self.model.objects.update_or_create(defaults=data, **search)
        return

    def handler_effective_time(self, search, data):
        EpisodeEffectiveTimeModel.objects.update_or_create(defaults=data, **search)
        return
