# -*- coding:utf-8 -*-
"""资源问卷管理页面"""

from kyger.utility import numeric, mk_time, time_check, json2dict, dict2json_file
from kyger.utility import date as date_time


class Research(object):
    """问卷调用"""
    __page = 0  # 当前页
    __total_page = 0  # 总页数
    __total_rows = 0  # 总记录数

    # 构造函数
    def __init__(self, db=None, kg=None):
        # 数据库
        from kyger.db import MySQL
        self.db = db if db else MySQL()  # 数据库操作对象
        self.kg = kg  # 全局变量
        self.__limit = ''

    def list_page(self, *args, **kwargs):
        """
        分页获取问卷信息，参数同list。
        :return:{
            'list':          # 分页的当前页问卷数据
            'page_html':     # 分页的html模板
            'page_data':     # 分页的数据：当前页、总页数、总记录数
        }
        """
        # page和row的数据
        if self.kg['get'].get('page',1) != 1:
            self.__page = numeric(self.kg['get'].get('page', 1), 1)
        else:
            self.__page = numeric(self.kg['post'].get('page', 1), 1)  # 当前页
        if 'row' in kwargs: row = kwargs['row']  # 在kwargs里
        elif len(args) > 2: row = args[0]  # 在args里
        else: row = 10  # 默认10
        # 获取问卷数据
        data = self.list(*args, **kwargs)
        # 分页模板合成
        web_url = self.kg['server'].get('WEB_URL')
        from kyger.common import page_tpl
        page_html = page_tpl(self.db.page, self.db.total_page, row, web_url)  # 获取分页模板
        self.__total_rows = self.db.total_rows  # 总记录数
        self.__total_page = self.db.total_page  # 总页数
        return {
            'list': data,
            'page_html': page_html,
            'page_data': {'page': self.__page, 'total_page': self.__total_page, 'total_rows': self.__total_rows}
        }

    # 已删除参数
    def list(self, row=10, category=0, start=0, word='', audit=0, published=0, end=0, before=0, recycle=1, userid=0, date='%Y-%m-%d %H:%M:%S'):
        """
        获取问卷数据
        :param row: [int] 分页时为每页要显示的数量，不分页时为调用的总记录数。缺省值为 10
        :param category: [int] 调用栏目id，0调用全部，其他为要调用的栏目id。缺省值0
        :param start: [int] 不分页时，从第几天数据开始调用，分页时无效。缺省值0
        :param word: [str] 搜索的关键字。
        :param audit: [int] 是否调用已审核的内容，0调用全部，1调用审核，2调用未审核。缺省值0
        :param published: [int] 是否调用已发布的内容，0调用全部，1调用发布，2调用草稿。缺省值0
        :param end: [int] 是否调用已结束的内容，0调用全部，1调用已结束的内容,2调用未结束的内容。缺省值0
        :param before: [int] 是否调用多久之前的内容，0调用全部，1调用过去一周的内容，2调用过去一个月的内容，3调用过去一年的内容。缺省值0
        :param recycle: [int] 是否调用回收站的内容，0调用全部，1调用正常，2调用回收站。缺省值0
        :param date: [str] 日期格式化：
                                %y 两位数的年份表示（00-99）  %Y 四位数的年份表示（000-9999）  %m 月份（01-12）  %d 日，月内中的一天（0-31）
                                %H 24小时制小时数（0-23）  %I 12小时制小时数（01-12）  %M 分钟数（00=59）  %S 秒（00-59）
                                %a 本地简化星期名称  %A 本地完整星期名称 %b 本地简化的月份名称, 英文  %B 本地完整的月份名称, 英文
                                %c 本地相应的日期表示和时间表示  %j 年内的一天（001-366）  %p 本地A.M.或P.M.的等价符  %U 一年中的星期数（00-53）星期天为星期的开始（第n周）
                                %w 星期（0-6），星期天为星期的开始  %W 一年中的星期数（00-53）星期一为星期的开始（第n周）   %x 本地相应的日期表示
                                %X 本地相应的时间表示  %Z 当前时区的名称  %% %号本身
        :return:{
        }
        """
        # ************************************************************ where条件的处理
        word_sql = "&& (`title` like '%%%s%%' or `description` like '%%%s%%')" % (word, word) if word else ""
        # category_sql = "&& `category` rlike '[\[|, ]%d[\]|,]'" % category if category else ""
        # 20200612:zyy:改为如下
        category_sql = "&& JSON_CONTAINS(`category`, '%d')" % category if category else ""
        
        # 审核
        if audit == 1:
            audit_sql = "&& `audit` = 1"  # 通过审核
        elif audit == 2:
            audit_sql = "&& `audit` = 0"  # 未通过审核
        else:
            audit_sql = ""

        # 发布
        if published == 1:
            published_sql = "&& `published` = 1"  # 发布
        elif published == 2:
            published_sql = "&& `published` = 0"  # 草稿
        else:
            published_sql = ""

        # 回收站
        if recycle == 1:
            recycle_sql = "&& `recycle` = 0"
        elif recycle == 2:
            recycle_sql = "&& `recycle` = 1"
        else:
            recycle_sql = ""

        # 结束
        if end == 1:
            end_sql = '&& limited_time=1 && end < %s' % int(self.kg['run_start_time'][1])
        elif end == 2:
            end_sql = '&& (limited_time=0 or end > %s)' % int(self.kg['run_start_time'][1])
        else:
            end_sql = ''
        # 多久之前
        today = mk_time(date_time(int(self.kg['run_start_time'][1]), "%Y%m%d"), "%Y%m%d")
        up_time_list = [0, today - 86400 * 6, today - 86400 * 29, today - 86400 * 364]
        before_sql = '&& update_time > %s' % up_time_list[before] if before else ''

        # 拼接where参数
        if userid != 0:
            where = "webid=%s && kgid=%s %s %s %s %s %s %s %s" % (self.kg['web']['id'], self.kg['user']['id'], recycle_sql, category_sql, word_sql, audit_sql, published_sql, end_sql, before_sql)
        else:
            where = "webid=%s %s %s %s %s %s %s %s" % (self.kg['web']['id'], recycle_sql, category_sql, word_sql, audit_sql, published_sql, end_sql, before_sql)
        # limit
        limit = row if self.__page else '%d, %d' % (start, row)
        data = self.db.list(
            table='questionnaire',
            where=where,
            order='update_time DESC',
            page=self.__page,
            limit=limit
        )
        if self.__page and self.__page > self.db.total_page:
            self.__page = self.db.total_page
            data = self.db.list(
                table='questionnaire',
                where=where,
                order='update_time DESC',
                page=self.__page,
                limit=limit
            )
        data = self.data_format(data, date) if data else []  # 数据整形
        return data

    def single(self, questionnaire_id, userid=0, date='%Y-%m-%d %H:%M:%S', frontend=0):  # 编辑问卷资源时被调用
        """
        根据单个id获取数据
        :param questionnaire_id: [int] 要获取数据的ID
        :param date: [str] 日期格式化：
                                %y 两位数的年份表示（00-99）  %Y 四位数的年份表示（000-9999）  %m 月份（01-12）  %d 日，月内中的一天（0-31）
                                %H 24小时制小时数（0-23）  %I 12小时制小时数（01-12）  %M 分钟数（00=59）  %S 秒（00-59）
                                %a 本地简化星期名称  %A 本地完整星期名称 %b 本地简化的月份名称, 英文  %B 本地完整的月份名称, 英文
                                %c 本地相应的日期表示和时间表示  %j 年内的一天（001-366）  %p 本地A.M.或P.M.的等价符  %U 一年中的星期数（00-53）星期天为星期的开始（第n周）
                                %w 星期（0-6），星期天为星期的开始  %W 一年中的星期数（00-53）星期一为星期的开始（第n周）   %x 本地相应的日期表示
                                %X 本地相应的时间表示  %Z 当前时区的名称  %% %号本身
        :param frontend: [int] 为0时不限制条件，为1时限制回收站、审核、发布、发布时间。缺省值0
        :return: [list{}] 返回查询到的单条数据
        """
        # 转换成数值
        questionnaire_id = numeric(questionnaire_id, 0)

        if userid != 0:
            # where
            if frontend:
                where = 'webid=%s && id=%s && kgid=%s && recycle=0 && audit=1' % (self.kg['web']['id'], questionnaire_id, self.kg['user']['id'])
            else:
                where = 'webid=%s && recycle=0 && id=%s && kgid=%s' % (self.kg['web']['id'], questionnaire_id, self.kg['user']['id'])
        else:
            # where
            if frontend:
                where = 'webid=%s && id=%s && recycle=0 && audit=1' % (self.kg['web']['id'], questionnaire_id)
            else:
                where = 'webid=%s && recycle=0 && id=%s' % (self.kg['web']['id'], questionnaire_id)

        # 数据库查询与数据整形
        data = self.db.list(table='questionnaire', where=where, shift=1)
        if data: data = self.data_format(data, date)
        return data

    # **************************************************日期时间格式化处理
    def data_format(self, data, date_format):
        """
        将数据进行整形
        :param data: [list{}] 从数据库查出的数据
        :param date_format: [str] 日期格式化：
                                %y 两位数的年份表示（00-99）  %Y 四位数的年份表示（000-9999）  %m 月份（01-12）  %d 日，月内中的一天（0-31）
                                %H 24小时制小时数（0-23）  %I 12小时制小时数（01-12）  %M 分钟数（00=59）  %S 秒（00-59）
                                %a 本地简化星期名称  %A 本地完整星期名称 %b 本地简化的月份名称, 英文  %B 本地完整的月份名称, 英文
                                %c 本地相应的日期表示和时间表示  %j 年内的一天（001-366）  %p 本地A.M.或P.M.的等价符  %U 一年中的星期数（00-53）星期天为星期的开始（第n周）
                                %w 星期（0-6），星期天为星期的开始  %W 一年中的星期数（00-53）星期一为星期的开始（第n周）   %x 本地相应的日期表示
                                %X 本地相应的时间表示  %Z 当前时区的名称  %% %号本身
        :return: [list{}] 将整形过后的数据返回
        """
        from kyger.utility import json2dict, date, strip_tags, str_cutting, cipher
        from urllib.parse import unquote
        # 获取栏目标题
        category_title = self.db.list(table='category', field='id, title', where='webid=%s' % self.kg['web']['id'])
        res = {}

        for row in category_title:
            res[row['id']] = row
        if isinstance(data, dict):
            # openid处理
            if data['openid']:
                fans = self.db.list(table='wx_fans', where='openid="%s"' % data['openid'], shift=1)
                if fans:
                    address = [fans['country'], fans['province'], fans['city']]
                    data['fans'] = {"status": 0, "name": unquote(fans['nickname']),"image": fans['headimgurl'], 'address': '-'.join(address)}
                else:
                    data['fans'] = {"status": 1, "name": '', "image": '', 'address': ''}
            else:
                data['fans'] = {"status": 2, "name": '', "image": '', 'address': ''}
            # 问卷问题处理
            questions = self.db.list(table='survey_question', where='ques_id=%s' % data['id'], order='sort ASC')
            for question in questions:
                # question['table_header'] = json2dict(question['table_header'])
                question['topic'] = json2dict(question['topic'])
                question['options'] = json2dict(question['options'])
                question['jump_logic'] = json2dict(question['jump_logic'])
                question['show_logic'] = json2dict(question['show_logic'])
                question['jump_logic_json'] = json2dict(question['jump_logic'], trans=False)
                question['show_logic_json'] = json2dict(question['show_logic'], trans=False)
                # question['limit_select'] = json2dict(question['limit_select'])
                # question['limit_long'] = json2dict(question['limit_long'])
                # question['option_num'] = len(question['options'])
                # 级联题
                if question['type'] == 11:
                    deep = 1
                    for j in question['options']['title']:
                        if j['city']:
                            if deep < 2:
                                deep = 2
                            for k in j['city']:
                                if k['area']:
                                    if deep < 3:
                                        deep = 3
                                    for m in k['area']:
                                        if m['town']:
                                            if deep < 4:
                                                deep = 4
                    question['topic']['deep'] = deep
            data['questions'] = questions
            data_type = 'dict'
            data = [data]
        else:
            data_type = 'list'
        for i in data:
            # 简要描述
            i['authority'] = json2dict(i['authority'])
            i['limited_phone'] = json2dict(i['limited_phone'])
            i['limited_email'] = json2dict(i['limited_email'])
            i['summary'] = str_cutting(strip_tags(i['description']), 170)
            i['description'] = str_cutting(i['description'], 256)
            i['addtime'] = date(i['addtime'], date_format)
            i['up_time'] = date(i['update_time'], date_format)
            i['update_time'] = time_check(i['update_time'], int(self.kg['run_start_time'][1]))
            i['start_date'] = date(i['start'], '%Y-%m-%d %H:%M:%S')
            i['end_date'] = date(i['end'], '%Y-%m-%d %H:%M:%S')

            # 栏目列表json转换
            if 'category' in i:
                i['category'] = json2dict(i['category'])
                # 栏目标题和添加
                cid = i['category'][len(i['category']) - 1]
                i['category_title'] = res[cid]['title']

        if data_type == 'dict': data = data[0]
        return data

    def get_survey_question(self, ques_id):
        """
        :param ques_id:[int] 问卷id
        :return 返回问卷的题目结构
        """
        if ques_id:
            data = self.db.list(table='survey_question', field="*", where="ques_id=%d" % numeric(ques_id), order="sort ASC")
            if data:
                for i in data:
                    # i["table_header"] = json2dict(i["table_header"])
                    i["topic"] = json2dict(i["topic"])
                    i["options"] = json2dict(i["options"])
                    i["jump_logic"] = json2dict(i["jump_logic"])
                    i["show_logic"] = json2dict(i["show_logic"])
                    # i["limit_select"] = json2dict(i["limit_select"])
                    # i["limit_long"] = json2dict(i["limit_long"])
                    # 横向填空
                    if i['type'] == 14:
                        a = i['options']['title']['name']
                        lis = a.replace(' ', '').splitlines()
                        for k in range(len(lis)):
                            if lis[k]:
                                lis[k] = lis[k].replace('_', '').split(':')
                        i['options']['title']['name'] = lis
                    # 级联题
                    if i['type'] == 11:
                        deep = 1
                        for j in i['options']['title']:
                            if j['city']:
                                if deep < 2:
                                    deep = 2
                                for k in j['city']:
                                    if k['area']:
                                        if deep < 3:
                                            deep = 3
                                        for m in k['area']:
                                            if m['town']:
                                                if deep < 4:
                                                    deep = 4
                        i['topic']['deep'] = deep
                data = data
            else:
                data = []
        else:
            data = []
        return data
