import uuid

import grpc
import mysql_ops
from proto import mira_ida_access_service_pb2, mira_ida_access_service_pb2_grpc


def get_datasouce_by_id(host_port, conn_id, table_name):
    channel = grpc.insecure_channel(host_port)
    stub = mira_ida_access_service_pb2_grpc.MiraIdaAccessStub(channel)
    request = mira_ida_access_service_pb2.GetPrivateDBConnInfoReq(
        request_id=str(uuid.uuid4()),
        db_conn_id=conn_id)
    response = stub.GetPrivateDBConnInfo(request)
    db_info = response.data
    # print("grpc received: ", db_info)
    if db_info:
        host = db_info.host
        port = db_info.port
        user = db_info.username
        password = db_info.password
        database = db_info.db_name
        encoding = mysql_ops.get_encoding(host, port, user, password, database, table_name)
        if encoding.startswith("utf8"):
            encoding = "utf8"
        if not encoding:
            raise Exception("failed to get table charset")
        if not host:
            raise Exception("failed to get db connect arguments")
        url = f"jdbc:mysql://{host}:{port}/{database}?useUnicode=true&characterEncoding={encoding}&rewriteBatchedStatements=true"
        return url, {
            "user": user,
            "password": password,
            "driver": "com.mysql.cj.jdbc.Driver"
        }
    else:
        print("grpc response: ", response)


def get_datasource_by_asset_en_name(host_port, asset_en_name, chain_info_id):
    channel = grpc.insecure_channel(host_port)
    stub = mira_ida_access_service_pb2_grpc.MiraIdaAccessStub(channel)
    request = mira_ida_access_service_pb2.GetPrivateAssetInfoByEnNameReq(
        request_id=str(uuid.uuid4()),
        asset_en_name=asset_en_name,
        chain_info_id=int(chain_info_id))
    response = stub.GetPrivateAssetInfoByEnName(request)
    data = response.data
    conn_id = data.product_info.product_data_set.db_conn_info.db_conn_id
    if not conn_id:
        raise Exception("failed to get  db conn id")
    table_name = data.product_info.product_data_set.table_name
    mysql_url, mysql_prop = get_datasouce_by_id(host_port, conn_id, table_name)
    return mysql_url, mysql_prop, table_name