import { Model, RelationMappings } from "objection";
import { AuditLog } from "./AuditLog";
import { Setting } from "./Setting";
import { Subscription } from "./Subscription";
import { UserTransaction } from "./UserTransaction";
import { PricingPlan } from "./PricingPlan";

export class User extends Model {
  static tableName = "users";

  id!: number;
  user_details!: Record<string, any>;
  password!: string;
  email_verified?: Date | null;
  stripe_id?: string;
  verification_token?: string | null;
  verification_token_expiry?: Date | null;
  login_via!: "web" | "google";
  is_premium!: "logged_in" | "guest" | "premium";
  status!: "active" | "inactive" | "suspended";
  created_at!: string;
  updated_at!: string;
  deleted_at?: string | null;

  subscription?: Subscription | null;

  $formatDatabaseJson(json: any) {
    json = super.$formatDatabaseJson(json);

    const formatDate = (d: Date | string) => {
      if (!d) return null;
      const date = new Date(d);
      const pad = (n: number) => n.toString().padStart(2, "0");
      return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(
        date.getDate()
      )} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(
        date.getSeconds()
      )}`;
    };

    if (json.created_at) json.created_at = formatDate(json.created_at);
    if (json.updated_at) json.updated_at = formatDate(json.updated_at);
    if (json.deleted_at) json.deleted_at = formatDate(json.deleted_at);

    return json;
  }

  static relationMappings = (): RelationMappings => ({
    auditLogs: {
      relation: Model.HasManyRelation,
      modelClass: AuditLog,
      join: {
        from: "users.id",
        to: "audit_logs.user_id",
      },
    },
    setting: {
      relation: Model.HasOneRelation,
      modelClass: Setting,
      join: {
        from: "users.id",
        to: "settings.user_id",
      },
    },
    subscription: {
      relation: Model.HasOneRelation,
      modelClass: Subscription,
      join: {
        from: "users.id",
        to: "subscriptions.user_id",
      },
    },

    transactions: {
      relation: Model.HasManyRelation,
      modelClass: UserTransaction,
      join: {
        from: "users.id",
        to: "user_transactions.user_id",
      },
    },
  });
  static get jsonAttributes() {
    return ["user_details"];
  }
}
