from domain.lsp.xizangdianxin_domain import XiZangDianXin
import re
import time
import logging
import requests
import datetime
import os

from PIL import Image
from lxml import etree
from injector.models import TaskModel
from injector.models import MediaInfoSyncModel
from domain.lsp.generated.anhuizx_xsd import Adi
from domain.lsp.base_injector import LspInjectorC2
from domain.lsp.value_object import C2ApiUtil
from domain.injector.value_object import TaskStatusValue, ContentTypeValue
from domain.injector.value_object import DefinitionValue

from utils.date_utils import datetime_now

logger = logging.getLogger(__file__)


class XiZangDianXin1(XiZangDianXin):

    def __init__(self, alias="XIZANGDIANXIN1"):
        super().__init__(alias)
        self.package_free = "50010108017000000000000000005888"
        self.package_vip = "50010108017000000000000000005799"

    def property_series(self, _id, volumn_count, media, action="REGIST"):
        the_property = self.property_common(media)
        the_property.extend([
            {"Name": self.get_media_name_by_alias(media)},
            {"VolumnCount": volumn_count},
            {"keywords": "是"}
        ])
        return {
            "element_type": "Series",
            "id": _id,
            "code": _id,
            "action": action,
            "property": the_property
        }

    # def property_package(self, _id, media, action):
    #     vst, vet = self.get_media_effective_time(media.id)
    #     param_dict = {"category": media.category, "is_charge": 1}
    #     # change_fields = self.injected_change.get_injected_fields(media.id, self.lsp_pk, param_dict)
    #     # is_charge = change_fields["is_charge"]
    #     the_property = [
    #         {"LicensingWindowStart": vst},
    #         {"LicensingWindowEnd": vet},
    #         {"Status": "1"}
    #     ]
    #     # if int(is_charge) == 0:
    #     #     the_property.extend(self.package_free)
    #     # else:
    #     #     the_property.extend(self.package_vip)
    #     return {
    #         "element_type": "Package",
    #         "id": _id,
    #         "code": _id,
    #         "action": action,
    #         "property": the_property
    #     }
    #
    # def _album_series_header(self, media, media_ext, info_sync):
    #     action = self.change_action_update_to_register(info_sync.action_description())
    #     _episodes = int(media.episodes) if media.episodes else 0
    #     media_verpic = media_ext.media_verpic
    #     media_horpic = media_ext.media_horpic
    #     size_verpic = self.image_resize.XIZANGDIANXIN.get("verpic")
    #     size_horpic = self.image_resize.XIZANGDIANXIN.get("horpic")
    #
    #     psid = self.code_factory.gen_series_code(media.id)
    #     p_series = self.property_series(psid, _episodes, media, action=action)
    #
    #     pspcvid = self.code_factory.gen_media_vpic_code(media.id)
    #
    #     pspchid = self.code_factory.gen_media_hpic_code(media.id)
    #
    #     verpic_series_picture = self.property_picture(pspcvid, media_verpic, size_verpic, action=action)
    #     horpic_series_picture = self.property_picture(pspchid, media_horpic, size_horpic, action=action)
    #     mapping_series_ver_picture = self.property_mapping("Picture", "Series", pspcvid, psid, _type=1, sequence=247,
    #                                                        action=action)
    #     mapping_series_hor_picture = self.property_mapping("Picture", "Series", pspchid, psid, _type=1, sequence=999,
    #                                                        action=action)
    #
    #     cast_list = self.casts(media, action)
    #
    #     cast_role_ids = self.get_cast_role_ids(media)
    #     cast_role_map_list = []
    #     for _id in cast_role_ids:
    #         mapping_series_cast_role = self.property_mapping("Series", "CastRoleMap", psid, _id, action=action)
    #         cast_role_map_list.append(mapping_series_cast_role)
    #
    #     param_dict = {"category": media.category, "is_charge": 1}
    #     change_fields = self.injected_change.get_injected_fields(media.id, self.lsp_pk, param_dict)
    #     is_charge = change_fields.get("is_charge", 0)
    #
    #     if int(is_charge) == 0:
    #         mapping_package = self.property_mapping("Package", "Series", self.package_free, psid,
    #                                                 action=action)
    #     else:
    #         mapping_package = self.property_mapping("Package", "Series", self.package_vip, psid,
    #                                                 action=action)
    #
    #     free_package = self.property_package(self.package_free, media, action)
    #     free_package["property"].extend([{"Name": "森宇-免费服务包"},
    #                                      {"Type": "0"},
    #                                      {"OrderNumber": "100990000000000029589128"},
    #                                      {"Price": "0"}])
    #     vip_package = self.property_package(self.package_vip, media, action)
    #     vip_package["property"].extend([{"Name": "森宇-影视VIP30元"},
    #                                     {"Type": "0"},
    #                                     {"OrderNumber": "100990000000000029590651"},
    #                                     {"Price": "30"}])
    #
    #     return {
    #         "domain": "0",
    #         "priority": "1",
    #         "object_list": [p_series, verpic_series_picture, horpic_series_picture, free_package,
    #                         vip_package] + cast_list,
    #         "mapping_list": [mapping_series_ver_picture, mapping_series_hor_picture,
    #                          mapping_package] + cast_role_map_list
    #     }

    def exec_cmd(self, task_id, stage="common", count=0):
        count += 1
        _task_id = self.generate_correlate_id(task_id, stage=stage)
        cmd_file_url = self.get_cmd_ftp_url(self.csp_id, _task_id)
        xml = C2ApiUtil.REQUESTXML.format(self.csp_id, self.lsp_id, "{}_{}".format(_task_id, datetime_now()),
                                          cmd_file_url)
        logger.warning("{} EXEC_CMD Request: {}".format(self.lsp_id, xml))
        headers = {"content-type": "text/xml", "SOAPAction": "application/soap+xml;charset=utf8"}
        try:
            response = requests.post(self.cms_api, data=xml, headers=headers, timeout=30).content
        except Exception as e:
            logger.error("{} 请求 {}失败: {}".format(self.lsp_id, task_id, e))
        logger.warning("{} EXEC_CMD Response: {}".format(self.lsp_id, response))
        tree = etree.fromstring(response)

        desc = tree.find(".//ErrorDescription").text
        if desc.lower() == "success":
            status = TaskStatusValue.INFO_TRANSFERING
            remark = ""
        else:
            if str(desc).lower().__contains__("could not connect") and count < self.try_count:
                return self.exec_cmd(task_id, count)
            status = TaskStatusValue.INFO_FAILED
            remark = desc

        the_task = TaskModel.objects.filter(pk=task_id)
        if the_task.first().status in (TaskStatusValue.FILE_PENDING, TaskStatusValue.INFO_PENDING):
            the_task.update(status=status, remark=remark)
        return status

    def exec_sync_header_cmd(self, sync, stage="series", count=0):
        count += 1
        _sync_id = self.generate_correlate_id(sync.id, stage=stage)
        cmd_file_url = self.get_cmd_ftp_url(self.csp_id, _sync_id)
        sync_id = "{}_{}".format(_sync_id, datetime_now())

        xml = C2ApiUtil.REQUESTXML.format(self.csp_id, self.lsp_id, sync_id, cmd_file_url)
        logger.warning("{} exec_sync_header_cmd HEADER_ID: {}, Request: {}".format(self.lsp_id, sync.id, xml))
        headers = {"content-type": "text/xml", "SOAPAction": "application/soap+xml;charset=utf8"}
        response = requests.post(self.cms_api, data=xml, headers=headers).content
        logger.warning("{} exec_sync_header_cmd HEADER_ID: {}, Response: {}".format(self.lsp_id, sync.id, response))
        tree = etree.fromstring(response)
        msg = tree.findall(".//ErrorDescription")[0].text
        if msg == "Success":
            status = MediaInfoSyncModel.SYNCING
            code = 0
        else:
            if str(msg).lower().__contains__("could not connect") and count < self.try_count:
                return self.exec_sync_header_cmd(sync, count)
            status = MediaInfoSyncModel.FAILED
            code = -1
        the_sync = MediaInfoSyncModel.objects.filter(pk=sync.id)
        if the_sync.first().status == MediaInfoSyncModel.PENDING:
            the_sync.update(status=status)
        return int(code)

    def repeat_injector_decorator(self):
        pass
