from invoke import task
from invoke import tasks
import os
from datetime import datetime as dt

IP=os.environ.get('LUANTI_IP')
USER=os.environ.get('LUANTI_USER')
HOME=os.environ.get('LUANTI_HOME')
LOCAL_HOME=os.environ.get('HOME')

TODAY = dt.now().strftime('%Y.%m.%d')

USER_AT_IP=f'{USER}@{IP}'
SSH=f'ssh {USER}@{IP}'
SCP=f'scp {USER}@{IP}'

DATE_TAR=f'{TODAY}.tar'

# Minecraft
LOCAL_BACKUPS=f'{LOCAL_HOME}/backup/minecraft'

MINECRAFT=f'{HOME}/Minecraft'

DIRS = ['world', 'world_nether', 'world_the_end', 'plugins']

# TODO: Set these
JAVA=f'{HOME}/java/jdk21/bin/java'
JAVA_OPTS=f'--Xms3000 --Xmx6000'
OPTIONS=f'--nogui'
SERVE=f'screen -S Minecraft -d -m {JAVA} {JAVA_OPTS} {MINECRAFT}/server.jar {OPTIONS}'

@task
def compress_world(c):
    for world in DIRS:
        c.run(f'{SSH} -C tar cf /tmp/{world}.{DATE_TAR} --directory={MINECRAFT} {world}')
    c.run(f'{SSH} -C ls /tmp | grep .tar')


@task(compress_world)
def backup(c):
    stopped = input("Is the server stopped?")
    if(stopped != 'y'):
        print("so go stop the server...")
        exit()
    c.run(f'mkdir -p {LOCAL_BACKUPS}')

    for world in DIRS:
        c.run(f'{SCP}:/tmp/{world}.{DATE_TAR} {LOCAL_BACKUPS}')

    c.run(f'ls -lh {LOCAL_BACKUPS} | grep .tar')
    verify_backup(c)

@task
def verify_backup(c):
    for world in DIRS:
        c.run(f'tar tvf {LOCAL_BACKUPS}/{world}.{DATE_TAR} | tail')
        c.run(f'tar tvf {LOCAL_BACKUPS}/{world}.{DATE_TAR} | wc')

@task
def check_server(c):
    result = c.run(f'ssh {USER}@{IP} -C screen -ls')

@task(verify_backup)
def serve(c):
    print(f"Attempting to connect to {IP}")
    result = c.run(f'ssh {USER}@{IP} -C {SERVE}')
    print(f'Server should now be running in a remote screen session.')
    print(result)


@task
def serve(c):
    print(f"Attempting to connect to {IP}")
    result = c.run(f'ssh {USER}@{IP} -C {SERVE}')
    print(f'Server should now be running in a remote screen session.')
    print(result)

