import { BaseModel } from "./BaseModel";
import { Language } from "./Language";
import { ToolPrompt } from "./ToolPrompt";

export class CustomPage extends BaseModel {
  static tableName = "custom_pages";
  static jsonAttributes = ["page_keys"];

  id!: number;
  page_name!: string;
  page_slug!: string;
  lang!: number;
  meta_title!: string;
  meta_description!: string;
  page_file_name!: string;
  template!: string;
  title!: string;
  description!: string;
  heading_1?: string;
  subtext?: string;
  is_active!: boolean;
  is_index!: "index" | "non_index";
  page_keys!: Record<string, any>;
  page_head_tag?: string;
  before_body_tag?: string;
  canonical?: string;
  noindex?: boolean;
  created_at?: string;
  updated_at?: string;
  deleted_at?: string | null;

  language?: Language;

  // Override $parseDatabaseJson to handle invalid JSON gracefully
  $parseDatabaseJson(json: any) {
    json = super.$parseDatabaseJson(json);
    if (json.page_keys && typeof json.page_keys === "string") {
      try {
        json.page_keys = JSON.parse(json.page_keys);
      } catch (error) {
        console.error(`Failed to parse page_keys for id ${json.id}:`, error);
        json.page_keys = []; // 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 = () => ({
    language: {
      relation: BaseModel.BelongsToOneRelation,
      modelClass: Language,
      join: {
        from: "custom_pages.lang",
        to: "languages.id",
      },
    },
    toolPrompts: {
      relation: BaseModel.HasManyRelation,
      modelClass: ToolPrompt,
      join: {
        from: "custom_pages.id",
        to: "tool_prompts.page_id",
      },
    },
  });
}
