import flask
from flask import *
import hashlib
import random
import pymysql
import pytz
from datetime import datetime, timedelta
from gevent import pywsgi

app = flask.Flask(__name__)

#DATABASE_FILE = "data.db" # 数据库文件，可根据需要自行更改
@app.route("/generator", methods = ["POST"])  # 激活码生成
def gen():
    machineID = request.args.get('machineID')
    #conn = sqlite3.connect(database = DATABASE_FILE)  # 连接数据库
    conn, cursor = get_conn()
    sql = "SELECT `machineID` FROM gms_id_data WHERE `machineID`='%s'" % machineID  # 查找机器是否已经生成激活码
    cursor.execute(sql)
    num = 0
    for data in cursor.fetchall():
        print(data)
        num += 1
    if (num != 0):
        close_conn(conn, cursor)
        return jsonify({"result": "failed"})  # 已经生成返回[失败]
    else:
        # 未生成进行生成
        rint = random.randint(100000000000000, 999999999999999)  # 选取随机数
        md5 = hashlib.md5(str(rint).encode()).hexdigest()[:16].upper()  # 进行MD5加密，16是截取的长度，可根据需要自行更改
        #sql = "SELECT machineID FROM gms_id_data"
        sql = "INSERT INTO gms_id_data (`machineID`, `key`) VALUES ('%s', '%s')" % (machineID, md5)
        cursor.execute(sql)
        close_conn(conn, cursor)
        return jsonify({"result": "success"})  # 返回[成功]

@app.route("/verify", methods = ["POST"])  # 激活码验证
def verify():
    machineID = request.args.get('machineID')
    key = request.args.get('key')
    conn, cursor = get_conn()
    sql = "SELECT `machineID`,`key` FROM gms_id_data WHERE `machineID` = '%s' and `key` = '%s'" % (machineID, key) # 查询激活码是否正确
    cursor.execute(sql)
    num = 0
    for data in cursor.fetchall():
        num += 1
    close_conn(conn, cursor)
    if (num != 0):
        return jsonify({"result": "success"}) # 成功
    else:
        return jsonify({"result": "failed"}) # 错误

# select * from gms_id_data where `order_no` = '202309070000GMS09';
# 查询指定订单号
@app.route("/order", methods = ["POST"])  # 激活码验证
def verify_order():
    order_no = request.args.get('order_no')
    conn, cursor = get_conn()
    sql = "SELECT * FROM gms_id_data WHERE `order_no` = '%s'" % order_no
    cursor.execute(sql)
    num = 0
    for data in cursor.fetchall():
        num += 1
    close_conn(conn, cursor)
    if (num != 0):
        return jsonify({"result": "success"}) # 成功
    else:
        return jsonify({"result": "failed"}) # 错误

# UPDATE gms_id_data SET `order_no` = '202311030000GMS05'  WHERE `machineID` = '31015A664399933E';
# 更新数据库订单号
@app.route("/update", methods = ["POST"])
def update_order():
    machineID = request.args.get('machineID')
    order_no = request.args.get('order_no')
    conn, cursor = get_conn()
    sql = "UPDATE gms_id_data SET `order_no` = '%s'  WHERE `machineID` = '%s'" % (order_no, machineID)
    cursor.execute(sql)
    close_conn(conn, cursor)
    return jsonify({"result": "success"})

@app.route("/time", methods = ["POST"])  # 激活码验证
def verify_time():
    machineID = request.args.get('machineID')
    conn, cursor = get_conn()
    sql = "SELECT `register_time` FROM gms_id_data WHERE `machineID`='%s'" % machineID  # 查找机器是否已经生成激活码
    cursor.execute(sql)
    # 设置时区为Asia/Shanghai（北京时间所在时区）
    timezone = pytz.timezone('Asia/Shanghai')
    # 获取当前时间
    current_time = datetime.now(timezone)
    print("current_time:", current_time)
    date = cursor.fetchone()
    if date:
        # 取出元组的第一个元素 
        date_str = str(date[0])
        sql = "SELECT `order_no` FROM gms_id_data WHERE `machineID`='%s'" % machineID  # 查找机器是否已经生成激活码
        cursor.execute(sql)
        order_date = cursor.fetchone()
        if order_date:
            # 取出元组的第一个元素 
            order_number = order_date[0]
            if order_number != None:
                future_time = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').replace(tzinfo=timezone) + timedelta(days=10*365)
            else:
                future_time = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S').replace(tzinfo=timezone) + timedelta(days=7)
        print("future_time:", future_time)
        if current_time < future_time:
            close_conn(conn, cursor)
            return jsonify({"result": "success", "future_time": future_time}) # 成功
    close_conn(conn, cursor)
    return jsonify({"result": "failed", "future_time": future_time}) # 错误

def get_conn():
    """
    :return: 连接，游标
    """
    # 创建连接
    conn = pymysql.connect(host="localhost",
                    port=4605,
                    user="root",
                    passwd="7758258753",
                    database="mysql",
                    autocommit=True,
                    charset="utf8mb4")
    # 创建游标
    cursor = conn.cursor()  # 执行完毕返回的结果集默认以元组显示
    return conn, cursor

def close_conn(conn, cursor):
    if cursor:
        cursor.close()
    if conn:
        conn.close()

server = pywsgi.WSGIServer(('127.0.0.1', 5000), app)
server.serve_forever()
