import { Request, Response, NextFunction } from 'express';
import jwt from 'jsonwebtoken';
import { db } from './store';
import { User, PlanId } from './types';
import { getPlan } from './plans';

export const JWT_SECRET = process.env.JWT_SECRET || 'ai-pdf-remediation-dev-secret';

export interface AuthedRequest extends Request {
  user?: User;
}

export function signToken(user: User): string {
  return jwt.sign({ sub: user.id }, JWT_SECRET, { expiresIn: '7d' });
}

export function requireAuth(req: AuthedRequest, res: Response, next: NextFunction): void {
  const header = req.headers.authorization || '';
  const token = header.startsWith('Bearer ') ? header.slice(7) : null;
  if (!token) {
    res.status(401).json({ error: 'Authentication required' });
    return;
  }
  try {
    const payload = jwt.verify(token, JWT_SECRET) as { sub: string };
    const user = db.users.find((u) => u.id === payload.sub);
    if (!user) {
      res.status(401).json({ error: 'User not found' });
      return;
    }
    req.user = user;
    next();
  } catch {
    res.status(401).json({ error: 'Invalid or expired token' });
  }
}

export function publicUser(user: User) {
  const plan = getPlan(user.planId as PlanId);
  return {
    id: user.id,
    firstName: user.firstName,
    lastName: user.lastName,
    email: user.email,
    country: user.country,
    phone: user.phone,
    company: user.company,
    website: user.website,
    planId: user.planId,
    planName: plan?.name ?? 'Free Trial',
    planPages: plan?.pages ?? 5,
    pagesRemaining: user.pagesRemaining,
    domains: user.domains,
    createdAt: user.createdAt,
  };
}
