import { BaseModel } from "./BaseModel";
import path from "path";
import { Query } from "./Queries";
import { Subscription } from "./Subscription";

export class PricingPlan extends BaseModel {
  static tableName = "pricing_plans";
  static jsonAttributes = ["benefits"];

  id!: number;
  plan_name!: string;
  price!: string;
  discount!: string;
  duration!: "weekly" | "monthly" | "quarterly" | "yearly";
  benefits!: Record<string, any>; // JSONB column
  is_popular!: boolean;
  is_trial!: boolean;
  queries_id!: number; // FK to queries table
  deleted_at?: string | null;
  created_at?: string;
  updated_at?: string;

  $parseDatabaseJson(json: any) {
    json = super.$parseDatabaseJson(json);
    if (json.benefits && typeof json.benefits === "string") {
      try {
        json.benefits = JSON.parse(json.benefits);
      } catch (error) {
        console.error(`Failed to parse benefits for id ${json.id}:`, error);
        json.benefits = []; // Fallback to empty array
      }
    }
    return json;
  }

  $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 = {
    query: {
      relation: BaseModel.BelongsToOneRelation,
      modelClass: path.join(__dirname, "Queries"), // ✅ resolves later
      join: {
        from: "pricing_plans.queries_id",
        to: "queries.id",
      },
    },
    subscription: {
      relation: BaseModel.HasOneRelation,
      modelClass: path.join(__dirname, "Subscription"),
      join: {
        from: "pricing_plans.id",
        to: "subscriptions.plan_id",
      },
    },
  };
}
