###################################################################
#           Copyright (c) 2016 by TAOS Technologies, Inc.
#                     All rights reserved.
#
#  This file is proprietary and confidential to TAOS Technologies.
#  No part of this file may be reproduced, stored, transmitted,
#  disclosed or used in any form or by any means other than as
#  expressly provided by the written permission from Jianhui Tao
#
###################################################################

# -*- coding: utf-8 -*-

import sys
import subprocess
import random
import math
import numpy as np
import inspect

from util.log import *
from util.cases import *
from util.sql import *
from util.dnodes import *
from requests.auth import HTTPBasicAuth
import requests
import json


class TDTestCase:
    def init(self, conn, logSql):
        tdLog.debug(f"start to execute {__file__}")
        tdSql.init(conn.cursor(), logSql)

    def getBuildPath(self) -> str:
        selfPath = os.path.dirname(os.path.realpath(__file__))
        global cfgPath

        if ("community" in selfPath):
            projPath = selfPath[:selfPath.find("community")]
            cfgPath = projPath + "/community/sim/dnode1/cfg"
        else:
            projPath = selfPath[:selfPath.find("tests")]
            cfgPath = projPath + "/sim/dnode1/cfg"


        for root, dirs, files in os.walk(projPath):
            if ("taosd" in files):
                rootRealPath = os.path.dirname(os.path.realpath(root))
                if ("packaging" not in rootRealPath):
                    buildPath = root[:len(root) - len("/debug/build/bin")]
                    break
        return buildPath

    def getCfgDir(self) -> str:
        selfPath = os.path.dirname(os.path.realpath(__file__))

        if ("community" in selfPath):
            cfgDir = self.getBuildPath() + "/community/sim/dnode1/cfg"
            
        else:
            cfgDir = self.getBuildPath() + "/sim/dnode1/cfg"

        return cfgDir

    def getCfgFile(self) -> str:
        return self.getCfgDir()+"/taos.cfg"

    def rest_query(self,sql,db=''):                                       
        host = '127.0.0.1'
        user = 'root'
        password = 'taosdata'
        port =6041
        if db == '':
            url = "http://{}:{}/rest/sql".format(host, port )
        else:
            url = "http://{}:{}/rest/sql/{}".format(host, port, db )
        try:
            r = requests.post(url, 
                data = 'use db' ,
                auth = HTTPBasicAuth('root', 'taosdata'))  
            r = requests.post(url, 
                data = sql,
                auth = HTTPBasicAuth('root', 'taosdata'))         
        except:
            print("REST API Failure (TODO: more info here)")
            raise
        rj = dict(r.json()['data'])
        return rj
    
    def TS834(self):
        tdLog.printNoPrefix("==========TS-782==========")
        tdSql.prepare()
        buildPath = self.getBuildPath()
        cfgfile = cfgPath + "/taos.cfg"

        tdSql.execute("show variables")
        res_com = tdSql.cursor.fetchall()
        rescomlist = np.array(res_com)
        cpms_index = np.where(rescomlist == "httpDbNameMandatory")
        index_value = np.dstack((cpms_index[0])).squeeze()

        tdSql.query("show variables")
        tdSql.checkData(index_value, 1, 0)

        rj = self.rest_query("show variables")
        if 'httpDbNameMandatory' not in rj:
            tdLog.info('has no httpDbNameMandatory shown')
            tdLog.exit(1)
        if rj['httpDbNameMandatory'] != '0':
            tdLog.info('httpDbNameMandatory data:%s == expect:0'%rj['httpDbNameMandatory'])
            tdLog.exit(1)
        tdLog.info("httpDbNameMandatory by restful query data:%s == expect:0" % (rj['httpDbNameMandatory']))

        tdSql.query("show dnodes")
        index = tdSql.getData(0, 0)
        tdLog.info("restart taosd ")
        tdDnodes.stop(index)
        cmd = f"echo 'httpDbNameMandatory 1' >> {cfgfile} "
        try:
            _ = subprocess.check_output(cmd, shell=True).decode("utf-8")
        except Exception as e:
            raise e

        tdDnodes.start(index)
        tdSql.query("show variables")
        tdSql.checkData(index_value, 1, 1)

        rj = self.rest_query("show variables", 'db')
        if 'httpDbNameMandatory' not in rj:
            tdLog.info('has no httpDbNameMandatory shown')
            tdLog.exit(1)
        val = None
        pname = 'taosadapter' #httpDbNameMandatory doesn't work in taosadapter
        cmd =  'ps -ef|grep %s|grep -v "grep"' % pname
        p = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE)
        if p.wait() == 0:
            val = p.stdout.read()
        if rj['httpDbNameMandatory'] != '1' and pname not in str(val):
            tdLog.info('httpDbNameMandatory data:%s == expect:0'%rj['httpDbNameMandatory'])
            tdLog.exit(1)
        if pname not in str(val):
            tdLog.info("httpDbNameMandatory by restful query data:%s == expect:1" % (rj['httpDbNameMandatory']))

    def run(self):
        
        #TS-834 https://jira.taosdata.com:18080/browse/TS-834
        self.TS834()

    def stop(self):
        tdSql.close()
        tdLog.success(f"{__file__} successfully executed")


tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase())



