/**
 * Extended database schema — branch protection, status checks,
 * notifications, organizations, and teams.
 *
 * These extend the base schema to add enterprise-grade features.
 */

import {
  pgTable,
  text,
  timestamp,
  uuid,
  boolean,
  integer,
  uniqueIndex,
  index,
  serial,
  jsonb,
} from "drizzle-orm/pg-core";
import { users, repositories } from "./schema";

// ─── Branch Protection Rules ────────────────────────────────────────────────


// ─── Status Checks (CI Integration) ────────────────────────────────────────

export const statusChecks = pgTable(
  "status_checks",
  {
    id: uuid("id").primaryKey().defaultRandom(),
    repositoryId: uuid("repository_id")
      .notNull()
      .references(() => repositories.id, { onDelete: "cascade" }),
    commitSha: text("commit_sha").notNull(),
    context: text("context").notNull(), // e.g. "ci/build", "gatetest/scan"
    state: text("state").notNull().default("pending"), // pending, success, failure, error
    description: text("description"),
    targetUrl: text("target_url"), // link to CI build
    createdBy: text("created_by"), // token name or integration name
    createdAt: timestamp("created_at").defaultNow().notNull(),
    updatedAt: timestamp("updated_at").defaultNow().notNull(),
  },
  (table) => [
    index("status_checks_repo_sha").on(table.repositoryId, table.commitSha),
    index("status_checks_repo_context").on(table.repositoryId, table.context),
  ]
);

// ─── Notifications ──────────────────────────────────────────────────────────


// ─── Organizations ──────────────────────────────────────────────────────────

/**
 * Organizations lives in schema.ts — re-exported here so the historical
 * import path keeps working.
 *
 * This file used to declare its OWN pgTable("organizations") with a different
 * column set: display_name/website/location/is_verified but no `slug` and no
 * `created_by_id`. Two Drizzle objects, one physical table, irreconcilable
 * shapes. drizzle.config.ts only includes schema.ts and deploys run
 * db:migrate (never db:push), so this definition was never migrated — it
 * described a table that has never existed. Every insert through it wrote
 * columns Postgres does not have while omitting two NOT NULL columns, which
 * is why POST /orgs/new could never succeed.
 *
 * Migration 0113 adds the four extra columns to the real table so nothing the
 * create form collects is discarded. Keeping ONE definition is what stops the
 * two drifting apart again.
 */
import {
  organizations,
  orgMembers,
  teams,
  teamMembers,
  teamRepos,
  branchProtection,
  notifications,
} from "./schema";
export {
  organizations,
  orgMembers,
  teams,
  teamMembers,
  teamRepos,
  branchProtection,
  notifications,
};


// ─── Type Exports ───────────────────────────────────────────────────────────

export type BranchProtectionRule = typeof branchProtection.$inferSelect;
export type StatusCheck = typeof statusChecks.$inferSelect;
export type Notification = typeof notifications.$inferSelect;
export type Organization = typeof organizations.$inferSelect;
export type OrgMember = typeof orgMembers.$inferSelect;
export type Team = typeof teams.$inferSelect;
export type TeamMember = typeof teamMembers.$inferSelect;
