import { pgTable, text, boolean, integer, jsonb, uuid, date, index, uniqueIndex } from 'drizzle-orm/pg-core';
import { sql } from 'drizzle-orm';
import { id, tenantId, createdAt, updatedAt, ts, money, qty } from './_common';
import { tenantStatusEnum, subscriptionStatusEnum } from './enums';

/** A tenant is a subscribing company (e.g. WeStore). All business data hangs off a tenant. */
export const tenants = pgTable('tenants', {
  id: id(),
  code: text('code').notNull().unique(),
  name: text('name').notNull(),
  status: tenantStatusEnum('status').notNull().default('TRIAL'),
  timezone: text('timezone').notNull().default('Asia/Kuwait'),
  currency: text('currency').notNull().default('KWD'),
  locale: text('locale').notNull().default('en'),
  settings: jsonb('settings').notNull().default({}).$type<Record<string, unknown>>(),
  branding: jsonb('branding').notNull().default({}).$type<Record<string, unknown>>(),
  createdAt: createdAt(),
  updatedAt: updatedAt(),
});

export const plans = pgTable('plans', {
  id: id(),
  code: text('code').notNull().unique(),
  name: text('name').notNull(),
  description: text('description'),
  monthlyPrice: money('monthly_price').notNull().default(sql`0`),
  currency: text('currency').notNull().default('USD'),
  limits: jsonb('limits').notNull().default({}).$type<Record<string, number>>(),
  features: text('features').array().notNull().default([]),
  active: boolean('active').notNull().default(true),
  createdAt: createdAt(),
  updatedAt: updatedAt(),
});

export const subscriptions = pgTable(
  'subscriptions',
  {
    id: id(),
    tenantId: tenantId().references(() => tenants.id),
    planId: uuid('plan_id').notNull().references(() => plans.id),
    status: subscriptionStatusEnum('status').notNull().default('TRIAL'),
    startsAt: ts('starts_at').notNull(),
    endsAt: ts('ends_at'),
    trialEndsAt: ts('trial_ends_at'),
    seats: integer('seats').notNull().default(5),
    notes: text('notes'),
    createdAt: createdAt(),
    updatedAt: updatedAt(),
  },
  (t) => [index('subscriptions_tenant_status_idx').on(t.tenantId, t.status)],
);

export const featureFlags = pgTable(
  'feature_flags',
  {
    id: id(),
    tenantId: tenantId().references(() => tenants.id),
    key: text('key').notNull(),
    enabled: boolean('enabled').notNull().default(false),
    config: jsonb('config').notNull().default({}).$type<Record<string, unknown>>(),
  },
  (t) => [uniqueIndex('feature_flags_tenant_key_uq').on(t.tenantId, t.key)],
);

/** Daily metering per tenant, used for plan enforcement and SaaS invoicing. */
export const usageRecords = pgTable(
  'usage_records',
  {
    id: id(),
    tenantId: tenantId().references(() => tenants.id),
    metric: text('metric').notNull(),
    usageDate: date('usage_date').notNull(),
    quantity: qty('quantity').notNull(),
    createdAt: createdAt(),
    updatedAt: updatedAt(),
  },
  (t) => [uniqueIndex('usage_records_tenant_metric_date_uq').on(t.tenantId, t.metric, t.usageDate)],
);

/** SaaS operator staff. Deliberately separate from tenant users. */
export const platformUsers = pgTable('platform_users', {
  id: id(),
  email: text('email').notNull().unique(),
  passwordHash: text('password_hash').notNull(),
  name: text('name').notNull(),
  role: text('role').notNull().default('SUPPORT'),
  status: text('status').notNull().default('ACTIVE'),
  lastLoginAt: ts('last_login_at'),
  createdAt: createdAt(),
  updatedAt: updatedAt(),
});

export const tenantSettings = pgTable(
  'tenant_settings',
  {
    id: id(),
    tenantId: tenantId().references(() => tenants.id),
    key: text('key').notNull(),
    value: jsonb('value').notNull().$type<unknown>(),
  },
  (t) => [uniqueIndex('tenant_settings_tenant_key_uq').on(t.tenantId, t.key)],
);
