import axios from 'axios';
import logger from '@server/logger';
import db from '@server/db';
import { exitNodes } from '@server/db/schemas';
import { eq } from 'drizzle-orm';

export async function addPeer(exitNodeId: number, peer: {
    publicKey: string;
    allowedIps: string[];
}) {

    const [exitNode] = await db.select().from(exitNodes).where(eq(exitNodes.exitNodeId, exitNodeId)).limit(1);
    if (!exitNode) {
        throw new Error(`Exit node with ID ${exitNodeId} not found`);
    }
    if (!exitNode.reachableAt) {
        throw new Error(`Exit node with ID ${exitNodeId} is not reachable`);
    }

    try {
        const response = await axios.post(`${exitNode.reachableAt}/peer`, peer, {
            headers: {
                'Content-Type': 'application/json',
            }
        });

        logger.info('Peer added successfully:', response.data.status);
        return response.data;
    } catch (error) {
        if (axios.isAxiosError(error)) {
            throw new Error(`HTTP error! status: ${error.response?.status}`);
        }
        throw error;
    }
}

export async function deletePeer(exitNodeId: number, publicKey: string) {
    const [exitNode] = await db.select().from(exitNodes).where(eq(exitNodes.exitNodeId, exitNodeId)).limit(1);
    if (!exitNode) {
        throw new Error(`Exit node with ID ${exitNodeId} not found`);
    }
    if (!exitNode.reachableAt) {
        throw new Error(`Exit node with ID ${exitNodeId} is not reachable`);
    }
    try {
        const response = await axios.delete(`${exitNode.reachableAt}/peer?public_key=${encodeURIComponent(publicKey)}`);
        logger.info('Peer deleted successfully:', response.data.status);
        return response.data;
    } catch (error) {
        if (axios.isAxiosError(error)) {
            throw new Error(`HTTP error! status: ${error.response?.status}`);
        }
        throw error;
    }
}
