import { pgTable, text, serial, integer, timestamp, uniqueIndex } from "drizzle-orm/pg-core";
import { sql } from "drizzle-orm";
import { createInsertSchema } from "drizzle-zod";
import { z } from "zod/v4";
import { usersTable } from "./users";
import { membershipPlansTable } from "./membership-plans";

export const membershipPaymentsTable = pgTable("membership_payments", {
  id: serial("id").primaryKey(),
  userId: integer("user_id").notNull().references(() => usersTable.id),
  planId: integer("plan_id").notNull().references(() => membershipPlansTable.id),
  method: text("method").notNull(),
  transactionId: text("transaction_id").notNull(),
  amount: integer("amount").notNull(),
  paymentNumber: text("payment_number").notNull(),
  status: text("status", { enum: ["pending", "approved", "rejected"] }).notNull().default("pending"),
  note: text("note"),
  reviewedAt: timestamp("reviewed_at", { withTimezone: true }),
  createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
}, (table) => [
  uniqueIndex("membership_payments_one_pending_per_user")
    .on(table.userId)
    .where(sql`${table.status} = 'pending'`),
]);

export const insertMembershipPaymentSchema = createInsertSchema(membershipPaymentsTable).omit({ id: true, createdAt: true });
export type InsertMembershipPayment = z.infer<typeof insertMembershipPaymentSchema>;
export type MembershipPayment = typeof membershipPaymentsTable.$inferSelect;
