"""Recipe "connect": the server version and capabilities before logging in, then log in, read the
session, keep it alive and log out.

Usage: python recipes/connect.py
"""

import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from mfiles_client import MFilesClient, decode_version, run  # noqa: E402
from recipe_helpers import CLIENT_NAME  # noqa: E402

from mfiles import IRPCLogin_pb2, IRPCLogin_pb2_grpc  # noqa: E402
from mfiles import IRPCQueryVersion_pb2, IRPCQueryVersion_pb2_grpc  # noqa: E402


def main() -> None:
    # [START connect]
    # No session is needed for these calls.
    with MFilesClient.from_env(CLIENT_NAME, log_in=False) as client:
        version_service = client.stub(IRPCQueryVersion_pb2_grpc.IRPCQueryVersionStub)
        version = version_service.QueryVersion(IRPCQueryVersion_pb2.QueryVersionRequest())
        print(f"Server version: {decode_version(version.server_version)}")

        login = client.stub(IRPCLogin_pb2_grpc.IRPCLoginStub)
        capabilities = login.GetServerCapabilities(
            IRPCLogin_pb2.GetServerCapabilitiesRequest()).server_capabilities
        print(f"Server capabilities: file_streaming={capabilities.file_streaming}, "
              f"facet_search={capabilities.facet_search}")

        session = client.log_in()
        print(f"Logged in as {session.account_name}; "
              f"keep-alive interval {session.keep_alive_interval_in_seconds} s")

        info = login.GetVaultSessionInfo(
            IRPCLogin_pb2.GetVaultSessionInfoRequest()).vault_session_info
        print(f"Vault: {info.vault_display_name} {info.vault_guid}")
        # From the trailers of the calls so far.
        structure_version = client.metadata_structure_version
        print(f"Metadata structure version: "
              f"{'not reported' if structure_version is None else structure_version}")

        # A long-running program calls KeepAlive within the keep-alive interval.
        login.KeepAlive(IRPCLogin_pb2.KeepAliveRequest())
        print("KeepAlive: ok")

        client.log_out()
        print("Logged out")
    # [END connect]


if __name__ == "__main__":
    run(main)
