# coding: utf-8

# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------

# ---------------------------------------------------------------------------------
# 分页库操作
# ---------------------------------------------------------------------------------


import math
import string


class Page():
    #--------------------------
    # 分页类 - JS回调版
    #--------------------------
    __PREV = '上一页'
    __NEXT = '下一页'
    __START = '首页'
    __END = '尾页'
    __COUNT_START = '共'
    __COUNT_END = '条数据'
    __FO = '从'
    __LINE = '条'
    __LIST_NUM = 4
    SHIFT = None  # 偏移量
    ROW = None  # 每页行数
    __C_PAGE = None  # 当前页
    __COUNT_PAGE = None  # 总页数
    __COUNT_ROW = None  # 总行数
    __URI = None  # URI
    __RTURN_JS = False  # 是否返回JS回调
    __START_NUM = None  # 起始行
    __END_NUM = None  # 结束行
    __ARGS_TPL = ''

    def __init__(self):
        if False:
            self.__PREV = tmp['PREV']
            self.__NEXT = tmp['NEXT']
            self.__START = tmp['START']
            self.__END = tmp['END']
            self.__COUNT_START = tmp['COUNT_START']
            self.__COUNT_END = tmp['COUNT_END']
            self.__FO = tmp['FO']
            self.__LINE = tmp['LINE']

    def getPageNum(self, num):
        return str(num) + self.__ARGS_TPL

    def GetPage(self, pageInfo, limit='1,2,3,4,5,6,7,8'):
        # 取分页信息
        # @param pageInfo 传入分页参数字典
        # @param limit 返回系列
        self.__RTURN_JS = pageInfo['return_js']
        self.__COUNT_ROW = pageInfo['count']

        if 'args_tpl' in pageInfo:
            self.__ARGS_TPL = pageInfo['args_tpl']

        self.ROW = pageInfo['row']
        self.__C_PAGE = self.__GetCpage(pageInfo['p'])
        self.__START_NUM = self.__StartRow()
        self.__END_NUM = self.__EndRow()
        self.__COUNT_PAGE = self.__GetCountPage()
        self.__URI = self.__SetUri(pageInfo['uri'])
        self.SHIFT = self.__START_NUM - 1

        keys = limit.split(',')
        pages = {}
        # 起始页
        pages['1'] = self.__GetStart()
        # 上一页
        pages['2'] = self.__GetPrev()
        # 分页
        pages['3'] = self.__GetPages()
        # 下一页
        pages['4'] = self.__GetNext()
        # 尾页
        pages['5'] = self.__GetEnd()

        # 当前显示页与总页数
        pages['6'] = "<span class='Pnumber'>" + \
            str(self.__C_PAGE) + "/" + \
            str(self.__COUNT_PAGE) + "</span>"

        # 本页显示开始与结束行
        pages['7'] = "<span class='Pline'>" + str(self.__FO) + \
            str(self.__START_NUM) + "-" + \
            str(self.__END_NUM) + str(self.__LINE) + "</span>"
        # 行数
        pages['8'] = "<span class='Pcount'>" + str(self.__COUNT_START) + \
            str(self.__COUNT_ROW) + str(self.__COUNT_END) + "</span>"

        # 构造返回数据
        retuls = '<div>'
        for value in keys:
            retuls += pages[value]
        retuls += '</div>'

        # 返回分页数据
        return retuls

    def __GetEnd(self):
        # 构造尾页
        endStr = ""
        if self.__C_PAGE >= self.__COUNT_PAGE:
            endStr = ''
        else:
            if self.__RTURN_JS == "":
                endStr = "<a class='Pend' href='" + self.__URI + "p=" + \
                    str(self.__COUNT_PAGE) + "'>" + str(self.__END) + "</a>"
            else:
                endStr = "<a class='Pend' onclick='" + self.__RTURN_JS + \
                    "(" + self.getPageNum(self.__COUNT_PAGE) + ")'>" + \
                    str(self.__END) + "</a>"
        return endStr

    def __GetNext(self):
        # 构造下一页
        nextStr = ""
        if self.__C_PAGE >= self.__COUNT_PAGE:
            nextStr = ''
        else:
            if self.__RTURN_JS == "":
                nextStr = "<a class='Pnext' href='" + self.__URI + "p=" + \
                    str(self.__C_PAGE + 1) + "'>" + str(self.__NEXT) + "</a>"
            else:
                nextStr = "<a class='Pnext' onclick='" + self.__RTURN_JS + \
                    "(" +   self.getPageNum(self.__C_PAGE + 1) + ")'>" + \
                    str(self.__NEXT) + "</a>"

        return nextStr

    def __GetPages(self):
        # 构造分页
        pages = ''
        num = 0
        # 当前页之前
        if (self.__COUNT_PAGE - self.__C_PAGE) < self.__LIST_NUM:
            num = self.__LIST_NUM + \
                (self.__LIST_NUM - (self.__COUNT_PAGE - self.__C_PAGE))
        else:
            num = self.__LIST_NUM
        n = 0
        for i in range(num):
            n = num - i
            page = self.__C_PAGE - n
            if page > 0:
                if self.__RTURN_JS == "":
                    pages += "<a class='Pnum' href='" + self.__URI + \
                        "p=" + str(page) + "'>" + str(page) + "</a>"
                else:
                    pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + \
                        "(" + self.getPageNum(page) + ")'>" + str(page) + "</a>"

        # 当前页
        if self.__C_PAGE > 0:
            pages += "<span class='Pcurrent'>" + \
                str(self.__C_PAGE) + "</span>"

        # 当前页之后
        if self.__C_PAGE <= self.__LIST_NUM:
            num = self.__LIST_NUM + (self.__LIST_NUM - self.__C_PAGE) + 1
        else:
            num = self.__LIST_NUM
        for i in range(num):
            if i == 0:
                continue
            page = self.__C_PAGE + i
            if page > self.__COUNT_PAGE:
                break
            if self.__RTURN_JS == "":
                pages += "<a class='Pnum' href='" + self.__URI + \
                    "p=" + str(page) + "'>" + str(page) + "</a>"
            else:
                pages += "<a class='Pnum' onclick='" + self.__RTURN_JS + \
                    "(" + self.getPageNum(page) + ")'>" + str(page) + "</a>"

        return pages

    def __GetPrev(self):
        # 构造上一页
        startStr = ''
        if self.__C_PAGE == 1:
            startStr = ''
        else:
            if self.__RTURN_JS == "":
                startStr = "<a class='Ppren' href='" + self.__URI + "p=" + \
                    str(self.__C_PAGE - 1) + "'>" + str(self.__PREV) + "</a>"
            else:
                startStr = "<a class='Ppren' onclick='" + self.__RTURN_JS + \
                    "(" + self.getPageNum(self.__C_PAGE - 1) + ")'>" + \
                    str(self.__PREV) + "</a>"
        return startStr

    def __GetStart(self):
        # 构造起始分页
        startStr = ''
        if self.__C_PAGE == 1:
            startStr = ''
        else:
            if self.__RTURN_JS == "":
                startStr = "<a class='Pstart' href='" + \
                    self.__URI + "p=1'>" + str(self.__START) + "</a>"
            else:
                startStr = "<a class='Pstart' onclick='" + \
                    self.__RTURN_JS + "("+self.getPageNum(1)+")'>" + str(self.__START) + "</a>"
        return startStr

    def __GetCpage(self, p):
        # 取当前页
        if p:
            return p
        return 1

    def __StartRow(self):
        # 从多少行开始
        return (self.__C_PAGE - 1) * self.ROW + 1

    def __EndRow(self):
        # 从多少行结束
        if self.ROW > self.__COUNT_ROW:
            return self.__COUNT_ROW
        return self.__C_PAGE * self.ROW

    def __GetCountPage(self):
        # 取总页数
        return int(math.ceil(self.__COUNT_ROW / float(self.ROW)))

    def __SetUri(self, sinput):
        # 构造URI
        uri = '?'
        for key in sinput:
            if key == 'p':
                continue
            uri += key + '=' + sinput[key] + '&'
        return str(uri)
