import os
from quart import jsonify, request,flash,redirect,url_for,session
from . import api
from web.common.utils import login_required
from core.DBManager import mDBM
from core.Upload_file import allowed_file,check_file,update_system
from myutils.ConfigManager import myCongif
from myutils.ReManager import mReM
from werkzeug.utils import secure_filename

@api.route('/system/info',methods=['GET'])
@login_required
async def system_info(): #获取系统信息
    strsql = "select * from device;"
    data = mDBM.do_select(strsql,1)
    strRet = ""
    if data:
        strRet = {"ID":data[0],"version":data[1],"dev_ip":data[2],"dev_mask":data[3],"dev_gateway":data[4],
                  "server_ip":data[5],"server_port":data[6]}
    return jsonify(strRet)           #它将Python对象转换为JSON格式的字符串,并将其作为HTTP响应的主体返回给客户端,
    # 同时设置正确的Content-Type响应头,表明响应主体是JSON格式的数据。

@api.route('/system/upload',methods=['POST'])
@login_required
async def system_upload(): #上传系统升级文件
    form = await request.form
    files = await request.files
    if 'file' not in files:
        flash('参数错误')
        return redirect(request.url)
    file = files['file']
    if file.filename == '':
        flash('没有选择文件')
        return redirect(request.url)
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file_path = os.path.join(myCongif.get_data('UPLOAD_FOLDER'), filename)
        await file.save(file_path)
        if check_file(file_path,1):
            session['file'] = file_path
            flash('升级包上传成功')
        else:
            flash('升级包不合法,请重新上传')
        #return redirect(url_for('main.get_html', html='系统管理.html'))
        return redirect(request.url)
    else:
        flash('只允许上传zip文件')
        return redirect(request.url)

@api.route('/system/upgrade',methods=['POST'])
@login_required
async def system_upgrade(): #系统升级
    if 'file' not in session:
        reStatus = 0
        reMsg = "请先上传升级包文件"
    else:
        filepath = session['file']
        if update_system(filepath):
            reStatus = 1
            reMsg = "系统升级成功"
        else:
            reStatus = 0
            reMsg = "系统升级失败"
    return jsonify({'status': reStatus, 'msg': reMsg})

@api.route('/system/netinfo',methods=['GET'])   #获取系统信息 时已经获取,不再处理
@login_required
async def system_net_info(): #获取网络信息
    return jsonify(1)

@api.route('/system/changenet',methods=['POST'])
@login_required
async def system_net_change(): #修改网络信息
    ip = (await request.form)['ip']
    mask = (await request.form)['mask']
    gateway = (await request.form)['gateway']
    #对ip,mask.geteway的合法性进行判断
    if mReM.is_valid_ip(ip) and mReM.is_valid_ip(gateway) and mReM.is_valid_subnet_mask(mask):
        strsql = f"update device set dev_ip='{ip}',dev_mask='{mask}',dev_gateway='{gateway}'"
        if mDBM.do_sql(strsql):
            reStatus = 1
            reMsg = '修改成功,请确认无误后,重启设备!'
        else:
            reStatus = 0
            reMsg = '修改失败,请联系技术支持!'
    else:
        reStatus = 0
        reMsg= '输入的参数不合法,请检查!'
    return jsonify({'status':reStatus,'msg':reMsg})

@api.route('/system/changeserver',methods=['POST'])
@login_required
async def system_server_change(): #修改服务器信息
    ip = (await request.form)['ip']
    port = (await request.form)['port']
    # 对ip,mask.geteway的合法性进行判断
    if mReM.is_valid_ip(ip) and mReM.is_valid_port(port):
        strsql = f"update device set service_ip='{ip}',service_port='{port}';"
        if mDBM.do_sql(strsql):
            reStatus = 1
            reMsg = '修改成功,请确认无误后,重启设备!'
        else:
            reStatus = 0
            reMsg = '修改失败,请联系技术支持!'
    else:
        reStatus = 0
        reMsg = '输入的参数不合法,请检查!'
    return jsonify({'status': reStatus, 'msg': reMsg})