import re
from domain.imdb.value_object import CategoryValue


# 注：base_injector的顺序 Response_xml.format(desc, code)
class C2ApiUtil:
    REQUESTXML = """
        <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iptv="iptv">
           <soapenv:Header/>
           <soapenv:Body>
              <iptv:ExecCmd soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                 <CSPID xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">{}</CSPID>
                 <LSPID xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">{}</LSPID>
                 <CorrelateID xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">{}</CorrelateID>
                 <CmdFileURL xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">{}</CmdFileURL>
              </iptv:ExecCmd>
           </soapenv:Body>
        </soapenv:Envelope>
        """
    REQUESTXMLQP = """
            <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iptv="iptv">
               <soapenv:Header/>
               <soapenv:Body>
                  <iptv:ContentMng soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                     <contentMngReqXml xsi:type="soapenc:string">{}</contentMngReqXml>
                  </iptv:ContentMng>
               </soapenv:Body>
            </soapenv:Envelope>
            """
    RESPONSEXMLQP = """
                <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iptv="iptv">
                   <soapenv:Header/>
                   <soapenv:Body>
                      <iptv:ContentMng soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                         <arg0 xsi:type="soapenc:string">{}</contentMngReqXml>
                      </iptv:ContentMng>
                   </soapenv:Body>
                </soapenv:Envelope>
                """
    RESPONSEXML = """
        <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iptv="iptv">
           <soapenv:Header/>
           <soapenv:Body>
              <iptv:ResultNotify soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                 <ErrorDescription xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">{}</ErrorDescription>
                 <Result xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">{}</Result>
              </iptv:ResultNotify>
           </soapenv:Body>
        </soapenv:Envelope>
        """

    NMGYDPA_RESPONSEXML = """
            <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iptv="iptv">
               <soapenv:Header/>
               <soapenv:Body>
                  <iptv:ResultNotify soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                     <ErrorDescription xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">{}</ErrorDescription>
                     <Result xsi:type="xsd:int" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">{}</Result>
                  </iptv:ResultNotify>
               </soapenv:Body>
            </soapenv:Envelope>
            """

    HUBEIYIDONGPA = """
            <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
               <soapenv:Body>
                  <ResultNotifyResponse  xmlns="iptv">
                     <ResultNotifyReturn xmlns="">
                        <ErrorDescription xsi:type="xsd:string">{}</ErrorDescription>
                        <Result>{}</Result>
                     </ResultNotifyReturn>
                  </ResultNotifyResponse>
               </soapenv:Body>
            </soapenv:Envelope>
            """

    C2_RESPONSEXML = """
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <soapenv:Body>
                <ns1:ResultNotifyResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="iptv">
                    <ResultNotifyReturn href="#id0"/>
                </ns1:ResultNotifyResponse>
                <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:CSPResult" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="iptv">
                    <Result href="#id1"/>
                    <ErrorDescription xsi:type="soapenc:string">{}</ErrorDescription>
                </multiRef>
                <multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:int" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">{}</multiRef>
            </soapenv:Body>
        </soapenv:Envelope>
        """
    XINJIANGTV_RESPONSEXML = """
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <soapenv:Body>
                <ns1:ResultNotifyResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="iptv">
                    <ResultNotifyReturn href="#id0"/>
                </ns1:ResultNotifyResponse>
                <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:CSPResult" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="iptv">
                    <ErrorDescription xsi:type="soapenc:string">{}</ErrorDescription>
                    <Result xsi:type="xsd:int">{}</Result>
                </multiRef>
            </soapenv:Body>
        </soapenv:Envelope>
"""

    # 宁夏专用
    NXS_RESPONSEXML = """
        <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iptv="iptv">
            <soapenv:Header/>
            <soapenv:Body>
                <iptv:ResultNotifyResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                    <ResultNotifyReturn xsi:type="iptv:CSPResult">
                        <ErrorDescription xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">{}</ErrorDescription>
                        <Result xsi:type="xsd:int">{}</Result>
                    </ResultNotifyReturn>
                </iptv:ResultNotifyResponse>
            </soapenv:Body>
        </soapenv:Envelope>
        """

    # 安徽移动专用
    AHZX_RESPONSEXML = """
        <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <soap:Body>
                <ns2:ResultNotifyResponse xmlns:ns2="iptv">
                    <ResultNotifyReturn>
                        <errorDescription>{}</errorDescription>
                        <result>{}</result>
                    </ResultNotifyReturn>
                </ns2:ResultNotifyResponse>
            </soap:Body>
        </soap:Envelope>
        """

    # 安徽电信专用
    AHDX_REQUESTXML = """
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:itv="itv">
           <soapenv:Header/>
           <soapenv:Body>
              <itv:ExecCmd>
                 <CSPID>{}</CSPID>
                 <LSPID>{}</LSPID>
                 <CorrelateID>{}</CorrelateID>
                 <CmdFileURL>{}</CmdFileURL>
              </itv:ExecCmd>
           </soapenv:Body>
        </soapenv:Envelope>
        """

    AHDX_RESPONSEXML = """
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:itv="itv">
           <soapenv:Header/>
           <soapenv:Body>
              <itv:ExecCmdResponse>
                 <return>
                    <errorDescription>{}</errorDescription>
                    <result>{}</result>
                 </return>
              </itv:ExecCmdResponse>
           </soapenv:Body>
        </soapenv:Envelope>    
        """
    GANSUYIDONGXML = """
        <xsi:ADI xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <Reply>
                <Property Name="Result">{}</Property>
                <Property Name="Description">{}</Property>
            </Reply>
        </xsi:ADI>
    """
    FUJIANYIDONG = """
        <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:impl="iptv">
            <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                <impl:ResultNotifyResponse>
                    <ResultNotifyReturn xsi:type="impl:CSPResult">
                        <ErrorDescription xsi:type="xsd:string">{}</ErrorDescription>
                        <Result xsi:type="xsd:int">{}</Result>
                    </ResultNotifyReturn>
                </impl:ResultNotifyResponse>
            </SOAP-ENV:Body>
        </SOAP-ENV:Envelope>
    """
    CHONGQINGYX = """
                <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                        <ns1:ExecCmdResponse xmlns:ns1="iptv">
                            <ExecCmdReturn xsi:type="ns1:CSPResult">
                                <ErrorDescription xsi:type="xsd:string">{}</ErrorDescription>
                                <Result xsi:type="xsd:int">{}</Result>
                            </ExecCmdReturn>
                        </impl:ExecCmdResponse>
                    </SOAP-ENV:Body>
                </SOAP-ENV:Envelope>
            """

    @classmethod
    def callback_params_config(cls, alias):
        """回执接口解析参数正则及报文格式配置"""
        default = {
            "correlate_id": ".//CorrelateID", "cmd_result": ".//CmdResult",
            "result_fileURL": ".//ResultFileURL",
            "response_xml": cls.RESPONSEXML
        }
        # 和默认对比之后需要改变的字段
        default_change = {
            "ANHUIZHONGXING": {"response_xml": cls.AHZX_RESPONSEXML},
            "HAINANYIDONG": {"response_xml": cls.NXS_RESPONSEXML},
            # "HEBEIYIDONG": {},
            # "HEBEIYIDONG2": {},
            # "HUBEIYIDONG": {},
            "NINGXIAYIDONG": {"response_xml": cls.NXS_RESPONSEXML},
            "shanxiPukka": {"cmd_result": ".//multiRef"},
            "XINJIANGIPTV": {"cmd_result": ".//multiRef", "response_xml": cls.C2_RESPONSEXML},
            "ANHUIDIANXING": {"response_xml": cls.AHDX_RESPONSEXML},
            "GUIZHOUIPTV": {"response_xml": cls.NXS_RESPONSEXML},
            "GANSUYIDONG": {"response_xml": cls.NXS_RESPONSEXML},
            "FUJIANYIDONG": {"cmd_result": ".//multiRef", "response_xml": cls.FUJIANYIDONG},
            "ANHUIYIDONG": {"cmd_result": ".//multiRef", "response_xml": cls.NXS_RESPONSEXML},
            "ANHUIDIANXINXIN": {"cmd_result": ".//multiRef", "response_xml": cls.NXS_RESPONSEXML},
            "HUBEIPA": {"cmd_result": ".//multiRef", "response_xml": cls.HUBEIYIDONGPA},
            "ANHUIDXEDU": {"cmd_result": ".//multiRef", "response_xml": cls.NXS_RESPONSEXML},
            "NMGYDPA": {"cmd_result": ".//multiRef", "response_xml": cls.HUBEIYIDONGPA},
            "XINJIANGTV": {"cmd_result": ".//multiRef", "response_xml": cls.XINJIANGTV_RESPONSEXML},
            "HUBEIPALW": {"cmd_result": ".//multiRef", "response_xml": cls.HUBEIYIDONGPA},
            "CHONGQINGYX": {"response_xml": cls.CHONGQINGYX},
            "SHANXITONGYI": {"cmd_result": ".//multiRef", "response_xml": cls.NMGYDPA_RESPONSEXML},
            "XINJIANGTVDX": {"cmd_result": ".//multiRef", "response_xml": cls.XINJIANGTV_RESPONSEXML},
            "GUANGXIDIANXIN": {"cmd_result": ".//multiRef", "response_xml": cls.HUBEIYIDONGPA},
            "QSHINMGYDPA": {"cmd_result": ".//multiRef", "response_xml": cls.HUBEIYIDONGPA},
            "JIANGSUYDWL": {"response_xml": cls.FUJIANYIDONG},
            "ANHUIZHONGXING4K": {"response_xml": cls.AHZX_RESPONSEXML},
            "NEIMENGYDIPTV": {"cmd_result": ".//multiRef", "response_xml": cls.HUBEIYIDONGPA},
        }
        change_params = default_change.get(alias, None)
        if change_params:
            for params, value in change_params.items():
                default[params] = value
        return default


class SFtpUrlParameter:
    USERNAME = "sftp-user"
    PASSWORD = 123456
    PORT = 22


class FtpUrlParameter:
    USERNAME = "senyucp"
    PASSWORD = "Yk_29833vf"
    PORT = 2121


# 合作方限制补充字段
class LspExtendConfig:
    """
    alias: 图片尺寸、限制频道、后续补充其它
    """
    CA = CategoryValue

    # 竖图尺寸 | 横图尺寸 (宽， 高) | 频道
    GITV = {"verpic": (350, 500), "horpic": (480, 270),
            "category": [CA.CHILDREN, CA.MOVIE, CA.TVSERIES, CA.VARIETY, CA.ANIMATION, CA.EDUCATION, CA.DOCUMENTARY,
                         CA.LIFE, CA.OPERA]}
    GITV_GDYD = {"verpic": (245, 350), "horpic": (384, 216),
                 "category": [CA.CHILDREN, CA.MOVIE, CA.TVSERIES, CA.E_SPORTS, CA.ANIMATION, CA.VARIETY, CA.EDUCATION,
                              CA.DOCUMENTARY, CA.LIFE, CA.OPERA]}
    HUBEIYIDONG = {"verpic": (300, 408), "horpic": (480, 270), "category": [CA.EDUCATION, CA.CHILDREN, CA.ANIMATION]}
    shanxiPukka = {"verpic": (300, 448), "horpic": (480, 270),
                   "category": [CA.CHILDREN, CA.MOVIE, CA.TVSERIES, CA.E_SPORTS, CA.ANIMATION]}
    HEBEIYIDONG = {"verpic": (350, 500), "horpic": (480, 270), "category": [CA.MOVIE, CA.TVSERIES]}
    HEBEIYIDONG2 = {"verpic": (350, 500), "horpic": (480, 270), "category": [CA.CHILDREN, CA.E_SPORTS]}
    XINJIANGIPTV = {"verpic": (468, 624), "horpic": (480, 270),
                    "category": [CA.CHILDREN, CA.MOVIE, CA.TVSERIES, CA.E_SPORTS, CA.ANIMATION]}
    NINGXIAYIDONG = {"verpic": (412, 600), "horpic": (720, 405),
                     "category": [CA.CHILDREN, CA.MOVIE, CA.TVSERIES, CA.E_SPORTS, CA.ANIMATION, CA.EDUCATION]}
    ANHUIZHONGXING = {"verpic": (350, 500), "horpic": (480, 270),
                      "category": [CA.CHILDREN, CA.ANIMATION, CA.MOVIE, CA.TVSERIES, CA.VARIETY, CA.DOCUMENTARY]}
    HAINANYIDONG = {"verpic": (220, 330), "horpic": (576, 324), "category": [CA.TVSERIES, CA.MOVIE]}
    ANHUIDIANXING = {"verpic": (220, 330), "horpic": (576, 324), "category": [CA.CHILDREN]}
    GUIZHOUIPTV = {"verpic": (246, 313), "horpic": (528, 296),
                   "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN, CA.ANIMATION]}

    CATEGORY_PIC_SISE = {"shanxiPukka": {"少儿": {"verpic": (240, 330), "horpic": (480, 270)}}}

    GUANGXIYIDONG = {"verpic": (412, 600), "horpic": (528, 296),
                     "category": [CA.MOVIE, CA.TVSERIES, CA.ANIMATION, CA.ANIMATION_MOVIE, CA.SPORT, CA.TRAVEL,
                                  CA.WEB_TV, CA.WEB_MOVIE, CA.VARIETY, CA.EDUCATION, CA.MOTHER_BABY, CA.GAME,
                                  CA.SHORT_FILM, CA.DOCUMENTARY, CA.SQUARE_DANCE, CA.IP, CA.SPECIAL_COLUMN, CA.CHILDREN,
                                  CA.E_SPORTS]}
    GANSUYIDONG = {"verpic": (255, 375), "horpic": (528, 296),
                   "category": [CA.ANIMATION, CA.MOVIE, CA.TVSERIES, CA.EDUCATION, CA.CHILDREN]}

    FUJIANYIDONG = {"verpic": (412, 600), "horpic": (272, 203), "category": [CA.LIFE]}

    SHANXIYIDONG = {"verpic": (300, 450), "horpic": (450, 400), "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN]}

    ANHUIYIDONG = {"verpic": (350, 500), "horpic": (480, 270), "category": [CA.FILM, CA.MOVIE, CA.TVSERIES]}

    SHANXIDIANXIN = {"verpic": (270, 356), "horpic": (600, 338),
                     "category": [CA.MOVIE, CA.TVSERIES, CA.ANIMATION, CA.ANIMATION_MOVIE, CA.SPORT, CA.TRAVEL,
                                  CA.WEB_TV, CA.WEB_MOVIE, CA.VARIETY, CA.EDUCATION, CA.MOTHER_BABY, CA.GAME,
                                  CA.SHORT_FILM, CA.DOCUMENTARY, CA.SQUARE_DANCE, CA.IP, CA.SPECIAL_COLUMN, CA.CHILDREN,
                                  CA.E_SPORTS]}
    XIZANGDIANXIN = {"verpic": (260, 360), "horpic": (1280, 720),
                     "category": [CA.MOVIE, CA.TVSERIES, CA.ANIMATION, CA.ANIMATION_MOVIE, CA.SPORT, CA.TRAVEL,
                                  CA.WEB_TV, CA.WEB_MOVIE, CA.VARIETY, CA.EDUCATION, CA.MOTHER_BABY, CA.GAME,
                                  CA.SHORT_FILM, CA.DOCUMENTARY, CA.SQUARE_DANCE, CA.IP, CA.SPECIAL_COLUMN, CA.CHILDREN,
                                  CA.E_SPORTS]}
    XIZANGDIANXIN1 = {"verpic": (260, 360), "horpic": (1280, 720),
                      "category": [CA.MOVIE, CA.TVSERIES, CA.ANIMATION, CA.ANIMATION_MOVIE, CA.SPORT, CA.TRAVEL,
                                   CA.WEB_TV, CA.WEB_MOVIE, CA.VARIETY, CA.EDUCATION, CA.MOTHER_BABY, CA.GAME,
                                   CA.SHORT_FILM, CA.DOCUMENTARY, CA.SQUARE_DANCE, CA.IP, CA.SPECIAL_COLUMN,
                                   CA.CHILDREN,
                                   CA.E_SPORTS]}

    ANHUIDIANXINXIN = {"verpic": (350, 500), "horpic": (480, 270),
                       "category": [CA.MOVIE, CA.TVSERIES, CA.ANIMATION, CA.VARIETY, CA.DOCUMENTARY, CA.E_SPORTS]}
    ANHUIDIANXINYSQP = {"verpic": (350, 500), "horpic": (480, 270),
                        "category": [CA.MOVIE, CA.TVSERIES, CA.ANIMATION, CA.VARIETY, CA.DOCUMENTARY, CA.E_SPORTS]}

    HUBEIPA = {"verpic": (300, 408), "horpic": (480, 270),
               "category": [CA.CHILDREN, CA.ANIMATION, CA.TVSERIES, CA.MOVIE]}

    ANHUIDXEDU = {"verpic": (350, 500), "horpic": (480, 270),
                  "category": [CA.MOVIE, CA.TVSERIES, CA.ANIMATION, CA.VARIETY, CA.DOCUMENTARY]}

    GDYDXP = {"stagepic": (230, 306), "briefpic": (350, 196), "posterpic": (750, 384), "advertpic": (710, 400),
              "category": [CA.SMART_CHILDREN]}
    NMGYDPA = {"verpic": (300, 408), "horpic": (480, 270),
               "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN, CA.ANIMATION]}
    NMGYDGT = {"verpic": (245, 350), "horpic": (384, 216),
               "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN, CA.ANIMATION, CA.VARIETY]}
    XINJIANGTV = {"verpic": (468, 624),
                  "category": [CA.MOVIE, CA.TVSERIES, CA.ANIMATION, CA.ANIMATION_MOVIE, CA.SPORT, CA.TRAVEL,
                               CA.WEB_TV, CA.WEB_MOVIE, CA.VARIETY, CA.EDUCATION, CA.MOTHER_BABY, CA.GAME,
                               CA.SHORT_FILM, CA.DOCUMENTARY, CA.SQUARE_DANCE, CA.IP, CA.SPECIAL_COLUMN, CA.CHILDREN,
                               CA.E_SPORTS]}
    XINJIANGTVDX = {"verpic": (468, 624),
                    "category": [CA.MOVIE, CA.TVSERIES, CA.ANIMATION, CA.ANIMATION_MOVIE, CA.SPORT, CA.TRAVEL,
                                 CA.WEB_TV, CA.WEB_MOVIE, CA.VARIETY, CA.EDUCATION, CA.MOTHER_BABY, CA.GAME,
                                 CA.SHORT_FILM, CA.DOCUMENTARY, CA.SQUARE_DANCE, CA.IP, CA.SPECIAL_COLUMN, CA.CHILDREN,
                                 CA.E_SPORTS]}
    HUBEIPALW = {"verpic": (300, 408), "horpic": (480, 270),
                 "category": [CA.TVSERIES, CA.MOVIE, CA.VARIETY, CA.DOCUMENTARY]}
    SXYDGT = {"verpic": (245, 350), "horpic": (384, 216),
              "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN, CA.ANIMATION]}
    CHONGQINGYX = {"category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN, CA.ANIMATION]}

    SHANXITONGYI = {"verpic": (255, 375), "horpic": (272, 203),
                    "category": [CA.TVSERIES, CA.MOVIE, CA.CHILDREN, CA.ANIMATION]}

    SHANXIWL = {"verpic": (255, 375), "horpic": (272, 203),
                "category": [CA.MOVIE, CA.TVSERIES, CA.ANIMATION, CA.VARIETY, CA.EDUCATION, CA.DOCUMENTARY,
                             CA.CHILDREN]}
    SHANXIYDGTC = {"verpic": (350, 500), "horpic": (480, 270),
                   "category": [CA.CHILDREN, CA.MOVIE, CA.TVSERIES, CA.VARIETY, CA.ANIMATION, CA.EDUCATION]}
    CHONGQINGYDWL = {"verpic": (255, 375), "horpic": (272, 203),
                     "category": [CA.ANIMATION, CA.CHILDREN, CA.MOVIE, CA.TVSERIES, CA.VARIETY]}

    YUNNANYIDONG = {"verpic": (262, 360), "horpic": (412, 230),
                    "category": [CA.ANIMATION, CA.CHILDREN, CA.MOVIE, CA.TVSERIES, CA.EDUCATION, CA.VARIETY,
                                 CA.DOCUMENTARY, CA.SPORT]}

    JIANGSUYD = {"verpic": (350, 500), "horpic": (500, 350),
                 "category": [CA.ANIMATION, CA.CHILDREN]}

    GUANGXIDIANXIN = {"verpic": (300, 408), "horpic": (480, 270),
                      "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN, CA.ANIMATION]}

    QSHINMGYDGT = {"verpic": (245, 350), "horpic": (384, 216),
                   "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN, CA.ANIMATION, CA.VARIETY, CA.MINI_DRAMA]}
    SHANXIYIDONGS = {"verpic": (300, 450), "horpic": (450, 400), "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN]}
    QSHINMGYDPA = {"verpic": (300, 408), "horpic": (480, 270),
                   "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN, CA.ANIMATION]}

    JIANGSUYDWL = {"verpic": (412, 600), "horpic": (720, 405),
                   "category": [CA.ANIMATION, CA.CHILDREN]}

    JIANGXIYD = {"verpic": (412, 600), "horpic": (528, 298),
                 "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN, CA.ANIMATION, CA.DOCUMENTARY]}

    ANHUIZHONGXING4K = {"verpic": (350, 500), "horpic": (480, 270),
                        "category": [CA.CHILDREN, CA.ANIMATION, CA.MOVIE, CA.TVSERIES, CA.VARIETY, CA.DOCUMENTARY]}

    SHANXIYIDONGGTCS = {"verpic": (350, 500), "horpic": (480, 270),
                        "category": [CA.CHILDREN, CA.MOVIE, CA.TVSERIES, CA.VARIETY, CA.ANIMATION, CA.EDUCATION]}

    NEIMENGYDIPTV = {"verpic": (300, 444), "horpic": (1920, 1080),
                     "category": [CA.MOVIE, CA.TVSERIES, CA.CHILDREN, CA.ANIMATION, CA.VARIETY]}

    def get_pic_type_of_size(self, size):
        re_compile = "[ x,，]"
        try:
            _w, _h = re.split(re_compile, str(size))
            _type = "horpic" if int(_w) > int(_h) else "verpic"
        except ValueError:
            _type = ""
        return _type

    def get_oss_resize_params(self, alias, url, size, m="fill", to_ip=False, category=None):
        """
        图片缩放尺寸，不同平台下不同类别限制不同尺寸，不同平台的默认尺寸也不一样
        :param url: picture阿里云地址
        :param _type: 横图 | 竖图
        :param m: 缩放类型; lfit、mfit、fill、pad、fixed
        :param to_ip: 是否需要转IP地址
        :return: 拼接url
        """
        _type = self.get_pic_type_of_size(size)
        temporary = self.CATEGORY_PIC_SISE.get(alias, None)
        picture_size = temporary.get(category, None) if temporary else None
        if not picture_size:
            picture_size = LspExtendConfig().__getattribute__("{}".format(alias))
        weight, height = picture_size.get(_type, (0, 0))
        result = url
        if weight != 0 and height != 0 and result:
            if not to_ip:
                params_url = "?x-oss-process=image/resize,m_{},h_{},w_{}".format(m, height, weight)
                result = url + params_url
            else:
                params_url = "_{}x{}".format(weight, height)
                image_split = url.rsplit(".", 1)
                result = "{}{}.{}".format(image_split[0], params_url, image_split[1])
        return result

    @classmethod
    def get_constraint_category(cls, alias):
        config = cls().__getattribute__(alias)
        category = config.get("category", list())
        return [{"label": CategoryValue.desc(c), "value": c} for c in category]


class CodeSampleFactory:
    Series = "01"
    Program = "02"
    Movie = "03"
    Picture = "04"
    Cast = "05"
    CastRoleMap = "06"
    Package = "07"
    Channel = "08"
    PhysicalChannel = "09"
    Schedule = "10"

    Picture_Ver = "11"  # 媒资图片横图，伪id的类别
    Picture_Hor = "12"  # 分集剧照信息，伪id类别

    Task = "21"  # 注入任务id的类别
    DistrTask = "22"  # 分发任务id类型

    CAST_MAPPING = {"Actor": "61", "Director": "62", "ScreenWriter": "63"}
    Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

    def __init__(self, cp_id, max_len=32):
        self.cp_id = cp_id
        self.max_len = max_len

    def __generate_code__(self, category, some_id):
        fmt = "{0}_{1}_{2}"
        code = fmt.format(self.cp_id, category, some_id)
        before, after = code.rsplit("_", 1)
        after = after.rjust(self.max_len - len(before), "0")
        before = before.replace("_", "0")
        return before + after

    def gen_series_code(self, media_id):
        return self.__generate_code__(self.Series, media_id)

    def gen_program_code(self, program_id):
        return self.__generate_code__(self.Program, program_id)

    def gen_movie_code(self, storage_id):
        return self.__generate_code__(self.Movie, storage_id)

    def gen_media_vpic_code(self, media_id):
        return self.__generate_code__(self.Picture_Ver, media_id)

    def gen_media_hpic_code(self, media_id):
        return self.__generate_code__(self.Picture_Hor, media_id)

    def gen_program_pic_code(self, storage_id):
        return self.__generate_code__(self.Picture, storage_id)

    def gen_cast_code(self, _type, cast_id):
        _cast = "{}_{}".format(self.Cast, self.CAST_MAPPING[_type])
        return self.__generate_code__(_cast, cast_id)

    def gen_cast_role_map_code(self, _type, role_id):
        _map = "{}_{}".format(self.CastRoleMap, self.CAST_MAPPING[_type])
        return self.__generate_code__(_map, role_id)

    def gen_package_code(self, media_id):
        return self.__generate_code__(self.Package, media_id)

    def gen_task_code(self, task_id, task=Task):
        return self.__generate_code__(task, task_id)


# 维护C2接口规范中的ID/CODE的定义
class CodeFactory:
    Series = "01"  # 基础媒资信息id类别，供剧头使用
    Media = "02"  # 基础媒资信息id类别
    Episode = "03"  # 基础媒资分集id类别
    Video = "04"  # 视频文件id类别
    Cast = "05"  # 演员信息id类别
    CastRoleMap = "06"  # 演员信息id类别
    Package = "07"
    Category = "08"

    Picture_M_V = "11"  # 媒资图片竖图，伪id的类别
    Picture_M_H = "12"  # 媒资图片横图，伪id的类别
    Picture_E = "13"  # 分集剧照信息，伪id类别
    Picture_B = "14"  # 缩略图
    Picture_A = "15"  # 广告图

    Picture_S = "10"  # 剧照
    Picture_E_P = "16"  # 分集海报
    Picture_E_B = "17"  # 分集缩略图
    Picture_E_A = "18"  # 分集广告图

    Task = "21"  # 注入任务id的类别

    CAST_MAPPING = {"Actor": "61", "Director": "62", "ScreenWriter": "63"}

    def __init__(self, csp_id):
        self.csp_id = csp_id

    def __generate_code__(self, some_id, category):
        fmt = "{0}-{1}-{2}"
        return fmt.format(some_id, category, self.csp_id)

    @staticmethod
    def parse_code(code: str):
        some_id, category, _ = code.split('-')
        return int(some_id), category

    def gen_series_code(self, some_id):
        return self.__generate_code__(some_id, self.Media)

    def gen_program_code(self, some_id):
        return self.__generate_code__(some_id, self.Media)

    def gen_movie_code(self, some_id):
        return self.__generate_code__(some_id, self.Video)

    def gen_episode_code(self, some_id):
        return self.__generate_code__(some_id, self.Episode)

    def gen_media_vpic_code(self, some_id):
        return self.__generate_code__(some_id, self.Picture_M_V)

    def gen_media_hpic_code(self, some_id):
        return self.__generate_code__(some_id, self.Picture_M_H)

    def gen_media_breif_pic_code(self, some_id):
        return self.__generate_code__(some_id, self.Picture_B)

    def gen_media_advert_pic_code(self, some_id):
        return self.__generate_code__(some_id, self.Picture_A)

    def gen_episode_picture_code(self, some_id):
        return self.__generate_code__(some_id, self.Picture_E)

    def gen_media_stage_pic_code(self, some_id):
        return self.__generate_code__(some_id, self.Picture_S)

    def gen_episode_breif_pic_code(self, some_id):
        return self.__generate_code__(some_id, self.Picture_E_B)

    def gen_episode_advert_pic_code(self, some_id):
        return self.__generate_code__(some_id, self.Picture_E_A)

    def gen_episode_poster_pic_code(self, some_id):
        return self.__generate_code__(some_id, self.Picture_E_P)

    def gen_category_code(self, some_id):
        return self.__generate_code__(some_id, self.Category)

    def gen_cast_code(self, some_id):
        return self.__generate_code__(some_id, self.Cast)

    def gen_cast_role_map_code(self, some_id):
        return self.__generate_code__(some_id, self.CastRoleMap)

    def gen_package_code(self, some_id):
        return self.__generate_code__(some_id, self.Package)

    def gen_task_code(self, some_id):
        return self.__generate_code__(some_id, self.Task)


CMD_LIST = [("河南IPTV", "11"), ("重庆IPTV", "12"), ("安徽电信", "13"), ("福建有线", "14"), ("广东有线", "15"),
            ("重庆有线", "16")]

C_WSDL = """<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="iptv"
    xmlns:impl="iptv"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <wsdl:types>
        <schema
            xmlns="http://www.w3.org/2001/XMLSchema"
                targetNamespace="iptv">
            <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
            <complexType name="CSPResult">
                <sequence>
                    <element name="Result" type="xsd:int"/>
                    <element name="ErrorDescription" nillable="true" type="soapenc:string"/>
                </sequence>
            </complexType>
        </schema>
    </wsdl:types>
    <wsdl:message name="ResultNotifyResponse">
        <wsdl:part name="ResultNotifyReturn" type="impl:CSPResult"/>
    </wsdl:message>
    <wsdl:message name="ResultNotifyRequest">
        <wsdl:part name="CSPID" type="xsd:string"/>
        <wsdl:part name="LSPID" type="xsd:string"/>
        <wsdl:part name="CorrelateID" type="xsd:string"/>
        <wsdl:part name="CmdResult" type="xsd:int"/>
        <wsdl:part name="ResultFileURL" type="xsd:string"/>
    </wsdl:message>
    <wsdl:portType name="CSPResponse">
        <wsdl:operation name="ResultNotify"
                        parameterOrder="CSPID LSPID CorrelateID CmdResult
ResultFileURL">
            <wsdl:input name="ResultNotifyRequest" message="impl:ResultNotifyRequest"/>
            <wsdl:output name="ResultNotifyResponse" message="impl:ResultNotifyResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="ctmsSoapBinding" type="impl:CSPResponse">
        <wsdlsoap:binding style="rpc"
                          transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="ResultNotify">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="ResultNotifyRequest">
                <wsdlsoap:body use="encoded"
                               encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                               namespace="iptv"/>
            </wsdl:input>
            <wsdl:output name="ResultNotifyResponse">
                <wsdlsoap:body use="encoded"
                               encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                               namespace="iptv"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="CSPResponseService">
        <wsdl:port name="ctms" binding="impl:ctmsSoapBinding">
            <wsdlsoap:address location="http://47.110.47.81:8000/injector/callback/media/FUJIANYIDONG/"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>
"""
S_WSDL = """<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="iptv"
    xmlns:impl="iptv"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <wsdl:types>
        <schema
            xmlns="http://www.w3.org/2001/XMLSchema"
                targetNamespace="iptv">
            <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
            <complexType name="CSPResult">
                <sequence>
                    <element name="Result" type="xsd:int"/>
                    <element name="ErrorDescription" nillable="true" type="soapenc:string"/>
                </sequence>
            </complexType>
        </schema>
    </wsdl:types>
    <wsdl:message name="ResultNotifyResponse">
        <wsdl:part name="ResultNotifyReturn" type="impl:CSPResult"/>
    </wsdl:message>
    <wsdl:message name="ResultNotifyRequest">
        <wsdl:part name="CSPID" type="soapenc:string"/>
        <wsdl:part name="LSPID" type="soapenc:string"/>
        <wsdl:part name="CorrelateID" type="soapenc:string"/>
        <wsdl:part name="CmdResult" type="xsd:int"/>
        <wsdl:part name="ResultFileURL" type="soapenc:string"/>
    </wsdl:message>
    <wsdl:portType name="CSPResponse">
        <wsdl:operation name="ResultNotify"
                        parameterOrder="CSPID LSPID CorrelateID CmdResult
ResultFileURL">
            <wsdl:input name="ResultNotifyRequest" message="impl:ResultNotifyRequest"/>
            <wsdl:output name="ResultNotifyResponse" message="impl:ResultNotifyResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="ctmsSoapBinding" type="impl:CSPResponse">
        <wsdlsoap:binding style="rpc"
                          transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="ResultNotify">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="ResultNotifyRequest">
                <wsdlsoap:body use="encoded"
                               encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                               namespace="iptv"/>
            </wsdl:input>
            <wsdl:output name="ResultNotifyResponse">
                <wsdlsoap:body use="encoded"
                               encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                               namespace="iptv"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="CSPResponseService">
        <wsdl:port name="ctms" binding="impl:ctmsSoapBinding">
            <wsdlsoap:address location="http://47.110.47.81:8000/injector/callback/cdn/FUJIANYIDONG/"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>
"""

Q_WSDL = """<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="iptv"
    xmlns:impl="iptv"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <wsdl:types>
        <schema
            xmlns="http://www.w3.org/2001/XMLSchema"
                targetNamespace="iptv">
            <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
            <complexType name="CSPResult">
                <sequence>
                    <element name="Result" type="xsd:int"/>
                    <element name="ErrorDescription" nillable="true" type="soapenc:string"/>
                </sequence>
            </complexType>
        </schema>
    </wsdl:types>
    <wsdl:message name="ResultNotifyResponse">
        <wsdl:part name="ResultNotifyReturn" type="impl:CSPResult"/>
    </wsdl:message>
    <wsdl:message name="ResultNotifyRequest">
        <wsdl:part name="CSPID" type="soapenc:string"/>
        <wsdl:part name="LSPID" type="soapenc:string"/>
        <wsdl:part name="CorrelateID" type="soapenc:string"/>
        <wsdl:part name="CmdResult" type="xsd:int"/>
        <wsdl:part name="ResultFileURL" type="soapenc:string"/>
    </wsdl:message>
    <wsdl:portType name="CSPResponse">
        <wsdl:operation name="ResultNotify"
                        parameterOrder="CSPID LSPID CorrelateID CmdResult
ResultFileURL">
            <wsdl:input name="ResultNotifyRequest" message="impl:ResultNotifyRequest"/>
            <wsdl:output name="ResultNotifyResponse" message="impl:ResultNotifyResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="ctmsSoapBinding" type="impl:CSPResponse">
        <wsdlsoap:binding style="rpc"
                          transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="ResultNotify">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="ResultNotifyRequest">
                <wsdlsoap:body use="encoded"
                               encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                               namespace="iptv"/>
            </wsdl:input>
            <wsdl:output name="ResultNotifyResponse">
                <wsdlsoap:body use="encoded"
                               encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                               namespace="iptv"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="CSPResponseService">
        <wsdl:port name="ctms" binding="impl:ctmsSoapBinding">
            <wsdlsoap:address location="http://47.110.47.81/injector/callback/ctms"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>
"""
