# -*- coding: utf-8 -*-
import time
import json
import random
import logging
import requests
import argparse
import datetime
import re
import utils
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

# 定义 ballid 和 ballname 的映射关系
def get_ballname(ballid):
    # 使用字典来存储映射关系
    ball_mapping = {
        "IB": "bq",
        "XYZ": "some_name"
    }
    return ball_mapping.get(ballid, "unknown")  # 如果没有匹配到，返回 "unknown"

#隊伍API
def sendByApi_all_code(datas):
    datasJson = json.dumps(datas)
    #print datasJson
    url = "https://kay.lsdesign-web.com/get_api.php?json_gtype=ALL_CODE"
    print(utils.httpPost(url, datasJson))

#API
def sendByApi(datas,gtype,rtype):
    datasJson = json.dumps(datas)
    #print datasJson
    url = "https://kay.lsdesign-web.com/get_api.php?json_gtype=%s&json_rtype=%s" % (gtype, rtype)
    print(utils.httpPost(url, datasJson))


def login_and_fetch_data(name, pwd, ballid):
    # 设置 geckodriver 路径
    driver_path = "/usr/local/bin/geckodriver"  # 替换为实际 geckodriver 路径
    browser = webdriver.Firefox(executable_path=driver_path)


    try:
        # 打开登录页面
        browser.get("https://kwin97.net/newapp/index.html")
        wait = WebDriverWait(browser, 30)

        # 输入用户名
        input_account = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[ng-model="inputid"]')))
        input_account.send_keys(name)

        # 输入密码
        input_password = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[ng-model="inputpw"]')))
        input_password.send_keys(pwd)

        # 点击登录按钮
        login_button = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[ng-click="login(inputid, inputpw, cb1)"]'))
        )
        login_button.click()

        # 登录后跳转到目标页面
        wait.until(EC.url_contains("#/"))
        full_url = "https://kwin97.net/newapp/index.html#/{}".format(ballid)
        browser.get(full_url)
        print("Successfully navigated to: {}".format(full_url))

        # 等待页面交互或其他操作完成（可根据具体逻辑调整）
        time.sleep(10)  # 可以用 WebDriverWait 替代

        # 获取 sessionStorage 中的数据
        login_uid = browser.execute_script("return window.sessionStorage.getItem('loginUid');")
        #print "sessionStorage[loginUid]: {}".format(login_uid)
        return login_uid

    except Exception as e:
        print "Error during login or data fetch: {}".format(e)

    finally:
        # 确保浏览器在退出时关闭
        browser.quit()

#抓取隊伍資料
def parse_box_shadows(browser,login_uid):

    data_url = "https://kwin97.net/pub/gateway.php?cmd=181"
    # 构造 POST 数据

    headers = {
        "Accept": "application/json, text/plain, */*",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-TW,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6",
        "Connection": "keep-alive",
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
        "Host": "kwin97.net",
        "Origin": "https://kwin97.net",
        "Referer": "https://kwin97.net/newapp/index.html",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
    }
    post_data = {
        "cmd": '{"cmd":181,"parame":{"uid":"%s","lang":"zh-tw"}}' % login_uid
    }

    try:
        # 发送 POST 请求
        session = requests.Session()
        response = session.post(data_url, data=post_data, headers=headers)

        if response.status_code == 200:

            # 使用 UTF-8 编码输出
            print "POST succecced："
            response_text = response.text
            cleaned_text = re.sub(r'/\*.*?\*/', '', response_text, flags=re.DOTALL)

            #提取有效的 JSON 数据
            json_match = re.search(r'\{.*\}', cleaned_text, re.DOTALL)

            if json_match:
                json_str = json_match.group(0)
                data = json.loads(json_str)
                return data  # 返回解析后的数据
            else:
                print "Not have vaild Json"
        else:
            print "Failed do not have any data"

    except requests.RequestException as e:
        # 使用 UTF-8 编码输出错误信息
        print "Error checked code"
    return data

#抓GAME資料
def parse_box_shadows2(browser,login_uid,gtype,rtype):

    data_url = "https://kwin97.net/pub/gateway.php?cmd=100"

    gtype_mapping = {
        "BK": "BK",
        "WB": "WB",
        "FT": "FT",
        "BL": "BL",
        "IB": "IB",
        "BS": "BS",
        "CB": "CB",
        "JB": "JB",
        "KB": "KB"
    }

    rtype_mapping = {
        "r": "R",
        "hr": "HR",
        "re": "RE"
    }

    gametype = gtype_mapping.get(gtype, "UNKNOWN")  # 如果找不到 gtype，则返回 "UNKNOWN"
    rcentype = rtype_mapping.get(rtype, "UNKNOWN")  # 如果找不到 rtype，则返回 "UNKNOWN"

    if gametype == "UNKNOWN":
        print "unknow gtype：%s" % gtype
        return None

    # 构造 POST 数据
    headers = {
        "Accept": "application/json, text/plain, */*",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-TW,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6",
        "Connection": "keep-alive",
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
        "Host": "kwin97.net",
        "Origin": "https://kwin97.net",
        "Referer": "https://kwin97.net/newapp/index.html",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
    }
    post_data = {
        "cmd": '{"cmd":100,"parame":{"uid":"%s","gtype":"%s","rtype":"%s"}}' % (login_uid, gametype, rcentype)
    }

    data = None

    try:
        # 发送 POST 请求
        session = requests.Session()
        response = session.post(data_url, data=post_data, headers=headers)

        if response.status_code == 200:

            # 使用 UTF-8 编码输出
            print "POST successed："
            response_text = response.text
            cleaned_text = re.sub(r'/\*.*?\*/', '', response_text, flags=re.DOTALL)

            #提取有效的 JSON 数据
            json_match = re.search(r'\{.*\}', cleaned_text, re.DOTALL)

            if json_match:
                json_str = json_match.group(0)
                data = json.loads(json_str)
                return data  # 返回解析后的数据
            else:
                print "not have vaild Json"
        else:
            print "Failed do not have any data"

    except requests.RequestException as e:
        # 使用 UTF-8 编码输出错误信息
        print "Error checked code"
    return data

# 主程序
if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    parser.add_argument("-name", required=True, type=str)
    parser.add_argument("-bid", required=True, type=str)
    parser.add_argument("-pwd", required=True, type=str)
    parser.add_argument("-loops", required=True, type=int)
    args = parser.parse_args()

    ballid = args.bid
    name = args.name
    pwd = args.pwd
    loop_time = args.loops
    ballname = get_ballname(ballid)

    driver_path = "/usr/local/bin/geckodriver"  # 替换为实际 geckodriver 路径
    browser = webdriver.Firefox()

    try:
        # 登录并导航到目标页面
        login_uid = login_and_fetch_data(name, pwd, ballid)

        while True:  # 无限循环抓取数据
            print "Start Loops..."

            #抓取隊伍資料
            #matches = parse_box_shadows(browser,login_uid)
            #if matches:
                #json_data = json.dumps(matches, ensure_ascii=True, indent=4)
                #print json_data  # 打印 JSON 数据
                #在这里调用一次 sendByApi
                #sendByApi_all_code(matches)
                #print "Getting teams data successed"
                #time.sleep(5)


            #對照表
            #gtypes = ["BK", "WB", "FT", "BL", "IB", "BS", "CB", "JB", "KB"]
            #rtypes = ["r", "hr", "re"]

            #跑FT_BL_IB
            gtypes = ["BS", "CB", "JB", "KB"]
            rtypes = ["r", "hr"]


            # 遍历所有 GTYPE 和 RTYPE 组合
            for gtype in gtypes:
                for rtype in rtypes:
                    print "Getting GTYPE: %s, RTYPE: %s data..." % (gtype, rtype)
                    matches = parse_box_shadows2(browser, login_uid, gtype, rtype)

                    if matches:
                        json_data = json.dumps(matches, ensure_ascii=True, indent=4)

                        sendByApi(matches, gtype, rtype)
                        print "GTYPE: %s, RTYPE: %s data getting successfuly" % (gtype, rtype)
                        time.sleep(5)  # 等待 5 秒

            print "wait{}seconds to renew loops...".format(loop_time)
            time.sleep(loop_time)  # 等待 loop_time 秒


    except KeyboardInterrupt:
        print "Program terminated by user."

    except Exception as e:
        print "Unexpected error: {}".format(e)

    finally:
        browser.quit()