import json
import os
import logging

from app.classes.controllers.users_controller import HelperUsers
from app.classes.shared.console import Console

logger = logging.getLogger(__name__)


class Import3:
    def __init__(self, helper, controller):
        self.helper = helper
        self.controller = controller

    def start_import(self):
        folder = os.path.normpath(
            input(
                "Please input the path to the migrations folder "
                "in your installation of Crafty 3: "
            )
        )
        if not os.path.exists(folder):
            Console.info(
                "Crafty cannot find the path you entered. "
                "Does Crafty's user have permission to access it?"
            )
            Console.info("Please run the import3 command again and enter a valid path.")
        else:
            with open(os.path.join(folder, "users.json"), encoding="utf-8") as f:
                user_json = json.loads(f.read())
            with open(os.path.join(folder, "mc_settings.json"), encoding="utf-8") as f:
                servers_json = json.loads(f.read())
            self.import_users(user_json)
            self.import_servers(servers_json, self.controller)

    def import_users(self, json_data):
        # If there is only one user to import json needs to call the data differently
        if isinstance(json_data, list):
            for user in json_data:
                if str(user["username"]).lower() != "admin":
                    HelperUsers.add_rawpass_user(
                        str(user["username"]).lower(), user["password"]
                    )
                    Console.info(f"Imported user {user['username']} from Crafty 3")
                    logger.info(f"Imported user {user['username']} from Crafty 3")
                else:
                    logger.info("Cannot create duplicate Admin account...skipping.")
        else:
            if str(json_data["username"]).lower() != "admin":
                HelperUsers.add_rawpass_user(
                    str(json_data["username"]).lower(), json_data["password"]
                )
                Console.info(f"Imported user {json_data['username']} from Crafty 3")
                logger.info(f"Imported user {json_data['username']} from Crafty 3")
            else:
                Console.info(
                    "There is only one user detected. "
                    "Cannot create duplicate Admin account."
                )
                logger.info(
                    "There is only one user detected. "
                    "Cannot create duplicate Admin account."
                )

    def import_servers(self, json_data, controller):
        # If there is only one server to import json needs to call the data differently
        if isinstance(json_data, list):
            for server in json_data:
                new_server_id = controller.import_jar_server(
                    server_name=server["server_name"],
                    server_path=server["server_path"],
                    server_jar=server["server_jar"],
                    min_mem=(int(server["memory_min"]) / 1000),
                    max_mem=(int(server["memory_max"]) / 1000),
                    port=server["server_port"],
                )
                Console.info(
                    f"Imported server {server['server_name']}[{server['id']}] "
                    f"from Crafty 3 to new server id {new_server_id}"
                )
                logger.info(
                    f"Imported server {server['server_name']}[{server['id']}] "
                    f"from Crafty 3 to new server id {new_server_id}"
                )
        else:
            new_server_id = controller.import_jar_server(
                server_name=json_data["server_name"],
                server_path=json_data["server_path"],
                server_jar=json_data["server_jar"],
                min_mem=(int(json_data["memory_min"]) / 1000),
                max_mem=(int(json_data["memory_max"]) / 1000),
                port=json_data["server_port"],
            )
            Console.info(
                f"Imported server {json_data['server_name']}[{json_data['id']}] "
                f"from Crafty 3 to new server id {new_server_id}"
            )
            logger.info(
                f"Imported server {json_data['server_name']}[{json_data['id']}] "
                f"from Crafty 3 to new server id {new_server_id}"
            )
