<?php
class Chat {
    private $db;
    private $gpt;

    public function __construct() {
        $database = new Database();
        $this->db = $database->getConnection();
        $this->gpt = new GPTClient();
    }

    public function processMessage($sessionId, $message) {
        try {
            $this->saveMessage($sessionId, $message, 'user');

            $context = $this->getRecentContext($sessionId);

            $response = $this->gpt->chatResponse($message, $context);

            if ($response) {
                $this->saveMessage($sessionId, $response, 'ai');
                return $response;
            }

            return "I'm sorry, I couldn't process your message at the moment. Please try again.";
        } catch (Exception $e) {
            error_log("Chat process message error: " . $e->getMessage());
            return "An error occurred while processing your message.";
        }
    }

    private function saveMessage($sessionId, $message, $type) {
        try {
            $query = "INSERT INTO chat_messages (session_id, message, type) VALUES (:session_id, :message, :type)";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':session_id', $sessionId);
            $stmt->bindParam(':message', $message);
            $stmt->bindParam(':type', $type);
            return $stmt->execute();
        } catch (Exception $e) {
            error_log("Save chat message error: " . $e->getMessage());
            return false;
        }
    }

    private function getRecentContext($sessionId, $limit = 10) {
        try {
            $query = "SELECT message, type FROM chat_messages
                      WHERE session_id = :session_id
                      ORDER BY created_at DESC
                      LIMIT :limit";

            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':session_id', $sessionId);
            $stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
            $stmt->execute();

            $messages = $stmt->fetchAll();
            $context = [];

            foreach (array_reverse($messages) as $msg) {
                $role = $msg['type'] === 'user' ? 'user' : 'assistant';
                $context[] = [
                    'role' => $role,
                    'content' => $msg['message']
                ];
            }

            return $context;
        } catch (Exception $e) {
            error_log("Get chat context error: " . $e->getMessage());
            return [];
        }
    }

    public function getChatHistory($sessionId, $limit = 50) {
        try {
            $query = "SELECT * FROM chat_messages
                      WHERE session_id = :session_id
                      ORDER BY created_at ASC
                      LIMIT :limit";

            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':session_id', $sessionId);
            $stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
            $stmt->execute();

            return $stmt->fetchAll();
        } catch (Exception $e) {
            error_log("Get chat history error: " . $e->getMessage());
            return [];
        }
    }

    public function clearHistory($sessionId) {
        try {
            $query = "DELETE FROM chat_messages WHERE session_id = :session_id";
            $stmt = $this->db->prepare($query);
            $stmt->bindParam(':session_id', $sessionId);
            return $stmt->execute();
        } catch (Exception $e) {
            error_log("Clear chat history error: " . $e->getMessage());
            return false;
        }
    }
}
?>