import class_mysql
import os , sys
import time
from flask import Flask, request, abort
import configparser
import requests
import logging
import json

import warnings

from linebot import (
    LineBotApi, WebhookHandler, LineBotSdkDeprecatedIn30
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    FlexSendMessage,
    MessageEvent,
    FollowEvent,    
    TextMessage, 
    TextSendMessage, 
    TemplateSendMessage, 
    ButtonsTemplate,
    ConfirmTemplate,    
    MessageTemplateAction,
    URITemplateAction,
    PostbackEvent,
    PostbackTemplateAction
)

#移除LineBotSdkDeprecatedIn30
warnings.filterwarnings("ignore", category=LineBotSdkDeprecatedIn30)

config = configparser.ConfigParser()
config.read('config.ini')

#set mysql connect
line_mysql = class_mysql.GC_MYSQL()
line_mysql.setConnectInfo( 
    config.get('mysql', 'host'), 
    config.get('mysql', 'username'), 
    config.get('mysql', 'password'), 
    config.get('mysql', 'table') 
)
line_mysql.connect()

app = Flask(__name__)


#設定log
app.logger.setLevel(logging.INFO)

 
now_game_id = ''
tmp = ''
banker_id = '';
banker_money = '0';
banker_name = '0';
banker_time = False; 
select_game_time = False;
dismiss_game = False;
banker_fee = 300;


#line-bot channel_access_token / channel_secret
line_bot_api = LineBotApi(config.get('line-bot', 'channel_access_token'))
handler = WebhookHandler(config.get('line-bot', 'channel_secret'))

#game API url
api_web_url = config.get('game_api', 'api_web_url');
online_url = api_web_url + "gameTianjiu/online";
newgame_url = api_web_url + "gameTianjiu/new";
setStatus_url = api_web_url + 'gameTianjiu/setStatus';
bankerBet_url = api_web_url + 'gameTianjiu/bankerBet';
bet_url = api_web_url + 'gameTianjiu/bet';  
game_result_url = api_web_url + 'gameTianjiu/setResult';
tip_url = api_web_url + 'gameTianjiu/tip';
setLineToken_url = api_web_url + 'member/setLineToken';
revokeLineToken_url = api_web_url + 'member/revokeLineToken';
setCounter_url = api_web_url + 'gameTianjiu/setCounter';
dismiss_url = api_web_url + 'gameTianjiu/dismiss';
revokeBet_url = api_web_url  + 'gameTianjiu/revokeBet';

request_token = config.get('request_token', 'token');
request_header = {
    'token': request_token
}
#--------------重啟程式時抓目前遊戲資訊--------------

        
#--------------------------------------------------  
  
# 此為 Webhook callback endpoint
@app.route("/linebot", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
    
    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'

    
# decorator 負責判斷 event 為 MessageEvent 實例，event.message 為 TextMessage 實例。所以此為處理 TextMessage 的 handler
@handler.add( MessageEvent, message = TextMessage )
def handle_message(event):
    global banker_fee,request_header,dismiss_game,banker_time,banker_name,tmp,now_game_id,select_game_time,banker_id,banker_money,game_result_url,tip_url,online_url,newgame_url,setStatus_url,bankerBet_url,bet_url,setCounter_url,dismiss_url,revokeBet_url,online_url
    try:
        
        user_id = event.source.user_id
        
        #確認訊息從哪發出來(個人/群組)
        soure_type = event.source.type
        
        user_msg = event.message.text
        user_msg = user_msg.replace(" ", "").replace("\n", "");
        #要加機器人好友才能獲得帳號資訊
        profile = line_bot_api.get_profile( event.source.user_id )
        reply = True;
        reply_msg = '';
        if( soure_type == 'group' ):
            o_data = requests.get( url = online_url , headers = request_header )
            gdata = o_data.json()
            r_status = o_data.status_code;
            if( r_status == 401 ):
                raise Exception( '401 error' )
            
            app.logger.info(gdata)
            if( gdata['success'] and str(gdata['gameInfo']) != 'None' ):
                tmp = gdata['gameInfo']['status']
                now_game_id = gdata['gameInfo']['gameId']
                seq  = gdata['gameInfo']['seq']
                if( str(gdata['gameInfo']['banker']) != 'None' ):
                    banker_id = line_mysql.get_banker_lineToken( str(gdata['gameInfo']['banker']) );
                    if not banker_id:
                        banker_id = '0'
                    banker_money = int(gdata['gameInfo']['bankerBet']) + banker_fee
                else:
                    seq  = gdata['gameInfo']['seq']
                    date = gdata['gameInfo']['date']
                    if( int(seq) % 2 == 0 ):
                        banker_time = True;
                        if( banker_id == '' ):
                            banker_id = line_mysql.get_first_round_banker( int(seq) - 1, date );
                            if not banker_id:
                                banker_id = ''
                            fist_game_id = line_mysql.get_fist_game_id( int(seq) - 1, date );
                            banker_money = line_mysql.get_game_meta( fist_game_id, 'bankerBet' )
                            if not banker_money or banker_money == 'None':
                                banker_money = '0'
                            banker_money = int(banker_money) + banker_fee 

            reply_title = ''
            reply = False
            reply_flex_msg = {}
            reply_flex_msg['type'] = 'bubble'
            reply_flex_msg['body'] = {}
            
            reply_flex_msg['body']['type'] = 'box'
            reply_flex_msg['body']['layout'] = 'vertical'
            reply_flex_msg['body']['contents'] = []
            
            name = line_mysql.get_member_meta( user_id, 'name' )
        
            memberId = line_mysql.get_member_meta( user_id, 'memberId' )
            if( banker_id != '' or banker_id != '0' ):
                banker_name = line_mysql.get_member_meta( banker_id, 'name' )
                if not banker_name:
                    banker_name = '0'
                    
            if( line_mysql.check_game_manager(user_id) ):
                
                if( user_msg == '開始遊戲' ):
                    reply_title = '開始遊戲'
                    #開始遊戲
                    
                    online_data = requests.get(url = online_url , headers = request_header)
                    data = online_data.json()
                    if( str(data['gameInfo']) == 'None' ):
                        requests.post(url = newgame_url , headers = request_header);
                        online_data = requests.get(url = online_url , headers = request_header)
                        data = online_data.json()
                        
                    game_id = data['gameInfo']['gameId']

                    if( game_id ):  
                        
                        if( data['gameInfo']['status'] == 'begin' ): 
                            now_game_id = game_id;
                            tmp = 'begin'
                            date = data['gameInfo']['date'] 
                            seq  = data['gameInfo']['seq']
                            
                            game_no = "局號 | " + str(date) + '#' + "{:03d}".format(seq)
                            
                            if( int(seq) % 2 == 0 ):
                                if( banker_id == '' ):
                                    banker_id = line_mysql.get_first_round_banker( int(seq) - 1, date );
                                    if not banker_id:
                                        banker_id = '0'
                                    fist_game_id = line_mysql.get_fist_game_id( int(seq) - 1, date );
                                    banker_money = line_mysql.get_game_meta( fist_game_id, 'bankerBet' )
                                    if not banker_money or banker_money == 'None':
                                        banker_money = '0'
                                    banker_money = int(banker_money) + banker_fee 
                                    
                                game_no += '-下巡';
                                banker_time = True;
                            else:
                                banker_name = '0';
                                banker_money = '0';
                                banker_id = '';
                                game_no += '-上巡';
                                banker_time = False; 
                                
                            have_bet = False;
                            
                            if dismiss_game:
                                banker_name = '0';
                                banker_money = '0';
                                banker_id = '';
                                banker_time = False; 
                                dismiss_game = False;
                            add_flex_text_msg( reply_flex_msg['body']['contents'], "🎲遊戲開始🎲", 'md', 'md', 'center' );
                            add_flex_text_msg( reply_flex_msg['body']['contents'], game_no, 'sm', 'sm', 'center' );
                           
                            
                        else:
                            add_flex_text_msg( reply_flex_msg['body']['contents'], "❗️遊戲進行中", 'sm', 'md', 'center' );
                              
                    else:
                        add_flex_text_msg( reply_flex_msg['body']['contents'], "❗️無開局遊戲", 'sm', 'md', 'center' );
                        
                else:
                    if( now_game_id != '' ):
                        if( user_msg == '開始搶莊' and tmp == 'begin' ):
                            reply_title = '開始搶莊'
                            Pdata = {
                                'gameId': now_game_id,
                                'nextStatus': 'getBanker'
                            }
                            tmp = 'getBanker'
                            requests.post( setStatus_url, Pdata , headers = request_header);
                            if( banker_time and banker_id != '0' ):
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '[' + str(banker_name) + ']為莊', 'sm', 'md' );
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '請莊家輸入金額', 'sm', 'md' );
                                
                            else:
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '📍開始搶莊', 'sm', 'md' );
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '搶莊金額需高於10000(含)', 'sm', 'md' );
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '開始搶莊 15秒', 'sm', 'md' );
                                
                                banker_id = ''
                                banker_time = False; 
                                
                            Pdata = {
                                'second': '15'
                            }
                            requests.post( setCounter_url, Pdata , headers = request_header);
                            
                            
                        if( user_msg == '結束搶莊' and tmp == 'getBanker' ):
                            reply_title = '結束搶莊'
                            benker_ok = True
                            #如果莊家沒回應 照上局的金額
                            if( banker_time ):
                                banker_remaining = line_mysql.get_member_remaining( banker_id )
                                if( int(banker_money) > int(banker_remaining) or int(banker_remaining) < 10000 ):
                                    dismiss = requests.post( dismiss_url , headers = request_header);
                                    dismiss = dismiss.json()
                                    if( dismiss['success'] ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️莊家餘額不足❗️', 'sm', 'md' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '此局遊戲放棄', 'sm', 'md' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '請重新開始遊戲', 'sm', 'md' );
                                        tmp = ''
                                        benker_ok = False
                                        
                                else:
                                    is_banker = line_mysql.is_banker( now_game_id, banker_id );
                                    memberId = line_mysql.get_member_meta( banker_id, 'memberId' )
                                    if not is_banker:
                                        Pdata = {
                                            'gameId': now_game_id,
                                            'bet': banker_money,
                                            'banker': memberId
                                        }
                                        s_banker = requests.post( bankerBet_url, Pdata , headers = request_header);
                                        s_banker = s_banker.json()
                                        
                                banker_time = False;
                            elif( banker_id == '' ):
                                banker_id = '0'
                                banker_name = '0'
                                banker_money = '0'
                            
                            if( benker_ok ):
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '[' + str(banker_name) + ']為莊', 'sm', 'md' );
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '倒數10秒, 莊家請指定本局開牌', 'sm', 'md' );
                                reply_flex_msg['body']['contents'].append({
                                    "type": "button",
                                    "action": {
                                      "type": "message",
                                      "label": "1.左開",
                                      "text": "1"
                                    },
                                    "margin": "sm",
                                    "style": "secondary",
                                    "height": "sm"
                                })
                                reply_flex_msg['body']['contents'].append({
                                    "type": "button",
                                    "action": {
                                      "type": "message",
                                      "label": "2.右開",
                                      "text": "2"
                                    },
                                    "margin": "sm",
                                    "style": "secondary",
                                    "height": "sm"
                                })
                                reply_flex_msg['body']['contents'].append({
                                    "type": "button",
                                    "action": {
                                      "type": "message",
                                      "label": "3.平開",
                                      "text": "3"
                                    },
                                    "margin": "sm",
                                    "style": "secondary",
                                    "height": "sm"
                                })
                                reply_flex_msg['body']['contents'].append({
                                    "type": "button",
                                    "action": {
                                      "type": "message",
                                      "label": "4.螃蟹開",
                                      "text": "4"
                                    },
                                    "margin": "sm",
                                    "style": "secondary",
                                    "height": "sm"
                                })
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '📌10秒若無回復, 一律平開', 'sm', 'md' );
                                
                                select_game_time = True;
                                Pdata = {
                                    'second': '10'
                                }
                                requests.post( setCounter_url, Pdata , headers = request_header);
                            
                            
                        if( user_msg == '開始下注' and tmp == 'getBanker' ):
                            reply_title = '開始下注'
                            select_game_time = False;
                            Pdata = {
                                'gameId': now_game_id,
                                'nextStatus': 'startBet'
                            }
                            tmp = 'startBet'
                            requests.post( setStatus_url, Pdata , headers = request_header);
                            banker_bmoney = int(banker_money) - banker_fee;
                            if( banker_bmoney < 0 ):
                                banker_bmoney = 0
                            
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '[' + str(banker_name) + ']為莊[' + '%.1f' % (banker_bmoney) + ']', 'sm', 'md' );
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '開始下注：🎲開始收單🎲', 'sm', 'md' );
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '開始下注 30秒', 'sm', 'md' );
                            
                            Pdata = {
                                'second': '30'
                            }
                            requests.post( setCounter_url, Pdata , headers = request_header);
                            
                            
                        if( user_msg == '停止下注' ):
                            reply_title = '停止下注'
                            Pdata = {
                                'gameId': now_game_id,
                                'nextStatus': 'stopBet'
                            }
                            tmp = 'stopBet'
                            requests.post( setStatus_url, Pdata , headers = request_header);
                            begin_game_info = line_mysql.get_begin_game_info( now_game_id );
                            reply_flex_msg = begin_game_info;
                            
                            
                        if( user_msg[:4] == '提交結果' and len(user_msg) == 10 ):
                            reply_title = '提交結果'
                            #API 提交結果 成功後讀取結果
                            if( tmp == 'stopBet' ):
                                user_msg = user_msg.upper();
                                resulta = is_win_lose_draw( user_msg[5] );
                                resultb = is_win_lose_draw( user_msg[7] );
                                resultc = is_win_lose_draw( user_msg[9] );
                                if( resulta and resultb and resultc ):
                                    Pdata = {
                                        'gameId': now_game_id,
                                        "result{}".format(user_msg[4]): resulta,
                                        "result{}".format(user_msg[6]): resultb,
                                        "result{}".format(user_msg[8]): resultc
                                    }
                                    game_result = requests.post( game_result_url, Pdata , headers = request_header);
                                    game_result = game_result.json()
                                    if( game_result['success'] ):
                                        game_end_result = line_mysql.get_game_result( now_game_id );
                                        if( game_end_result ):
                                            reply_flex_msg = game_end_result
                                            Pdata = {
                                                'gameId': now_game_id,
                                                'nextStatus': 'end'
                                            }
                                            tmp = ''
                                            requests.post( setStatus_url, Pdata , headers = request_header);
                                            now_game_id = ''
                                            tmp = 'end'
                                            
                                    else:
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '❌提交結果失敗', 'sm', 'md', 'center' );
                                        
                                else:
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️結果輸入錯誤', 'sm', 'md', 'center' );
                                    
                    else:
                        if( user_msg == '開始搶莊' or user_msg == '結束搶莊' or user_msg == '開始下注' or user_msg == '停止下注' or user_msg[:4] == '提交結果' ):
                            reply_title = '目前無開局遊戲'
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️目前無開局遊戲❗', 'sm', 'md', 'center' );
                            
                    if( user_msg[:4] == '更新結果' and len(user_msg) == 24 ):
                        reply_title = '更新結果'
                        #API 更新結果 成功後讀取結果
                        update_game_date = user_msg[4:14]
                        update_game_seq = user_msg[15:18]
                        update_game_id = line_mysql.get_game_id_by_date_seq( update_game_date, update_game_seq )
                        if( update_game_id ):
                            user_msg = user_msg.upper();
                            resulta = is_win_lose_draw( user_msg[19] );
                            resultb = is_win_lose_draw( user_msg[21] );
                            resultc = is_win_lose_draw( user_msg[23] );
                            is_end_result = line_mysql.get_game_meta( update_game_id, 'resultA' );
                            if( resulta and resultb and resultc and is_end_result ):
                                Pdata = {
                                    'gameId': update_game_id,
                                    "result{}".format(user_msg[18]): resulta,
                                    "result{}".format(user_msg[20]): resultb,
                                    "result{}".format(user_msg[22]): resultc
                                }
                                game_result = requests.post( game_result_url, Pdata , headers = request_header);
                                game_result = game_result.json()
                                if( game_result['success'] ):
                                    game_update_result = line_mysql.get_game_result( update_game_id );
                                    if( game_update_result ):
                                        reply_flex_msg = game_update_result
                                        
                                    del game_update_result
                                else:
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '❌更新結果失敗', 'sm', 'md', 'center' );
                                    
                            else:
                                if( is_end_result == False ):
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️該局遊戲沒有提交結果', 'sm', 'md', 'center' );
                                    
                                else:
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️結果輸入錯誤', 'sm', 'md', 'center' );
                                    
                        else:
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️無此局遊戲', 'sm', 'md', 'center' );
                         
                        del update_game_id
                        del update_game_seq
                        del update_game_date

                    
                    if( user_msg == '放棄本局' ):
                        reply_title = '放棄本局'
                        dismiss = requests.post( dismiss_url , headers = request_header);
                        dismiss = dismiss.json()
                        if( dismiss['success'] ):
                            if not dismiss_game:
                                dismiss_game = True;
                            now_game_id = '';
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️本局遊戲放棄❗️', 'sm', 'md', 'center' );
                            
                        else:
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '❌遊戲放棄失敗', 'sm', 'md', 'center' );
                            
                        del dismiss
                
                
            else:
                if( user_msg[:2] == '打賞' ):
                    tip = user_msg[2:]
                    if( tip.isdigit() ):
                        is_bind = line_mysql.check_bind( user_id );
                        if( is_bind == True ):
                            remaining = line_mysql.get_member_meta( user_id, 'remaining' );
                            if( int(tip) <= remaining ):
                                Pdata = {
                                    'tip': tip,
                                    'memberId': str(memberId)
                                }
                                user_tip_msg = requests.post( tip_url, Pdata , headers = request_header );
                                user_tip_msg = user_tip_msg.json()
                                if( user_tip_msg['success'] ):
                                    reply_title = name + ' 打賞成功'
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '打賞 | ' + tip + ' ⭕️打賞成功', 'sm', 'sm', 'center' );
                                    
                                else:
                                    reply_title = name + ' 打賞失敗'
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '❌打賞失敗❌', 'sm', 'md', 'center' );
                                    
                                    if( str(user_tip_msg['message']) != 'None' ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], user_tip_msg['message'], 'sm', 'sm', 'center' );
                                        
                                    
                                del user_tip_msg
                            else:
                                reply_title = name + ' 打賞失敗'
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '🚫餘額不足🚫', 'md', 'md', 'center' );
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '打賞失敗', 'sm', 'sm', 'center' );
                                
                                
                        elif( is_bind == 'error' ):
                            reply_title = '發生錯誤'
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '發生錯誤', 'sm', 'md', 'center' );
                            
                            
                        else:
                            reply_title = profile.display_name + ' 操作失敗'
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + profile.display_name, 'sm', 'md', 'center' );
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '❌操作失敗❌', 'sm', 'md', 'center' );
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '您還未綁定帳號', 'sm', 'sm', 'center' );
                            
                
                elif( tmp != 'startBet' and tmp != 'getBanker'  ):
                    user_msg = user_msg.upper()
                    if( user_msg == '取消下注' or user_msg[0] == '莊' or user_msg[0] == 'A' or user_msg[0] == 'B' or user_msg[0] == 'C' ):
                        bet_num = user_msg[1:]
                        if( bet_num.isdigit() or user_msg == '取消下注' ):
                            reply_title = '❗️目前不是下注階段❗'
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️目前不是下注階段❗', 'sm', 'md', 'center' );
                            
                            
                else:
                    if( tmp == 'getBanker' ):
                        if( banker_id == '' ):
                            banker_msg = is_banker_msg( user_id, user_msg );
                            if( banker_msg == True ):
                                banker_id = '0';
                                Pdata = {
                                    'gameId': now_game_id,
                                    'bet': user_msg[1:],
                                    'banker': memberId
                                }
                                s_banker = requests.post( bankerBet_url, Pdata , headers = request_header);
                                s_banker = s_banker.json()
                               
                                if( s_banker['success'] ):
                                    reply_title = name + '搶莊成功'
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '莊 | ' + user_msg[1:] + ' ⭕️下注成功', 'sm', 'sm', 'center' );
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '扣除上莊費' + str(banker_fee), 'sm', 'sm', 'center' );
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '您的有效注單為:' + '%d' % ( int(user_msg[1:]) - banker_fee ), 'sm', 'sm', 'center' );
                                    
                                    banker_id = user_id;
                                    banker_money = int(user_msg[1:]);
                                else:
                                    reply_title = name + '搶莊失敗'
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '❌下注失敗❌', 'sm', 'md', 'center' );
                                    if( str(s_banker['message']) != 'None' ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], s_banker['message'], 'sm', 'sm', 'center' );
                                    
                                
                            else:
                                if not name:
                                    name = profile.display_name
                                    
                                if( banker_msg != '' ):    
                                    reply_title = name + ' 搶莊失敗'
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                   
                                
                                    if( banker_msg == 'input_error' ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '❌下注失敗❌', 'sm', 'md', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '輸入錯誤', 'sm', 'sm', 'center' );
                                        
                                    if( banker_msg == 'no_user' ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '❌操作失敗❌', 'sm', 'md', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '您還未綁定帳號', 'sm', 'sm', 'center' );
                                    if( banker_msg == 'bet_n_enough' ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '❌下注失敗❌', 'sm', 'md', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '搶莊金額需高於10000(含)', 'sm', 'sm', 'center' );
                                       
                                    if( banker_msg == 'remaining_n_enough' ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '🚫餘額不足🚫', 'sm', 'md', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '請洽上級代理', 'sm', 'sm', 'center' );
                                        
                        else:
                            user_msg = user_msg.upper()
                            if( user_msg[0] == 'A' or user_msg[0] == 'B' or user_msg[0] == 'C' ):
                                if( user_msg[1:].isdigit() ):
                                    reply_title = '❗️不是目前下注階段❗'
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️不是目前下注階段❗', 'sm', 'md', 'center' );
                                   
                            
                            if( user_msg[0] == '莊' and user_id != banker_id and not banker_time ): 
                                if( user_msg[1:].isdigit() ):
                                    reply_title = '❗️無法下注'
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️搶莊已結束❗', 'sm', 'md', 'center' );
                                    
                                
                            if( select_game_time and user_id == banker_id ):
                                sw_open = ''
                                if( user_msg == '1' ):
                                    sw_open = '1.左開'
                                    select_game_time = False 
                                elif( user_msg == '2' ):
                                    sw_open = '2.右開'
                                    select_game_time = False 
                                elif( user_msg == '3' ):
                                    sw_open = '3.平開'
                                    select_game_time = False 
                                elif( user_msg == '4' ):
                                    sw_open = '4.螃蟹開'
                                    select_game_time = False 
                                else:
                                    sw_open = '❌輸入錯誤'
                                reply_title = name + ' ' + sw_open
                                add_flex_text_msg( reply_flex_msg['body']['contents'], sw_open, 'sm', 'md', 'center' );
                                
                                
                            if( banker_time and user_id == banker_id ):
                                banker_msg = is_banker_msg( user_id, user_msg );
                                if( banker_msg == True ):
                                    Pdata = {
                                        'gameId': now_game_id,
                                        'bet': user_msg[1:],
                                        'banker': str(memberId)
                                    }
                                    s_banker = requests.post( bankerBet_url, Pdata , headers = request_header );
                                    s_banker = s_banker.json()
                                    if( s_banker['success'] ):
                                        reply_title = name + ' 搶莊成功'
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '莊 | ' + user_msg[1:] + ' ⭕️下注成功', 'sm', 'sm', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '扣除上莊費' + str(banker_fee), 'sm', 'sm', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '您的有效注單為:' + '%d' % ( int(user_msg[1:]) - banker_fee ), 'sm', 'sm', 'center' );
                                        
                                        banker_id = user_id;
                                        banker_money = int(user_msg[1:]);
                                        banker_time = False;
                                    else:
                                        reply_title = name + ' 搶莊失敗'
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                        
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '❌下注失敗❌', 'sm', 'md', 'center' );
                                        if( str(s_banker['message']) != 'None' ):
                                            add_flex_text_msg( reply_flex_msg['body']['contents'], s_banker['message'], 'sm', 'sm', 'center' );
                                        
                                else:
                                    if not name:
                                        name = profile.display_name
                                    
                                    if( banker_msg != '' ): 
                                        reply_title = name + ' 搶莊失敗'
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                        
                                    
                                        if( banker_msg == 'input_error' ):
                                            add_flex_text_msg( reply_flex_msg['body']['contents'], '❌下注失敗❌', 'sm', 'md', 'center' );
                                            add_flex_text_msg( reply_flex_msg['body']['contents'], '輸入錯誤', 'sm', 'sm', 'center' );
                                            
                                        if( banker_msg == 'no_user' ):
                                            add_flex_text_msg( reply_flex_msg['body']['contents'], '❌操作失敗❌', 'sm', 'md', 'center' );
                                            add_flex_text_msg( reply_flex_msg['body']['contents'], '您還未綁定帳號', 'sm', 'sm', 'center' );
                                        if( banker_msg == 'bet_n_enough' ):
                                            add_flex_text_msg( reply_flex_msg['body']['contents'], '❌下注失敗❌', 'sm', 'md', 'center' );
                                            add_flex_text_msg( reply_flex_msg['body']['contents'], '搶莊金額需高於10000(含)', 'sm', 'sm', 'center' );
                                           
                                        if( banker_msg == 'remaining_n_enough' ):
                                            add_flex_text_msg( reply_flex_msg['body']['contents'], '🚫餘額不足🚫', 'sm', 'md', 'center' );
                                            add_flex_text_msg( reply_flex_msg['body']['contents'], '請洽上級代理', 'sm', 'sm', 'center' );
                    
                    
                    if( tmp == 'startBet' ):
                        if( user_msg == '取消下注' ):
                            
                            Pdata = {
                                'gameId': now_game_id,
                                'memberId': str(memberId)
                            }
                            revokeBet_msg = requests.post( revokeBet_url, Pdata , headers = request_header );
                            revokeBet_msg = revokeBet_msg.json()
                            add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                            if( revokeBet_msg['success'] ):
                                reply_title = name + ' 取消下注成功'
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '⭕️取消下注成功', 'sm', 'md', 'center' );
                                
                            else:
                                reply_title = name + ' 取消下注失敗'
                                add_flex_text_msg( reply_flex_msg['body']['contents'], '❌取消下注失敗❌', 'sm', 'md', 'center' );
                                if( str(revokeBet_msg['message']) != 'None' ):
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], revokeBet_msg['message'], 'sm', 'sm', 'center' );
                                
                                
                            
                            
                        
                        else:
                            is_banker = line_mysql.is_banker( now_game_id, user_id );
                            bet_stsus = is_bettable( now_game_id, user_id, user_msg );
                            if( bet_stsus == True and not is_banker ):
                                
                                if( line_mysql.is_full_bet( now_game_id ) ):
                                    reply_title = '❗️額度已滿❗️'
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '❗️額度已滿-目前無法下注❗️', 'sm', 'sm', 'center' );
                                    
                                else:
                                    #判斷金額是否超過
                                    user_msg = user_msg.upper();
                                    betOn = user_msg[0]
                                    bet = user_msg[1:]
                                    bet_total = line_mysql.get_bet_total( now_game_id );
                                    bankerBet = line_mysql.get_game_meta( now_game_id, 'bankerBet' );
                                    can_bet_total = int(bankerBet) - int(bet_total);
                                    bankerBet = int(bankerBet) + banker_fee
                                    max_total = int(bankerBet)//10
                                   
                                    bet_msg = []
                                    add_flex_text_msg( bet_msg, '🔹' + name, 'sm', 'md', 'center' );
                                    
                                    bet_status = 'a';
                                    
                                    
                                    
                                    if( int(bet) > max_total ):
                                        bet_status = 'b';
                                        bet = max_total;
                                        
                                    if( int(bet) >= can_bet_total ):
                                        bet_status = 'c';
                                        bet = can_bet_total;
                                     
                                    if( bet_status == 'a' ): 
                                        add_flex_text_msg( bet_msg, betOn + ' | ' + str(bet) + ' ⭕️下注成功', 'sm', 'md', 'center' );
                                        
                                    elif( bet_status == 'b' ):
                                        add_flex_text_msg( bet_msg, betOn + ' | ' + str(bet) + ' ⭕️下注成功', 'sm', 'md', 'center' );
                                        add_flex_text_msg( bet_msg, '超過莊家下注10%❗️', 'sm', 'sm', 'center' );
                                        add_flex_text_msg( bet_msg, '您的注單上限為:' + str(bet), 'sm', 'sm', 'center' );
                                        
                                    elif( bet_status == 'c' ):
                                        add_flex_text_msg( bet_msg, betOn + ' | ' + str(bet) + ' ⭕️下注成功', 'sm', 'md', 'center' );
                                        add_flex_text_msg( bet_msg, '莊家額度已滿❗️', 'sm', 'sm', 'center' );
                                        add_flex_text_msg( bet_msg, '您的有效注單為:' + str(bet), 'sm', 'sm', 'center' );
                                    
                                    Pdata = {
                                        'gameId': now_game_id,
                                        'bet': bet,
                                        'betOn': betOn,
                                        'memberId': str(memberId)
                                    }
                                    user_bet_msg = requests.post( bet_url, Pdata , headers = request_header );
                                    user_bet_msg = user_bet_msg.json()
                                    if( user_bet_msg['success'] ):
                                        reply_title = name + ' 下注成功'
                                        reply_flex_msg['body']['contents'] = reply_flex_msg['body']['contents'] + bet_msg;
                                    else:
                                        reply_title = name + ' 下注失敗'
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '❌下注失敗❌', 'sm', 'md', 'center' );
                                        if( str(user_bet_msg['message']) != 'None' ):
                                            add_flex_text_msg( reply_flex_msg['body']['contents'], user_bet_msg['message'], 'sm', 'sm', 'center' );
                                        
                            else:
                                if( is_banker and bet_stsus == True ):
                                    reply_title = name + ' 下注失敗'
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '❌下注失敗❌', 'sm', 'md', 'center' );
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '莊家無法下注', 'sm', 'sm', 'center' );
                                    
                                
                                elif( bet_stsus != '' ):
                                    if not name:
                                        name = profile.display_name
                                    reply_title = name + ' 下注失敗'
                                    add_flex_text_msg( reply_flex_msg['body']['contents'], '🔹' + name, 'sm', 'md', 'center' );
                                    
                                    if( bet_stsus == 'input_error' ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '❌下注失敗❌', 'sm', 'md', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '輸入錯誤', 'sm', 'sm', 'center' );
                                    if( bet_stsus == 'no_user' ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '❌操作失敗❌', 'sm', 'md', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '您還未綁定帳號', 'sm', 'sm', 'center' );
                                    if( bet_stsus == 'bet_n_enough' ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '❌下注失敗❌', 'sm', 'md', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '下注金額需高於100(含)', 'sm', 'sm', 'center' );
                                        
                                    if( bet_stsus == 'remaining_n_enough' ):
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '🚫餘額不足🚫', 'sm', 'md', 'center' );
                                        add_flex_text_msg( reply_flex_msg['body']['contents'], '請洽上級代理', 'sm', 'sm', 'center' );
                                
                        
                   
                
                           
            if( reply_title != '' ): 
                line_bot_api.reply_message( event.reply_token, FlexSendMessage( reply_title, reply_flex_msg ) )
                del reply_flex_msg
            reply = False            
                
                 
        if( soure_type == 'user' ):
            user_action = get_user_action( user_id )
            is_bind = line_mysql.check_bind( user_id );
            
            if( user_msg == '綁定會員' ):
                if( is_bind and is_bind != 'error' ):
                    bind_account = line_mysql.get_member_meta( user_id, 'account' );
                    reply_msg = "用戶已綁定-帳號:" + str(bind_account)
                else:
                    set_user_action(user_id, 'bind_agent')
                    reply_msg = "請輸入綁定帳號"
                
            else:
                if( user_msg == '取消' ):
                    set_user_action(user_id, '')
                    reply_msg = '已取消'
                        
                elif( user_msg == '確定' ):
                    response_msg = ''
                    
                else: 
                    if( user_msg == '取消綁定' ):
                        set_user_action(user_id, 'cancel_bind')
                        bind_msg = TemplateSendMessage(
                            alt_text = '取消綁定',
                            template = ConfirmTemplate(
                                title = '取消綁定確認',
                                text = '確定要取消綁定',
                                actions=[                              
                                    PostbackTemplateAction(
                                        label='確定',
                                        text='確定',
                                        data= 'cancel_bind&Y&' + user_id
                                    ),
                                    MessageTemplateAction(
                                        label='取消',
                                        text='取消'
                                    )
                                ]
                            )
                        )
                        is_bind = line_mysql.check_bind( user_id );
                        if( is_bind and is_bind != 'error' ):
                            line_bot_api.reply_message( event.reply_token, bind_msg )
                        else:
                            reply_msg = "無綁定代理"
                        
                    if( user_msg == '下注紀錄' ):
                        set_user_action(user_id, '')
                        bet_histry_msg = TemplateSendMessage(
                            alt_text = '查詢紀錄',
                            template = ConfirmTemplate(
                                title = '查詢紀錄',
                                text = '選擇查詢紀錄',
                                actions=[                              
                                    MessageTemplateAction(
                                        label='局號查詢',
                                        text='局號查詢'
                                    ),
                                    MessageTemplateAction(
                                        label='歷史紀錄',
                                        text='歷史紀錄'
                                    )
                                ]
                            )
                        )
                        if( is_bind and is_bind != 'error' ):
                            line_bot_api.reply_message( event.reply_token, bet_histry_msg )
                        else:
                            reply_msg = "無綁定代理"
                    
                    if( user_msg == '局號查詢' ):
                        if( is_bind and is_bind != 'error' ):
                            set_user_action(user_id, 'game_no_histry')
                            reply_msg = "請輸入局號"
                        else:
                            reply_msg = "無綁定代理"
                        
                            
                    if( user_msg == '歷史紀錄' ):
                        set_user_action(user_id, '')
                        bet_histry = line_mysql.get_bet_histry( user_id );
                        if( bet_histry != 'error' ):
                            reply_msg = bet_histry;
                        else:
                            reply_msg = '無用戶資料';
                    
                    if( user_msg == '打賞紀錄' ):
                        set_user_action(user_id, '')
                        tip_histry = line_mysql.get_tip_histry( user_id );
                        if( tip_histry != 'error' ):
                            reply_msg = tip_histry;
                        else:
                            reply_msg = '無用戶資料';
                            
                    if( user_msg == '餘額查詢' ):
                        set_user_action(user_id, '')
                        remaining = line_mysql.get_member_remaining( user_id );
                        if( str(remaining) == '0' or remaining ):
                            reply_msg = '剩餘餘額：' + str(remaining);
                        else:
                            reply_msg = '無用戶資料';
                        
                    if( user_msg == '使用說明' ):
                        set_user_action(user_id, '')
                        #待改
                        reply_msg = '使用說明';
                    

                    if user_action != '':
                        if( user_action == 'bind_agent' ):
                            bind_msg = TemplateSendMessage(
                                alt_text = '綁定會員',
                                template = ConfirmTemplate(
                                    title = '綁定帳號確認',
                                    text = '綁定帳號:' + user_msg,
                                    actions=[                              
                                        PostbackTemplateAction(
                                            label='確定',
                                            text='確定',
                                            data= user_action + '&' + user_msg + '&' + user_id
                                        ),
                                        MessageTemplateAction(
                                            label='取消',
                                            text='取消'
                                        )
                                    ]
                                )
                            )
                            
                            line_bot_api.reply_message( event.reply_token, bind_msg )
                        
                        if( user_action == 'game_no_histry' and user_msg != '局號查詢' ):
                            if( len(user_msg) != len('0000-00-00#000') ):
                                game_no_histry_msg = TemplateSendMessage(
                                    alt_text = '輸入錯誤',
                                    template = ConfirmTemplate(
                                        title = '輸入錯誤',
                                        text = '局號輸入錯誤 是否重新輸入',
                                        actions=[                              
                                            MessageTemplateAction(
                                                label='重新輸入',
                                                text='局號查詢'
                                            ),
                                            MessageTemplateAction(
                                                label='取消',
                                                text='取消'
                                            )
                                        ]
                                    )
                                )
                            else:
                                game_no_histry_msg = TemplateSendMessage(
                                    alt_text = '局號查詢',
                                    template = ConfirmTemplate(
                                        title = '局號確認',
                                        text = '局號:' + user_msg,
                                        actions=[                              
                                            PostbackTemplateAction(
                                                label='確定',
                                                text='確定',
                                                data= user_action + '&' + user_msg + '&' + user_id
                                            ),
                                            MessageTemplateAction(
                                                label='取消',
                                                text='取消'
                                            )
                                        ]
                                    )
                                )
                            line_bot_api.reply_message( event.reply_token, game_no_histry_msg )   
           
            
        if( reply_msg != '' and reply ):   
            line_bot_api.reply_message( event.reply_token, TextSendMessage( text = reply_msg ) )
            
           
    except Exception as e:
        print(e)
        if( event.source.type == 'user' ):
            line_bot_api.reply_message( event.reply_token, TextSendMessage( text = "請先加為好友" ) )
   
#負責處理回傳的資料
@handler.add( PostbackEvent )
def handle_postback(event):
    global request_header,setLineToken_url,revokeLineToken_url
    try:
        
        pb_msg = event.postback.data
        pb_msg = pb_msg.replace(" ", "")
        pb_msg = pb_msg.split('&')
        user_id = pb_msg[2]

        user_action = get_user_action( user_id )

        app.logger.info("PostbackEvent pb_msg: " + event.postback.data)
        response_msg = ''
        
        if user_action != '':
        
            if( pb_msg[0] == 'bind_agent' and pb_msg[0] == user_action ):
                is_bind = line_mysql.check_bind( user_id );
                if not is_bind and is_bind != 'error':
                    account = pb_msg[1]
                    if( account == '取消綁定' ):
                        response_msg = ''
                    else:
                        have_account = line_mysql.check_account( account )
                        if( have_account ):
                            was_bind = line_mysql.was_bind( account )
                            if not was_bind:
                                Pdata = {
                                    'lineToken': user_id,
                                    'memberAccount': account
                                }
                                is_set = requests.post( setLineToken_url, Pdata , headers = request_header );
                                is_set = is_set.json();
                                if( is_set['success'] ):    
                                    response_msg = "綁定會員成功"
                                else:
                                    response_msg = is_set['message']
                            else:
                                response_msg = '該帳號已綁定,請重新輸入'
                        else:
                            response_msg = '綁定會員失敗,請確認輸入帳號是否正確'
            
            if( pb_msg[0] == 'cancel_bind' and pb_msg[0] == user_action ):
                is_bind = line_mysql.check_bind( user_id );
                if is_bind and is_bind != 'error':
                    Pdata = {
                        'lineToken': user_id,
                    }
                    is_cancel = requests.post( revokeLineToken_url, Pdata , headers = request_header );
                    is_cancel = is_cancel.json()
                    if( is_cancel['success'] ):
                        response_msg = '取消成功';
                    else:
                        response_msg = is_cancel['message'];
                        
            if( pb_msg[0] == 'game_no_histry' and pb_msg[0] == user_action ):
                is_bind = line_mysql.check_bind( user_id );
                if is_bind and is_bind != 'error':
                    game_date = pb_msg[1][0:10]
                    game_seq = pb_msg[1][11:14]
                    gameid = line_mysql.get_game_id_by_date_seq( game_date, game_seq )
                    game_bet_histry = line_mysql.get_game_bet_histry( user_id, gameid );
                    if( game_bet_histry != 'error' ):
                        response_msg = game_bet_histry;
                    else:
                        response_msg = '無用戶資料';   
            
        
            set_user_action(user_id, '')

        del pb_msg
        del user_id
        
        if( response_msg != '' ):
            line_bot_api.reply_message( event.reply_token, TextSendMessage( text = response_msg ) )
    
    except Exception as e:
        print(e)
        line_bot_api.reply_message( event.reply_token, TextSendMessage( text = "發生錯誤" ) )

def is_bettable( game_id, user_id, user_msg ):
    #user_msg = user_msg.replace(" ", "");
    is_bind = line_mysql.check_bind( user_id );
    msg = user_msg.upper();
    if( msg[0] == 'A' or msg[0] == 'B' or msg[0] == 'C' ):
        money = user_msg[1:]
        if( money.isdigit() ):
            if( is_bind == True ):
                if( int(money) >= 100 ):
                    remaining = line_mysql.get_member_meta( user_id, 'remaining' );
                    #bankerBet = line_mysql.get_game_meta( game_id, 'bankerBet' );
                    if( remaining and int(money) <= remaining  ):
                        return True;
                    else:
                        return 'remaining_n_enough';
                else:
                    return 'bet_n_enough';
            elif( is_bind == 'error' ):
                return 'error';
            else:
                return 'no_user';
        else:
            return 'input_error';
    else:
        money = user_msg[1:]
        if( money.isdigit() ):
            return 'input_error';
        return '';

def is_banker_msg( user_id, user_msg ):
    
    is_bind = line_mysql.check_bind( user_id );
    if( user_msg[0] == '莊' ):
        money = user_msg[1:]
        if( money.isdigit() ):
            if( is_bind == True ):
                if( int(money) >= 10000 ):
                    remaining = line_mysql.get_member_meta( user_id, 'remaining' );
                    if( remaining and int(money) <= remaining ):
                        return True;
                    else:
                        return 'remaining_n_enough';
                else:
                    return 'bet_n_enough';
            elif( is_bind == 'error' ):
                return 'error';
            else:
                return 'no_user';
        else:
            return 'input_error';
    else:
        money = user_msg[1:]
        if( money.isdigit() ):
            return 'input_error';
        return '';

def is_win_lose_draw( user_msg ):
    if( user_msg == '勝' ):
        return 'win';
    elif( user_msg == '負' ):
        return 'lose';
    elif( user_msg == '和' ):
        return 'draw';
    else:
        return False;

def add_flex_text_msg( flex_content, text, margin, size, align = 'start' ):
    flex_content.append({
        "type": "text",
        "text": text,
        "margin": margin,
        "size": size,
        "align": align
    })

def set_user_action(uid, action):
    file = "user/" + uid + ".txt"
    fo = open(file, "w")
    fo.write( action )
    fo.close()

def get_user_action( uid ):
    action = ''
    file = "user/" + uid + ".txt"
    if( os.path.isfile(file) ):
        fo = open(file,"r")
        action = fo.read()
        fo.close()
    return action
    

if __name__ == '__main__':
    app.run( host='0.0.0.0', port=5003 )
