/**
 * Subscription Details Routes
 *
 * Endpoints for retrieving user subscription information
 */

import { Router, Request, Response } from 'express';
import { PrismaClient } from '@prisma/client';
import { authenticateApiKey } from '../middleware/auth';
import { logger } from '../utils/logger';

const router = Router();
const prisma = new PrismaClient();

/**
 * GET /v1/account/subscription
 * Get user's subscription details (API key authentication)
 *
 * Returns comprehensive subscription information including:
 * - Tier and status
 * - Billing cycle
 * - Current period dates
 * - Next billing date
 * - Auto-renewal status
 *
 * @requires API Key authentication
 */
router.get('/', authenticateApiKey, async (req: Request, res: Response) => {
  try {
    if (!req.user) {
      return res.status(401).json({
        error: true,
        code: 'UNAUTHORIZED',
        message: 'Authentication required',
        timestamp: new Date().toISOString(),
      });
    }

    const userId = req.user.userId;

    logger.info('Subscription details request received', { userId });

    // Fetch user with subscription details
    const user = await prisma.user.findUnique({
      where: { id: userId },
      include: {
        subscriptions: true,
      },
    });

    if (!user) {
      return res.status(404).json({
        error: true,
        code: 'USER_NOT_FOUND',
        message: 'User not found',
        timestamp: new Date().toISOString(),
      });
    }

    const subscription = user.subscriptions.find(s => s.status === 'active') || user.subscriptions[0];

    if (!subscription) {
      return res.status(404).json({
        error: true,
        code: 'NO_SUBSCRIPTION',
        message: 'No active subscription found for this user',
        timestamp: new Date().toISOString(),
      });
    }

    // Calculate next billing date
    // If cancel_at_period_end is true, there's no next billing
    const nextBillingDate = subscription.cancel_at_period_end
      ? null
      : subscription.current_period_end.toISOString().split('T')[0]; // YYYY-MM-DD format

    return res.status(200).json({
      tier: subscription.plan_tier,
      status: subscription.status,
      billing_cycle: subscription.billing_cycle,
      current_period_start: subscription.current_period_start.toISOString().split('T')[0],
      current_period_end: subscription.current_period_end.toISOString().split('T')[0],
      next_billing_date: nextBillingDate,
      auto_renew: !subscription.cancel_at_period_end,
      paypal_subscription_id: subscription.paypal_subscription_id || undefined,
      created_at: subscription.created_at.toISOString(),
      updated_at: subscription.updated_at.toISOString(),
    });
  } catch (error) {
    logger.error('Error retrieving subscription details', {
      error,
      userId: req.user?.userId,
      requestId: req.requestId,
    });

    return res.status(500).json({
      error: true,
      code: 'INTERNAL_ERROR',
      message: 'Failed to retrieve subscription details',
      timestamp: new Date().toISOString(),
    });
  }
});

export default router;
