import {
  Sequelize,
  DataTypes,
  Model,
  InferAttributes,
  InferCreationAttributes,
  CreationOptional,
  NonAttribute,
} from "sequelize";
import type {
  PlanTier,
  SubscriptionStatus,
  BillingCycle,
} from "@/types";

export class Workspace extends Model<
  InferAttributes<Workspace>,
  InferCreationAttributes<Workspace>
> {
  declare id: CreationOptional<string>;
  declare name: string;
  declare planTier: CreationOptional<PlanTier>;
  declare subscriptionStatus: CreationOptional<SubscriptionStatus>;
  declare stripeCustomerId: string | null;
  declare stripeSubscriptionId: string | null;
  declare responseQuotaUsed: CreationOptional<number>;
  declare responseQuotaLimit: CreationOptional<number>;
  declare customDomain: string | null;
  declare brandLogoUrl: string | null;
  declare brandPrimaryColor: string | null;
  declare isSuspended: CreationOptional<boolean>;
  declare billingCycle: CreationOptional<BillingCycle>;
  declare createdAt: CreationOptional<Date>;
  declare updatedAt: CreationOptional<Date>;
}

export function initWorkspaceModel(sequelize: Sequelize) {
  Workspace.init(
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },
      name: { type: DataTypes.STRING(255), allowNull: false },
      planTier: {
        type: DataTypes.ENUM("free", "pro", "enterprise"),
        allowNull: false,
        defaultValue: "free",
      },
      subscriptionStatus: {
        type: DataTypes.ENUM("active", "past_due", "canceled"),
        allowNull: false,
        defaultValue: "active",
      },
      stripeCustomerId: { type: DataTypes.STRING(255), allowNull: true },
      stripeSubscriptionId: { type: DataTypes.STRING(255), allowNull: true },
      responseQuotaUsed: {
        type: DataTypes.INTEGER.UNSIGNED,
        allowNull: false,
        defaultValue: 0,
      },
      responseQuotaLimit: {
        type: DataTypes.INTEGER.UNSIGNED,
        allowNull: false,
        defaultValue: 100,
      },
      customDomain: { type: DataTypes.STRING(255), allowNull: true },
      brandLogoUrl: { type: DataTypes.STRING(512), allowNull: true },
      brandPrimaryColor: { type: DataTypes.STRING(7), allowNull: true },
      isSuspended: {
        type: DataTypes.BOOLEAN,
        allowNull: false,
        defaultValue: false,
      },
      billingCycle: {
        type: DataTypes.ENUM("monthly", "annual"),
        allowNull: false,
        defaultValue: "monthly",
      },
      createdAt: DataTypes.DATE,
      updatedAt: DataTypes.DATE,
    },
    { sequelize, modelName: "Workspace", tableName: "Workspaces" }
  );
  return Workspace;
}

export type { NonAttribute };
