import { Request, Response, NextFunction, RequestHandler } from "express";
import { Subscription } from "../models/Subscription";
import jwt from "jsonwebtoken";
export class SubscriptionController {
  get: RequestHandler = async (
    req: Request,
    res: Response,
    next: NextFunction
  ): Promise<void> => {};
  refund: RequestHandler = async (
    req: Request,
    res: Response,
    next: NextFunction
  ): Promise<void> => {};

  show: RequestHandler = async (req, res, next) => {
    const token = req.cookies?.token;
    if (!token) {
      res.status(401).json({ message: "Unauthorized: No token provided" });
      return;
    }

    let decoded: any;
    try {
      decoded = jwt.verify(token, process.env.JWT_SECRET_FRONTEND as string);
    } catch (err) {
      res
        .status(401)
        .json({ message: "Unauthorized: Invalid or expired token" });
      return;
    }
    const userId = decoded?.id;

    try {
      const subscriptions = await Subscription.query()
        .where({ user_id: userId })
        .withGraphFetched("pricingPlans")
        .modifyGraph("pricingPlans", (builder: any) =>
          builder.select("id", "plan_name", "duration", "price")
        );

      if (!subscriptions || subscriptions.length === 0) {
        res.status(404).json({ message: "No subscriptions found" });
        return;
      }

      const formatted = subscriptions.map((sub: any) => ({
        plan_id: sub.plan_id,
        plan_name: sub.pricingPlans?.plan_name || "",
        duration: sub.pricingPlans?.duration || "",
        price: sub.pricingPlans?.price || 0,
        tokens: {
          used: sub.used_token,
          left: sub.left_token,
        },
        words: {
          used: sub.used_words,
          left: sub.left_words,
        },
        expiry_date: sub.expiry_date,
      }));

      res.json({ subscriptions: formatted });
    } catch (err) {
      console.error("Subscription fetch error:", err);
      res.status(500).json({ message: "Failed to fetch subscriptions" });
    }
  };
}
