import fs from "fs";
import path from "path";
import prisma from "../db.server";

export interface PlatformSettingsData {
  defaultStoreDomain: string;
  partnerDashboardUrl: string;
  partnerStoreUrl: string;
  appStoreListingUrl: string;
  appProductionUrl: string;
}

const CONFIG_FILE_PATH = path.join(process.cwd(), "platform-config.json");

function getEnvDefaults(): PlatformSettingsData {
  const defaultStore = process.env.DEFAULT_STORE_DOMAIN?.trim() || "digi-horizon.myshopify.com";
  const storeHandle = defaultStore.replace(".myshopify.com", "");

  return {
    defaultStoreDomain: defaultStore,
    partnerDashboardUrl: process.env.SHOPIFY_PARTNER_DASHBOARD_URL?.trim() || "https://partners.shopify.com/3678763",
    partnerStoreUrl: process.env.SHOPIFY_PARTNER_STORE_URL?.trim() || `https://admin.shopify.com/store/${storeHandle}`,
    appStoreListingUrl: process.env.SHOPIFY_APP_STORE_URL?.trim() || "https://apps.shopify.com/conversecart",
    appProductionUrl: process.env.SHOPIFY_APP_URL?.trim() || "https://portal.webiletechnologies.com",
  };
}

export async function getPlatformSettings(): Promise<PlatformSettingsData> {
  const envDefaults = getEnvDefaults();
  let fileConfig: Partial<PlatformSettingsData> = {};

  if (fs.existsSync(CONFIG_FILE_PATH)) {
    try {
      const raw = fs.readFileSync(CONFIG_FILE_PATH, "utf-8");
      fileConfig = JSON.parse(raw);
    } catch (err) {
      console.warn("[Platform Settings File Read Warning]:", err);
    }
  }

  return {
    defaultStoreDomain: process.env.DEFAULT_STORE_DOMAIN?.trim() || fileConfig.defaultStoreDomain?.trim() || envDefaults.defaultStoreDomain,
    partnerDashboardUrl: process.env.SHOPIFY_PARTNER_DASHBOARD_URL?.trim() || fileConfig.partnerDashboardUrl?.trim() || envDefaults.partnerDashboardUrl,
    partnerStoreUrl: process.env.SHOPIFY_PARTNER_STORE_URL?.trim() || fileConfig.partnerStoreUrl?.trim() || envDefaults.partnerStoreUrl,
    appStoreListingUrl: process.env.SHOPIFY_APP_STORE_URL?.trim() || fileConfig.appStoreListingUrl?.trim() || envDefaults.appStoreListingUrl,
    appProductionUrl: process.env.SHOPIFY_APP_URL?.trim() || fileConfig.appProductionUrl?.trim() || envDefaults.appProductionUrl,
  };
}

export async function savePlatformSettings(data: Partial<PlatformSettingsData>): Promise<PlatformSettingsData> {
  const current = await getPlatformSettings();

  const cleanDomain = (data.defaultStoreDomain || current.defaultStoreDomain)
    .replace(/^https?:\/\//, "")
    .replace(/\/.*$/, "")
    .trim();

  const updated: PlatformSettingsData = {
    defaultStoreDomain: cleanDomain,
    partnerDashboardUrl: data.partnerDashboardUrl !== undefined ? data.partnerDashboardUrl.trim() : current.partnerDashboardUrl,
    partnerStoreUrl: data.partnerStoreUrl !== undefined ? data.partnerStoreUrl.trim() : current.partnerStoreUrl,
    appStoreListingUrl: data.appStoreListingUrl !== undefined ? data.appStoreListingUrl.trim() : current.appStoreListingUrl,
    appProductionUrl: data.appProductionUrl !== undefined ? data.appProductionUrl.trim() : current.appProductionUrl,
  };

  // 1. Write to JSON storage file (instant & persistent)
  try {
    fs.writeFileSync(CONFIG_FILE_PATH, JSON.stringify(updated, null, 2), "utf-8");
  } catch (fileErr) {
    console.error("[Platform Settings Save Error]:", fileErr);
  }

  // 2. Sync to process.env
  process.env.DEFAULT_STORE_DOMAIN = updated.defaultStoreDomain;
  process.env.SHOPIFY_PARTNER_DASHBOARD_URL = updated.partnerDashboardUrl;
  process.env.SHOPIFY_PARTNER_STORE_URL = updated.partnerStoreUrl;
  process.env.SHOPIFY_APP_STORE_URL = updated.appStoreListingUrl;
  process.env.SHOPIFY_APP_URL = updated.appProductionUrl;

  return updated;
}

export function getDefaultStoreDomainSync(): string {
  if (process.env.DEFAULT_STORE_DOMAIN) {
    return process.env.DEFAULT_STORE_DOMAIN.trim();
  }
  if (fs.existsSync(CONFIG_FILE_PATH)) {
    try {
      const raw = fs.readFileSync(CONFIG_FILE_PATH, "utf-8");
      const json = JSON.parse(raw);
      if (json.defaultStoreDomain) return json.defaultStoreDomain.trim();
    } catch (e) {}
  }
  return getEnvDefaults().defaultStoreDomain;
}
