#!/usr/bin/env python3

import sys
import base64
import secrets
import datetime

import mysql.connector
from types import SimpleNamespace
from cryptography.fernet import Fernet

from config import config
import database
import security
import create_wallet


def atavism_player_exists(user_id) -> bool:
    """Check if Atavism player exists"""
    print(f"{datetime.datetime.now()}: create_smr_user.py | Checking Atavism that user {user_id} does exist.", file=sys.stderr)
    with database.get_connection(config.db.atavism.master) as atavism_conn:
        cursor = atavism_conn.cursor()
        cursor.execute("SELECT id FROM account WHERE id = %s", (user_id,))
        if cursor.fetchone() is None:
            cursor.close()
            return False
        cursor.close()
        return True

def tr1_player_exists(user_id) -> bool:
    """Check if TR1 player exists"""
    print(f"{datetime.datetime.now()}: create_smr_user.py | Checking TR1 if user {user_id} does not already exist.", file=sys.stderr)
    with database.get_connection(config.db.tr1) as tr1_conn:
        cursor = tr1_conn.cursor()
        cursor.execute("SELECT user_id FROM users WHERE user_id = %s", (user_id,))
        if cursor.fetchone() is None:
            cursor.close()
            return False
        cursor.close()
        return True

def create_smr_user(user_id)-> tuple[str, str]:
    """Create Shimmer wallet and add user to TR1"""
    print (f"{datetime.datetime.now()}: create_smr_user.py | Creating new user with ID {user_id} ...", file=sys.stderr)
    try:
        print (f"{datetime.datetime.now()}: create_smr_user.py|create_smr_user | Creating password ...", file=sys.stderr)
        wallet_password = secrets.token_urlsafe(32)
        print (f"{datetime.datetime.now()}: create_smr_user.py|create_smr_user | Calling create_wallet ...", file=sys.stderr)
        wallet_result = create_wallet.create_wallet(["create_wallet.py",user_id, wallet_password])
        print (f"{datetime.datetime.now()}: create_smr_user.py|create_smr_user | Done calling create_wallet ...", file=sys.stderr)
        print (f"{datetime.datetime.now()}: create_smr_user.py|create_smr_user | {wallet_result}", file=sys.stderr)
    except Exception as e:
        return {
            "status" : "failure",
            "error" : e,
            "message" : f"{datetime.datetime.now()}: create_smr_user.py | Failed to create Shimmer wallet.",
        }
    
    try:
        wallet_mnemonic = wallet_result["mnemonic"]
        wallet_address = wallet_result["address"]
        print(f"{datetime.datetime.now()}: create_smr_user.py | Wallet address {wallet_address} created for user {user_id}.", file=sys.stderr)
        
    except Exception as e:
        return {
            "status" : "failure",
            "error" : e,
            "message" : f"{datetime.datetime.now()}: create_smr_user.py | create_wallet result is invalid.",
        }

    try:
        # Encrypt wallet data
        wallet_p = security.encrypt(wallet_password)
        wallet_m = security.encrypt(wallet_mnemonic)

        # Insert into TR1 DB
        with database.get_connection(config.db.tr1) as tr1_conn:
            cursor = tr1_conn.cursor()
            cursor.execute("""
                INSERT INTO users (user_id, wallet_a, wallet_p, wallet_m)
                VALUES (%s, %s, %s, %s)
            """, (user_id, wallet_address, wallet_p, wallet_m))
            tr1_conn.commit()
            cursor.close()
            print(f"{datetime.datetime.now()}: create_smr_user.py | User {user_id} with address {wallet_address} inserted into TR1 DB.", file=sys.stderr)
    except Exception as e:
        return {
            "status" : "failure",
            "error" : e,
            "message" : f"{datetime.datetime.now()}: create_smr_user.py | Failed to insert into TR1 DB.",
        }

    return {
        "status"  : "success",
        "error"   : "",
        "message" : f"{datetime.datetime.now()}: create_smr_user.py | Shimmer wallet created and saved for {user_id} to TR1."
    }


# Main function
def main(user_id : str, TESTING = False, DELETE = False):
    """Main function"""
    #user_id = str(args[0])
    #TESTING = "test" in args
    #DELETE = "delete" in args

    if not atavism_player_exists(user_id):
        print("User ID not found in Atavism DB.")
        return {
            "status"  : "Failure",
            "message" : "Invalid Atavism user."
        }

    # Check TR1 DB for duplicates
    if tr1_player_exists(user_id):
        print("User ID already exists in TR1 DB.")
        return {
            "status"  : "Failure",
            "message" : "User ID already exists in TR1 DB."
        }

    return create_smr_user(user_id)

# Entry point
if __name__ == "__main__":
    if len(sys.argv) < 2 or not sys.argv[1].isdigit():
        print("Usage: create_user.py <user_id> [test] [delete]")
        result = main ("21")
    else:
        result = main([sys.argv[1]])

    print(result)
