import { Body, Controller, Delete, Get, Post, Req, UseGuards } from "@nestjs/common";
import { PushSubscribeRequest, PushUnsubscribeRequest } from "@slackwsh/contracts";
import * as messaging from "@slackwsh/messaging";
import { AuthGuard } from "../auth/auth.guard";
import { CurrentUser } from "../auth/current-user.decorator";
import type { RequestUser } from "../auth/auth.guard";

@UseGuards(AuthGuard)
@Controller("push")
export class PushController {
  @Get("vapid-public-key")
  vapidPublicKey() {
    const publicKey = process.env.VAPID_PUBLIC_KEY ?? "";
    return { publicKey };
  }

  @Post("subscribe")
  async subscribe(
    @CurrentUser() user: RequestUser,
    @Body() body: unknown,
    @Req() req: { headers?: { "user-agent"?: string } },
  ) {
    const input = PushSubscribeRequest.parse(body);
    await messaging.upsertPushSubscription(user.userId, {
      endpoint: input.endpoint,
      keys: input.keys,
      userAgent: input.userAgent ?? req.headers?.["user-agent"] ?? null,
    });
    return { subscribed: true };
  }

  @Delete("subscribe")
  async unsubscribe(@CurrentUser() user: RequestUser, @Body() body: unknown) {
    const input = PushUnsubscribeRequest.parse(body);
    return messaging.deletePushSubscription(user.userId, input.endpoint);
  }
}
