/**
 * @copyright NHCarrigan
 * @license Naomi's Public License
 * @author Naomi Carrigan
 */

import type { AuthResponse, JwtPayload, User } from "../src/lib/auth.types";

describe("auth Types", () => {
  describe("user interface", () => {
    it("should accept valid user objects", () => {
      const userWithAvatar: User = {
        avatar:        "https://example.com/avatar.png",
        discordId:     "discord123",
        email:         "test@example.com",
        id:            "user123",
        inDiscord:     true,
        isAdmin:       true,
        isBanned:      false,
        isMod:         true,
        isStaff:       true,
        isVip:         false,
        profilePublic: true,
        username:      "testuser",
      };

      const userWithoutAvatar: User = {
        discordId:     "discord456",
        email:         "another@example.com",
        id:            "user456",
        inDiscord:     false,
        isAdmin:       false,
        isBanned:      false,
        isMod:         false,
        isStaff:       false,
        isVip:         true,
        profilePublic: false,
        username:      "anotheruser",
      };

      expect(userWithAvatar.avatar).toBe("https://example.com/avatar.png");
      expect(userWithoutAvatar.avatar).toBeUndefined();
      expect(userWithAvatar.isAdmin).toBeTruthy();
      expect(userWithoutAvatar.isVip).toBeTruthy();
    });

    it("should handle all boolean flags correctly", () => {
      const bannedUser: User = {
        discordId:     "discord789",
        email:         "banned@example.com",
        id:            "banned123",
        inDiscord:     false,
        isAdmin:       false,
        isBanned:      true,
        isMod:         false,
        isStaff:       false,
        isVip:         false,
        profilePublic: false,
        username:      "banneduser",
      };

      expect(bannedUser.isBanned).toBeTruthy();
      expect(bannedUser.isAdmin).toBeFalsy();
      expect(bannedUser.inDiscord).toBeFalsy();
    });
  });

  describe("jwtPayload interface", () => {
    it("should accept JWT payload with required fields", () => {
      const payload: JwtPayload = {
        email:    "test@example.com",
        isAdmin:  false,
        sub:      "user123",
        username: "testuser",
      };

      expect(payload.sub).toBe("user123");
      expect(payload.iat).toBeUndefined();
      expect(payload.exp).toBeUndefined();
    });

    it("should accept JWT payload with timestamps", () => {
      const now = Math.floor(Date.now() / 1000);
      const payloadWithTimestamps: JwtPayload = {
        email:    "another@example.com",
        exp:      now + 3600,
        iat:      now,
        isAdmin:  true,
        sub:      "user456",
        username: "anotheruser", // 1 hour
      };

      expect(payloadWithTimestamps.iat).toBe(now);
      expect(payloadWithTimestamps.exp).toBe(now + 3600);
    });
  });

  describe("authResponse interface", () => {
    it("should accept valid auth response", () => {
      const authResponse: AuthResponse = {
        accessToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
        user:        {
          avatar:        "https://example.com/avatar.png",
          discordId:     "discord123",
          email:         "test@example.com",
          id:            "user123",
          inDiscord:     true,
          isAdmin:       false,
          isBanned:      false,
          isMod:         false,
          isStaff:       false,
          isVip:         false,
          profilePublic: true,
          username:      "testuser",
        },
      };

      expect(authResponse.accessToken).toContain("eyJ");
      expect(authResponse.user.username).toBe("testuser");
    });
  });
});
