<?php
header('Content-Type: application/json; charset=utf-8');
include_once 'connect.php';
include_once 'utils.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $id = $_POST['id'] ?? null;
    $response = ["success" => false, "message" => "ERROR"];
    switch ($id) {
        case "isConnected":
            try {
                $response = [
                    "success" => true,
                    "connected" => $connected['dbconnected']
                ];
                echo json_encode($response);
            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "error" => $connected['error']
                ];
                echo json_encode($response);
            }
            break;
        case "atualizarIdioma":
            $language = $_POST['language'] ?? null;
            $user_id = $_POST['user_id'] ?? null;
            if ($language && $user_id) {
                try {
                    atualizarConfigJSON($TraceStockDB, $user_id, "language", $language);
                    $response = ["success" => true, "message" => "Idioma atualizado com sucesso!", "language" => $language];
                    echo json_encode($response);
                } catch (Exception $e) {
                    $response = ["success" => false, "message" => $e->getMessage()];
                    echo json_encode($response);
                }
            } else {
                $response = ["success" => false, "message" => "Dados insuficientes"];
                echo json_encode($response);
            }
            break;
        case "buscarDados":
            $nif = getDataCompany("nif");
            $nome = getDataCompany("nome"); 
            if ($nif && $nome) {
                $response = [
                    "success" => true,
                    "data" => [
                        "nif" => $nif,
                        "nome" => $nome
                    ]
                ];
                echo json_encode($response);
            } else {
                $response = ["success" => false, "message" => "Erro ao buscar dados da empresa"];
                echo json_encode($response);
            }
            break;
        case "atualizarCompanyData":
            $name = $_POST['name'] ?? null;
            $nif = $_POST['nif'] ?? null;
            $user_id = $_POST['user_id'] ?? null;
            if ($name && $nif && $user_id) {
                try {
                    setDataCompany($TraceStockDB, $user_id, "nome", $name);
                    setDataCompany($TraceStockDB, $user_id, "nif_cnpj", $nif);
                    $response = ["success" => true, "message" => "Dados da empresa atualizados com sucesso!"];
                } catch (Exception $e) {
                    $response = ["success" => false, "message" => $e->getMessage()];
                }
                echo json_encode($response);
            } else {
                $response = ["success" => false, "message" => "Dados insuficientes"];
                echo json_encode($response);
            }
            break;
        case "adicionarPermissao":
            $user_id = $_POST['user_id'] ?? null;
            $perm = $_POST['perm'] ?? [];
            $bossid = $_POST['bossid'] ?? [];
            $active = $_POST['active'] ?? [];

            $sql = "SELECT p.id, p.dvalue, u.nome AS nome, u.apelido AS apelido FROM permissoes p INNER JOIN utilizadores u ON p.id_user = u.id WHERE p.id_user = $bossid AND p.dkey = '$perm'";
            $result = $TraceStockDB->query($sql);
            $rowCounted = $result->rowCount();
            if ($result && $rowCounted > 0) {
                $row = $result->fetch(PDO::FETCH_ASSOC);
                $nomeBoss = $row['nome'] . ' ' . $row['apelido'];
                $sqlUpdate = "UPDATE permissoes SET dvalue = $active WHERE id_user = $bossid AND dkey = '$perm'";
                $stmt = $TraceStockDB->query($sqlUpdate);
                $txt = $active ? 'Sim' : 'Não';
                inserirLog($TraceStockDB, $user_id, "UPDATE_PERMS_BOSS", "Atualizou a permissao '$perm' do Boss: $nomeBoss da Empresa para $txt", true);
                $response = ["success" => true, "message" => "Permissões atualizadas com sucesso!"];               
                echo json_encode($response);
            } else {
                $row = $result->fetch(PDO::FETCH_ASSOC);
                $sqlNome = "SELECT nome, apelido AS apelido FROM utilizadores WHERE id = $bossid";
                $nomeData = $TraceStockDB->query($sqlNome);
                $row = $nomeData->fetch(PDO::FETCH_ASSOC);
                $nomeBoss = $row['nome'] . ' ' . $row['apelido'];
                $sqlUpdate = "INSERT INTO permissoes (id_user, dkey, dvalue) VALUES ($bossid, '$perm', $active)";
                $stmt = $TraceStockDB->query($sqlUpdate);
                $txt = $active ? 'Sim' : 'Não';
                inserirLog($TraceStockDB, $user_id, "INSERT_PERMS_BOSS", "Inseriu a permissao '$perm' da Empresa do Boss: $nomeBoss para $txt", true);
                $response = ["success" => true, "message" => "Permissões adicionadas com sucesso!"];                
                echo json_encode($response);
            }
            break;
        case 'loginUser':
            $email = $_POST['email'] ?? '';
            $pass  = $_POST['pass'] ?? '';
            $passHash = hash('sha256', $pass);
            try {
                $data = $TraceStockDB->query("SELECT * FROM view_all_users WHERE email = '$email' AND pass = '$passHash' AND active = '1'")->fetchAll(PDO::FETCH_ASSOC);
                $selectedLanguage = $dataSERVER->language;
                $translation = $dataSERVER->translations->{$selectedLanguage};
                $translationJSON = json_encode($translation, JSON_UNESCAPED_UNICODE);
                $response = [
                    "success"  => true,
                    "message"  => "Login bem-sucedido!",
                    "language" => $selectedLanguage ?? 'en-us',
                    "translations" => $translationJSON,
                    "data"     => $data
                ];
                echo json_encode($response);
            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "message" => "Erro no servidor: " . $e->getMessage()
                ];
                echo json_encode($response);
            }
            break;       
        case 'logout':            
            logoutUser();
            $response = ["success" => true, "message" => "Logout realizado com sucesso!"];
            echo json_encode($response);
            break;
        case 'getPermissions':
            if (isset($_SESSION['user_id'])) {
                $IdUser = $_SESSION['user_id'];
                $sql = "SELECT * FROM view_user_permissions WHERE id = $IdUser";
                $result = $TraceStockDB->query($sql);
                $row = $result->fetchAll(PDO::FETCH_ASSOC);
                if ($IdUser === "1") {
                    array_push($row, ["dkey" => "admin", "dvalue" => "1"]);
                }
                array_push($row, ["dkey" => "user", "dvalue" => "1"]);
                $response = [
                    "success" => true,
                    "message" => "Sucesso ao buscar as permissões",
                    "data" => $row
                ];
                echo json_encode($response);
            } else {
                $response = [
                    "success" => false,
                    "message" => "Erro ao buscar as permissões"
                ];
                echo json_encode($response);
            }
            break;
        case 'getLogsSistema':
            $query = "SELECT * FROM view_logs_system";
            $result = $TraceStockDB->query($query);
            if ($result && $result->rowCount() > 0) {
                $row = $result->fetchAll(PDO::FETCH_ASSOC);
                $response = [
                    "success" => true,
                    "message" => "Sucesso ao buscar as logs do sistema",
                    "data" => $row
                ];
                echo json_encode($response);
            } else {
                $response = [
                    "success" => false,
                    "message" => "Erro ao buscar as logs do sistema"
                ];
                echo json_encode($response);
            }
            break;
        case 'isAdmin':
            try {
                $user = hash('sha256', $_POST['username']);
                $pass = hash('sha256', $_POST['password']);
                $sql = "SELECT * FROM admin WHERE username='$user' AND password='$pass'";
                $result = $TraceStockDB->query($sql);
                if ($result->rowCount() > 0) {
                    $getLogs = "SELECT utilizador_id, descricao, sucesso FROM logs_sistema LIMIT 100";
                    $getLogsData = $TraceStockDB->query($getLogs);
                    $getNome = "SELECT id, nome, apelido FROM utilizadores";
                    $getNomeData = $TraceStockDB->query($getNome);                  
                    $response = [
                        "success" => true,
                        "message" => "Autenticação bem-sucedida",
                        "data" => $getLogsData->fetchAll(PDO::FETCH_ASSOC),
                        "nomes" => $getNomeData->fetchAll(PDO::FETCH_ASSOC)
                    ];
                    echo json_encode($response);
                } else {
                    $response = [
                        "status" => "FAIL", 
                        "message" => "Autenticação falhou!"
                    ];
                    echo json_encode($response);
                }
            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "message" => "Erro no servidor: " . $e->getMessage()
                ];
                echo json_encode($response);
            }
            break;
        case 'addLog':
            try {
                $user = $_POST['userId'];
                $text = $_POST['text'];
                $success = $_POST['success'];
                $acao = $_POST['acao'];
                inserirLog($TraceStockDB, $user, $acao, $text, $success);
                $response = [
                    "success" => true,
                    "message" => "Sucesso ao inserir as logs"
                ];
                echo json_encode($response);
            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "message" => "Erro no servidor: " . $e->getMessage()
                ];
                echo json_encode($response);
            }
            break;
        case 'getUsername':
            $user_id = $_POST['user_id'];
            $sql = "SELECT nome, apelido FROM utilizadores WHERE id = $user_id";
            $getData = $TraceStockDB->query($sql);
            if ($getData->rowCount() > 0) {
                $response = [
                    "success" => true,
                    "message" => "Sucesso ao buscar os dados",
                    "data" => $getData->fetchAll(PDO::FETCH_ASSOC)
                ];
                echo json_encode($response);
            }else{                
                $response = [
                    "success" => false,
                    "message" => "Erro ao buscar as logs do sistema"
                ];
                echo json_encode($response);
            }
            break;
        case 'temEmpresaPrincipal':
            $hasCompany = $dataSERVER->company;
            $response = [
                "data" => $hasCompany
            ];
            echo json_encode($response);
            break;
        case 'configurationCompany':
            $company = $_POST['company'];
            $language = $_POST['language'];
            try {
                atualizarConfigJSON($TraceStockDB, 1, "language", $language);
                atualizarConfigJSON($TraceStockDB, 1, "company", $company);
                $response = [
                    "success" => true,
                    "message" => "Empresa criada com sucesso!",
                ];
                echo json_encode($response);
            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "message" => "Erro no servidor: " . $e->getMessage()
                ];
                echo json_encode($response);
            }
            break;
        case 'configurationEmpresa':
            $empresas = json_decode($_POST['empresas'] ?? '{}', true);

            try {
                $nome = $empresas['nome'] ?? '';
                $razao = $empresas['razao'] ?? '';
                $nif = $empresas['nif'] ?? '';
                $email = $empresas['email'] ?? '';
                $telefone = $empresas['telefone'] ?? '';
                $website = $empresas['website'] ?? '';
                $rua = $empresas['rua'] ?? '';
                $numero = $empresas['numero'] ?? '';
                $complemento = $empresas['complemento'] ?? '';
                $bairro = $empresas['bairro'] ?? '';
                $cidade = $empresas['cidade'] ?? '';
                $estado = $empresas['estado'] ?? '';
                $tipo = $empresas['tipo'] ?? '';
                $cep = $empresas['cep'] ?? '';
                $pais = $empresas['pais'] ?? 'Portugal';
                $status = (($empresas['status'] ?? '') === "ATIVA") ? 1 : 0;

                $TraceStockDB->query("CALL inserir_empresa_retorno('$tipo','$nome','$razao','$nif','$email','$telefone','$website','$rua','$numero','$complemento','$bairro','$cidade','$estado','$cep','$pais',$status,@novo_id);");

                $empresaID = $TraceStockDB->query("SELECT @novo_id AS id_empresa")->fetch(PDO::FETCH_ASSOC)['id_empresa'];

                $response = [
                    "success" => true,
                    "message" => "Empresa criada com sucesso!",
                    "empresa_id" => $empresaID
                ];

                echo json_encode($response);
            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "message" => "Erro no servidor: " . $e->getMessage()
                ];
                echo json_encode($response);
            }

            break;
        case 'getEmpresas':
            try {
                $data = $TraceStockDB->query("SELECT * FROM empresas")->fetchAll(PDO::FETCH_ASSOC);
                if ($data !== false) {
                    $response = [
                        "success" => true,
                        "message" => "Sucesso",
                        "data"    => $data
                    ];
                } else {
                    $response = [
                        "success" => false,
                        "message" => "Nenhum resultado encontrado"
                    ];
                }

                echo json_encode($response);

            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "message" => "Erro no servidor: " . $e->getMessage()
                ];
                echo json_encode($response);
            }

            break;
        case 'getUsuarios':
            try {
                $response = [
                    "success" => true,
                    "message" => "Sucesso",
                    "data" => $TraceStockDB->query("SELECT * FROM view_all_users")->fetchAll(PDO::FETCH_ASSOC)
                ];
                echo json_encode($response);
            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "message" => "Erro no servidor: " . $e->getMessage()
                ];
                echo json_encode($response);
            };
            break;
        case 'removeUser':
            $user_id = $_POST['user_id'];
            try {
                $insertEmpresas = "DELETE FROM utilizadores WHERE id = $user_id";
                $selectEmpresaID = $TraceStockDB->query($insertEmpresas);
                $response = [
                    "success" => true,
                    "message" => "Sucesso!"
                ];
                echo json_encode($response);
            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "message" => "Erro no servidor: " . $e->getMessage()
                ];
                echo json_encode($response);
            }
            break;
        case 'removeEmpresa':
            $nif = $_POST['nif'];
            try {
                $deleteEmpresa = "DELETE FROM empresas WHERE nif_cnpj = $nif";
                $selectEmpresaID = $TraceStockDB->query($deleteEmpresa);
                $response = [
                    "success" => true,
                    "message" => "Sucesso!"
                ];
                echo json_encode($response);
            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "message" => "Erro no servidor: " . $e->getMessage()
                ];
                echo json_encode($response);
            }
            break;
        case 'getProdutosEmpresa':

            break;
        case 'configurationUsers':
            $usuarios = json_decode($_POST['usuarios'] ?? '{}', true);
            try {
                $nome = $usuarios['nome'] ?? '';
                $apelido = $usuarios['apelido'] ?? '';
                $email = $usuarios['email'] ?? '';
                $pass = $usuarios['password'] ?? '';
                $pass = hash('sha256', $pass) ?? '';
                $telefone = $usuarios['telefone'] ?? '';
                $permission = $usuarios['permission'] ?? '';
                $empresa = $usuarios['empresa'] ?? '';
                $active = (($usuarios['active'] ?? '') === "ATIVA") ? 1 : 0;
                $insertUsuarios = "INSERT INTO utilizadores (id_empresa, telefone, nome, apelido, email, pass, perms, active ) VALUES ('$empresa', '$telefone', '$nome', '$apelido', '$email', '$pass', '{}', '$active');";
                $query = $TraceStockDB->query($insertUsuarios);
                switch ($permission) {
                    case 'admin':
                        $selectID = $TraceStockDB->query("SELECT id FROM utilizadores WHERE email = '$email';")->fetchAll(PDO::FETCH_ASSOC)[0]["id"];
                        $insertPermsUsuarios = "INSERT INTO permissoes ( id_user, dkey, dvalue ) VALUES ( $selectID, '$permission', '$active' );";
                        $TraceStockDB->query($insertPermsUsuarios);
                        $response = [
                            "success" => true,
                            "message" => "Inserido com sucesso!",
                            "user_id" => $selectID
                        ];
                        echo json_encode($response);
                        break;
                    case 'boss':
                        $selectID = $TraceStockDB->query("SELECT id FROM utilizadores WHERE email = '$email';")->fetchAll(PDO::FETCH_ASSOC)[0]["id"];
                        $insertPermsUsuarios = "INSERT INTO permissoes ( id_user, dkey, dvalue ) VALUES ( $selectID, '$permission', '$active' );";
                        $TraceStockDB->query($insertPermsUsuarios);
                        $response = [
                            "success" => true,
                            "message" => "Inserido com sucesso!",
                            "user_id" => $selectID
                        ];
                        echo json_encode($response);
                        break;
                    case 'default':
                        $selectID = $TraceStockDB->query("SELECT id FROM utilizadores WHERE email = '$email';")->fetchAll(PDO::FETCH_ASSOC)[0]["id"];
                        $response = [
                            "success" => true,
                            "message" => "Inserido com sucesso!",
                            "user_id" => $selectID
                        ];
                        echo json_encode($response);
                        break;
                }
            } catch (Exception $e) {
                $response = [
                    "success" => false,
                    "message" => "Erro no servidor: " . $e->getMessage()
                ];
                echo json_encode($response);
            }
            break;
    }
}
?>