/**
 * Market Reporting Service
 * Main entry point for the market reporting service
 */

import express from 'express';
import cors from 'cors';
import dotenv from 'dotenv';
import { MarketReportingService } from '../market-reporting.service';
import { ethers } from 'ethers';

dotenv.config();

const app = express();
app.use(cors());
app.use(express.json());

const PORT = process.env.PORT || 3001;
const RPC_URL = process.env.ETHEREUM_RPC_URL || process.env.ETHEREUM_MAINNET_RPC;
const BRIDGE_SWAP_COORDINATOR = process.env.BRIDGE_SWAP_COORDINATOR;
const RESERVE_SYSTEM = process.env.RESERVE_SYSTEM;
const API_KEY = process.env.API_KEY;

if (!RPC_URL) {
  throw new Error('ETHEREUM_RPC_URL or ETHEREUM_MAINNET_RPC must be set');
}

if (!BRIDGE_SWAP_COORDINATOR) {
  throw new Error('BRIDGE_SWAP_COORDINATOR must be set');
}

// Initialize service
const provider = new ethers.JsonRpcProvider(RPC_URL);
const marketReporting = new MarketReportingService(
  provider,
  BRIDGE_SWAP_COORDINATOR,
  RESERVE_SYSTEM || undefined
);

// API key middleware
const authenticate = (req: express.Request, res: express.Response, next: express.NextFunction) => {
  const apiKey = req.headers['x-api-key'];
  if (API_KEY && apiKey !== API_KEY) {
    return res.status(401).json({ error: 'Unauthorized' });
  }
  next();
};

// Health check
app.get('/health', (req, res) => {
  res.json({ status: 'ok', service: 'market-reporting' });
});

// Get bridge metrics
app.get('/api/metrics', authenticate, async (req, res) => {
  try {
    const metrics = await marketReporting.getBridgeMetrics();
    res.json(metrics);
  } catch (error: any) {
    res.status(500).json({ error: error.message });
  }
});

// Get reserve status
app.get('/api/reserve-status', authenticate, async (req, res) => {
  try {
    const status = await marketReporting.getReserveStatus();
    res.json(status);
  } catch (error: any) {
    res.status(500).json({ error: error.message });
  }
});

// Get peg status
app.get('/api/peg-status', authenticate, async (req, res) => {
  try {
    const { asset } = req.query;
    if (!asset) {
      return res.status(400).json({ error: 'Asset parameter required' });
    }
    const status = await marketReporting.getPegStatus(asset as string);
    res.json(status);
  } catch (error: any) {
    res.status(500).json({ error: error.message });
  }
});

app.listen(PORT, () => {
  console.log(`Market Reporting Service running on port ${PORT}`);
});

