import jwt from 'jsonwebtoken';

const JWT_SECRET = process.env.JWT_SECRET || 'fallback-secret-key';
const TOKEN_EXPIRY = '24h'; // Token expires in 24 hours

export interface AdminUser {
  username: string;
  isAdmin: true;
}

export interface JWTPayload extends AdminUser {
  iat: number;
  exp: number;
}

/**
 * Verify admin credentials against environment variables
 */
export function verifyCredentials(username: string, password: string): boolean {
  const adminUsername = process.env.ADMIN_USERNAME;
  const adminPassword = process.env.ADMIN_PASSWORD;

  if (!adminUsername || !adminPassword) {
    console.error('Admin credentials not configured in environment variables');
    return false;
  }

  return username === adminUsername && password === adminPassword;
}

/**
 * Generate JWT token for authenticated admin
 */
export function generateToken(user: AdminUser): string {
  return jwt.sign(user, JWT_SECRET, {
    expiresIn: TOKEN_EXPIRY,
  });
}

/**
 * Verify and decode JWT token
 * Returns the decoded payload or null if invalid
 */
export function verifyToken(token: string): JWTPayload | null {
  try {
    const decoded = jwt.verify(token, JWT_SECRET) as JWTPayload;
    return decoded;
  } catch (error) {
    console.error('JWT verification failed:', error);
    return null;
  }
}

/**
 * Extract token from Authorization header
 * Supports both "Bearer token" and plain token formats
 */
export function extractToken(authHeader: string | null): string | null {
  if (!authHeader) return null;

  if (authHeader.startsWith('Bearer ')) {
    return authHeader.substring(7);
  }

  return authHeader;
}

/**
 * Check if user is authenticated admin
 */
export function isAuthenticated(token: string | null): boolean {
  if (!token) return false;

  const payload = verifyToken(token);
  return payload !== null && payload.isAdmin === true;
}
