# -*- coding:utf-8 -*-
"""图集页面"""

from kyger.utility import numeric,date, json2dict, str_cutting, strip_tags
from kyger.db import MySQL


class Picture(object):
    # 构造函数
    __page = 0  # 当前页
    __total_page = 0  # 总页数
    __total_rows = 0  # 总记录数

    def __init__(self, db=None, kg=None):
        # 数据库
        self.db = db if db else MySQL()  # 数据库操作对象
        self.kg = kg  # 全局变量

        # 分页函数
    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 = 9  # 默认9

        # 获取文章数据
        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, action='set_picture',row_list=[3, 9, 36, 72, 144, 288, 576])
        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.db.page, 'total_page': self.db.total_page, 'total_rows': self.db.total_rows}
        }

    def list(self, sort=0, row=9, recom=0, category=0, start=0,  audit=0, word='', comment=0, recycle=1, dateformat='%Y-%m-%d' ):
        """
        :param sort:[int] 排序(字段):0: ID降序,1: ID升序,2: 日期降序,3: 日期升序,4: 游览降序,5: 游览升序,6: 评论数降序,7: 评论数升序, 8: 排序升序,默认值:0
        :param row: [int] 分页时:一页显示多少条数据,不分页时为调用的总记录数:,默认值:9
        :param recom:[int] 是否推荐(字段):0:不推荐,1:推荐,默认值:0
        :param category:[str] 所属栏目(字段):0取所有栏目的数据，非0调用该栏目id的数据对应category表,默认值:0
        :param start:[int] 数据库从多少条数据开始取数据,默认值:0
        :param audit:[int] 是否通过审核(字段):为0时调用所有，1只调用审核的图集，2只调用未审核的图集,默认值:0
        :param word:[str]搜索关键字，和数据库的title字段比较，为空时取所有，其他为要比较的关键字,默认值:''
        :param comment:[int] 是否允许评论(字段):0时调用所有，1只调用允许评论，2只调用不允许评论,默认值:1
        :param recycle:[int] 是否加入回收站,加入则不显示(字段):0时调用所有，1只调用正常，2只调用被回收,默认值:1
        :param dateformat:[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 当前时区的名称  %% %号本身,默认值:'%Y-%m-%d'
        :return:...
        """

        sort_param = {
            0: '`id` DESC',  # ID降序
            1: '`id` ASC',  # ID升序
            2: '`pushtime` DESC',  # 日期降序
            3: '`pushtime` ASC',  # 日期升序
            4: '`click` DESC',  # 游览降序
            5: '`click` ASC',  # 游览升序
            6: '`commenttotal` DESC',  # 评论数降序
            7: '`commenttotal` ASC',  # 评论数升序
            8: '`sort` ASC',  # 排序升序
            9: '`title` like "%%%s%%" DESC, `content` like "%%%s%%" DESC'
        }
        if word: sort = 9  # 如果进行搜索使用标题和内容排序

        # 是否推荐
        if recom == 1:
            recom_sql = '&& recom = 1'  # 推荐
        elif recom == 2:
            recom_sql = '&& recom = 2'  # 不推荐
        else:
            recom_sql = ''  # 取所有

        # 调用栏目数据范围
        if category == 0:
            category_sql = ''  # 取所有
        else:
            category_sql = "&& `category` rlike '[\[|, ]%d[\]|,]'" % category  # 取关键字栏目数据

        # 审核图集
        if audit == 1:
            audit_sql = '&& audit = 1'  # 取审核
        elif audit == 2:
            audit_sql = '&& audit = 0'  # 取未审核
        else:
            audit_sql = ''  # 取所有

        # 关键字比较
        word_sql = "&& (title like '%%%s%%' or content like '%%%s%%')" % (word, word) if word else ''

        # 是否允许评论
        if comment == 1:
            comment_sql = '&& comment = 1'  # 允许
        elif comment == 2:
            comment_sql = '&& comment = 0'  # 不允许
        else:
            comment_sql = ''  # 取所有

        # 是否调用回收站
        if recycle == 1:
            recycle_sql = '&& recycle = 0'  # 是
        elif recycle == 2:
            recycle_sql = '&& recycle = 1'  # 否
        else:
            recycle_sql = ''  # 取所有

        # 查询条件
        where = 'webid=%s %s %s %s %s %s %s' % (self.kg['web']['id'], recom_sql, category_sql, audit_sql, word_sql, comment_sql, recycle_sql)
        limit = row if self.__page else '%s, %s' % (start, row)  # 分页:start:从几开始,row:一页去多少条数据

        data = self.db.list(
            table='picture',  # 表名
            field="*, from_unixtime(`pushtime`, '%Y-%m-%d %H:%i:%s') as `date`",  # 查取的字段
            where=where,  # 条件
            order=sort_param[sort],  # 排序
            page=self.__page,  # 是否分页
            limit=limit   # 一页分别为几条数据
        )
        if self.__page > self.db.total_page:
            self.__page = self.db.total_page
            data = self.db.list(
                table='picture',  # 表名
                field="*, from_unixtime(`pushtime`, '%Y-%m-%d %H:%i:%s') as `date`",  # 查取的字段
                where=where,  # 条件
                order=sort_param[sort],  # 排序
                page=self.__page,  # 是否分页
                limit=limit  # 一页分别为几条数据
            )
        if data:
            self.data_format(data, dateformat)
        return data

    def single(self, picid, date='%Y-%m-%d', frontend=0):
        """
        根据单个id获取数据
        :param articleid: [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{}] 返回查询到的单条数据
        """
        # 转换成数值
        picid = numeric(picid, 0)

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

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

    def data_format(self, data, dateformat):
        if isinstance(data, dict):
            data, data_type = ([data], 'dir')
        else:
            data_type = 'list'
        # 获取栏目名称
        category_title = self.db.list(table='category', field='id, title')
        res = {}
        for row in category_title:
            res[row['id']] = row

        # 获取头像
        admin = self.db.list(table='admin', field='username,image')
        admin_dir = {}
        for row in admin:
            admin_dir[row['username']] = row['image']
        for rows in data:  # 使用for循环读出每一条数据
            rows['cut_title'] = str_cutting(rows['title'], 50)
            rows['description'] = str_cutting(rows['description'], 170)
            rows['addtime'] = date(rows['addtime'], dateformat)   # 获取addtime的时间戳并且格式化
            rows['pushtime'] = date(rows['pushtime'], dateformat)
            rows['picture'] = json2dict(rows['picture'])  # 获取表中的json格式的图片数据并且转为字典类型
            rows['summary'] = json2dict(rows['summary'])
            rows['pictime'] = json2dict(rows['pictime'])
            rows['pic_date'] = []
            for var in rows['pictime']:
                rows['pic_date'].append(date(var, '%Y-%m-%d'))
            rows['link'] = json2dict(rows['link'])
            rows['authority'] = json2dict(rows['authority'])
            rows['image'] = admin_dir.get(rows['publisher'], '/static/image/admin_default_image.png')
            # 栏目标题和添加
            rows['category'] = json2dict(rows['category'])
            cid = rows['category'][len(rows['category']) - 1]
            rows['category_title'] = res[cid]['title']

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


