# -*- coding:utf-8 -*-
"""资源下载管理页面"""

from kyger.utility import numeric
from pathlib import Path

class Download(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的数据
        self.__page = numeric(self.kg['get'].get('page', 1), 1)  # 当前页
        if 'row' in kwargs:
            row = kwargs['row']  # 在kwargs里
        elif len(args) > 2:
            row = args[1]  # 在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, sort=0, row=10, recom=0, category=0, start=0, picture=0, word='', audit=0,
             recycle=0, comment=0, date='%Y-%m-%d', field=0):
        """
        获取下载数据
        :param sort: [int] 排序，,0ID降序，1ID升序，2日期降序，3日期升序，4浏览数降序，5浏览数升序，6评论数降序，7评论数升序，8自定义。缺省值0
        :param row: [int] 分页时为每页要显示的数量，不分页时为调用的总记录数。缺省值为 10
        :param recom: [int] 是否推荐，0调用全部，1只调用推荐，2只调用不推荐。缺省值为0
        :param category: [int] 调用栏目id，0调用全部，其他为要调用的栏目id。缺省值0
        :param start: [int] 不分页时，从第几天数据开始调用，分页时无效。缺省值0
        :param picture: [int] 是否调用带有图片的内容，0调用全部，1调用有图片数据，2调用无图数据。缺省值0
        :param word: [str] 搜索的关键字。
        :param audit: [int] 是否调用已审核的内容，0调用全部，1调用审核，2调用未审核。缺省值0
        :param recycle: [int] 是否调用回收站的内容，0调用全部，1调用正常，2调用回收站。缺省值0
        :param comment: [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 当前时区的名称  %% %号本身
        :param field: [int|list] 为0时查询默认字段，为列表时查询列表内包含的字段，例：['id', 'title', 'author']。缺省值0
        :return:{
        }
        """
        # ************************************************************ where条件的处理
        word_sql = "&& (`title` like '%%%s%%' or `content` like '%%%s%%')" % (word, word) if word else ""
        category_sql = "&& `category` rlike '[\[|, ]%d[\]|,]'" % category if category else ""
        # 推荐
        if recom == 1:
            recom_sql = "&& `recom` = 1"  # 推荐
        elif recom == 2:
            recom_sql = "&& `recom` = 0"  # 不推荐
        else:
            recom_sql = ""
        # 图片
        if picture == 1:
            picture_sql = "&& `picture` like '[\"%%\"]'"  # 有图片
        elif picture == 2:
            picture_sql = "&& `picture` like '[]'"  # 无图片
        else:
            picture_sql = ""

        # 审核
        if audit == 1:
            audit_sql = "&& `audit` = 1"  # 通过审核
        elif audit == 2:
            audit_sql = "&& `audit` = 0"  # 未通过审核
        else:
            audit_sql = ""

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

        # 评论
        if comment == 1:
            comment_sql = "&& `comment` = 1"  # 允许评论
        elif comment == 2:
            comment_sql = "&& `comment` = 0"  # 不允许评论
        else:
            comment_sql = ""
        # 拼接where参数                                          已删除   published_sql,
        where = "webid=%s %s %s %s %s %s %s %s" % \
                (self.kg['web']['id'], recycle_sql, category_sql, word_sql, recom_sql, picture_sql, audit_sql,
                 comment_sql)
        # sort
        sort_param = {

            0: '`pushtime` DESC',  # 发布时间降序
            1: '`pushtime` ASC',  # 发布时间升序
            2: '`click` DESC',  # 点击次数降序
            3: '`click` ASC',  # 点击次数升序
            4: '`commenttotal` DESC',  # 评论人数降序
            5: '`commenttotal` ASC',  # 评论人数升序
            6: '`count` DESC',  # 下载次数降序
            7: '`count` ASC',  # 下载次数升序
            8: '`sort` DESC,`pushtime` DESC',  # 按自定义字段降序优先，其次按发布日期降序
            9: '`title` like "%%%s%%" DESC, `content` like "%%%s%%" DESC'
        }
        if word: sort = 9  # 如果进行搜索使用标题和内容排序

        # limit
        limit = row if self.__page else '%d, %d' % (start, row)

        data = self.db.list(
            table='download',
            where=where,
            order=sort_param[sort],
            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='download',
                where=where,
                order=sort_param[sort],
                page=self.__page,
                limit=limit
            )
        data = self.data_format(data, date) if data else []  # 数据整形
        return data

    def single(self, downloadid, date='%Y-%m-%d', frontend=0):  # 编辑下载资源时被调用
        """
        根据单个id获取数据
        :param downloadid: [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{}] 返回查询到的单条数据
        """
        # 转换成数值
        downloadid = numeric(downloadid, 0)

        # where
        if frontend:
            where = 'webid=%s && id=%s && recycle=0 && audit=1 && pushtime < %s' % (self.kg['web']['id'], downloadid, int(self.kg['run_start_time'][1]))
        else:
            where = 'id=%s' % downloadid

        # 数据库查询与数据整形
        data = self.db.list(table='download', 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
        # 获取栏目标题
        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):
            data_type = 'dict'
            data = [data]
        else:
            data_type = 'list'
        for i in data:
            # 简要描述
            i['authority'] = json2dict(i['authority'])
            i['mirror'] = json2dict(i['mirror'])
            i['summary'] = str_cutting(strip_tags(i['content']), 170)
            i['description'] = str_cutting(i['description'], 256)
            i['cut_title'] = str_cutting(i['title'], 60)

            # 图片url json转换
            i['url'] = 'download?id=%s' % i['id']
            if 'picture' in i:
                i['picture'] = json2dict(i['picture'])

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

            # 时间格式显示
            if 'pushtime' in i:
                i['pushtime'] = date(i['pushtime'], format=date_format)
            # 数据权限
            if 'permission' in i:
                i['permission'] = json2dict(i['permission'])

            # 下载链接
            i['down_url'] = ''
            if i['local']:
                file = Path(self.kg['server']['ROOT_PATH'].strip('/') + i['local'])
                if file.is_file():
                    i['down_url'] = cipher(i['local'], 1, 300)  # 加密

            # SEO处理
            if not i['keyword']:
                i['keyword'] = i['tag'] if i['tag'] else i['title']  # 关键字
            i['introduction'] = str_cutting(strip_tags(i['content']), 508) if not i['description'] else i['description'] # seo描述
        if data_type == 'dict': data = data[0]
        return data
