import {
  pgTable,
  uuid,
  varchar,
  timestamp,
  text,
  inet,
} from "drizzle-orm/pg-core";
import { relations } from "drizzle-orm";
import { createInsertSchema, createSelectSchema } from "drizzle-zod";
import { users } from "./users";

// Храним пользовательские сессии. accessToken хранится как bcrypt-хэш
export const authSessions = pgTable("auth_sessions", {
  id: uuid("id").primaryKey().defaultRandom(),
  userId: uuid("user_id")
    .notNull()
    .references(() => users.id),
  // bcrypt-хэш токена доступа. Длина 60-72 символа, но оставим запас
  accessTokenHash: varchar("access_token_hash", { length: 72 }).notNull(),
  // Доп. метаданные устройства/браузера
  userAgent: text("user_agent"),
  ipAddress: inet("ip_address"),
  // Срок действия и отзыв
  expiresAt: timestamp("expires_at", { withTimezone: true }),
  revokedAt: timestamp("revoked_at", { withTimezone: true }),
  createdAt: timestamp("created_at", { withTimezone: true })
    .defaultNow()
    .notNull(),
  updatedAt: timestamp("updated_at", { withTimezone: true })
    .defaultNow()
    .notNull(),
});

// Relations
export const authSessionsRelations = relations(authSessions, ({ one }) => ({
  user: one(users, {
    fields: [authSessions.userId],
    references: [users.id],
  }),
}));

// Zod schemas for validation
export const insertAuthSessionSchema = createInsertSchema(authSessions);
export const selectAuthSessionSchema = createSelectSchema(authSessions);

// Type exports
export type AuthSession = typeof authSessions.$inferSelect;
export type NewAuthSession = typeof authSessions.$inferInsert;
