import redis
import json
import os
from .base_db import BaseDBHandler

class RedisHandler(BaseDBHandler):
    def __init__(self, logger):
        super().__init__(logger)
        # Get certificate path from environment variable
        self.cert_path = os.getenv("EURECA_CA")

    def connect(self, service, user, password, database=None):

        try:
            self.redis_client = redis.Redis(
                host=service,
                port=3030,
                db=0,
                username=user,
                password=password,
                ssl = True,  # --tls
                ssl_ca_certs = self.cert_path,
                decode_responses = True
            )
            self.redis_client.ping()
            return self.make_connection_response("Successfully connected to Redis")
        except Exception as e:
            return self.make_error_response(500, f"Failed to connect to Redis: {str(e)}")

    def execute_query(self, query, database=None):
        try:
            # Parse Redis command from query - handle quoted strings properly
            query = query.strip()
            if not query:
                return self.make_error_response(400, "Empty query")

            import shlex
            try:
                parts = shlex.split(query)
            except ValueError:
                parts = query.split()

            command = parts[0].upper()
            args = parts[1:] if len(parts) > 1 else []

            # Use existing Redis client (created in connect method)
            try:
                result = self.redis_client.execute_command(command, *args)

                if isinstance(result, list):
                    if result and isinstance(result[0], dict):
                        columns_names = list(result[0].keys()) if result else []
                        results = [list(item.values()) for item in result]
                    else:
                        columns_names = ['result']
                        results = [[str(item)] for item in result]
                elif isinstance(result, dict):
                    columns_names = ['field', 'value']
                    results = [[str(k), str(v)] for k, v in result.items()]
                elif result is None:
                    columns_names = ['result']
                    results = [['(nil)']]
                else:
                    columns_names = ['result']
                    results = [[str(result)]]

                return self.make_success_response(
                    msg=f"Command '{command}' executed successfully",
                    columns_names=columns_names,
                    results=results
                )
            except Exception as e:
                return self.make_error_response(400, f"Redis command error: {e}")
        except Exception as e:
            return self.make_error_response(500, f"Internal Server Error: {e}")
