import {
  bigint,
  int,
  mysqlEnum,
  mysqlTable,
  text,
  timestamp,
  varchar,
} from "drizzle-orm/mysql-core";

export const users = mysqlTable("users", {
  id: int("id").autoincrement().primaryKey(),
  openId: varchar("openId", { length: 64 }).notNull().unique(),
  name: text("name"),
  email: varchar("email", { length: 320 }),
  loginMethod: varchar("loginMethod", { length: 64 }),
  role: mysqlEnum("role", ["user", "admin"]).default("user").notNull(),
  createdAt: timestamp("createdAt").defaultNow().notNull(),
  updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
  lastSignedIn: timestamp("lastSignedIn").defaultNow().notNull(),
});

export const localCredentials = mysqlTable("localCredentials", {
  id: int("id").autoincrement().primaryKey(),
  userId: int("userId").notNull().unique(),
  identifier: varchar("identifier", { length: 190 }).notNull().unique(),
  passwordHash: varchar("passwordHash", { length: 255 }).notNull(),
  createdAt: timestamp("createdAt").defaultNow().notNull(),
  updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
});

export const links = mysqlTable("links", {
  id: int("id").autoincrement().primaryKey(),
  userId: int("userId").notNull(),
  slug: varchar("slug", { length: 64 }).notNull().unique(),
  title: varchar("title", { length: 180 }).notNull(),
  targetUrl: text("targetUrl").notNull(),
  status: mysqlEnum("status", ["active", "paused"]).default("active").notNull(),
  clicks: int("clicks").default(0).notNull(),
  expiresAt: bigint("expiresAt", { mode: "number" }),
  createdAt: timestamp("createdAt").defaultNow().notNull(),
  updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
});

export const clickEvents = mysqlTable("clickEvents", {
  id: int("id").autoincrement().primaryKey(),
  linkId: int("linkId").notNull(),
  clickedAt: timestamp("clickedAt").defaultNow().notNull(),
  referrer: varchar("referrer", { length: 255 }),
  country: varchar("country", { length: 80 }),
  device: varchar("device", { length: 80 }),
  browser: varchar("browser", { length: 80 }),
});

export type User = typeof users.$inferSelect;
export type InsertUser = typeof users.$inferInsert;
export type Link = typeof links.$inferSelect;
export type ClickEvent = typeof clickEvents.$inferSelect;
