import { Request, Response, NextFunction } from 'express';
import { ApiKeyService } from '../services/ApiKeyService';

export class ApiKeyController {
  constructor(private apiKeyService = new ApiKeyService()) {}

  list = async (req: Request, res: Response, next: NextFunction) => {
    try {
      const keys = await this.apiKeyService.list(req.userId!);
      res.json({ data: keys });
    } catch (err) {
      next(err);
    }
  };

  create = async (req: Request, res: Response, next: NextFunction) => {
    try {
      const { apiKey, rawKey } = await this.apiKeyService.create(
        req.userId!,
        req.body.name,
        req.body.scopes,
        req.body.expiresAt ? new Date(req.body.expiresAt) : undefined,
      );
      res.status(201).json({
        id: apiKey.id,
        name: apiKey.name,
        keyPrefix: apiKey.keyPrefix,
        scopes: apiKey.scopes,
        key: rawKey,
        expiresAt: apiKey.expiresAt?.toISOString() ?? null,
        createdAt: apiKey.createdAt.toISOString(),
      });
    } catch (err) {
      next(err);
    }
  };

  revoke = async (req: Request, res: Response, next: NextFunction) => {
    try {
      await this.apiKeyService.revoke(req.userId!, req.params.id);
      res.status(204).send();
    } catch (err) {
      next(err);
    }
  };
}
