import { doc, getDoc, setDoc, onSnapshot } from 'firebase/firestore';
import { db } from '../lib/firebase';

export interface BankDetails {
  bankName: string;
  accountTitle: string;
  accountNumber: string;
  iban: string;
  instructions: string;
}

export const DEFAULT_BANK_DETAILS: BankDetails = {
  bankName: 'Meezan Bank Limited',
  accountTitle: 'Time N Life',
  accountNumber: '01010103928102',
  iban: 'PK89MEZN0001010103928102',
  instructions: 'Please transfer total order amount to the bank account above and send screenshot on WhatsApp (+92 331 3333400) with your Order ID.',
};

const BANK_STORAGE_KEY = 'tnl_bank_details_v1';
const SETTINGS_COLLECTION = 'settings';
const BANK_DOC_ID = 'bank_transfer_info';

let inMemoryBankDetailsCache: BankDetails | null = null;

export function getBankDetails(): BankDetails {
  if (inMemoryBankDetailsCache) {
    return inMemoryBankDetailsCache;
  }
  if (typeof window === 'undefined') return DEFAULT_BANK_DETAILS;
  try {
    const raw = localStorage.getItem(BANK_STORAGE_KEY);
    if (raw) {
      const parsed = JSON.parse(raw);
      inMemoryBankDetailsCache = { ...DEFAULT_BANK_DETAILS, ...parsed };
      return inMemoryBankDetailsCache!;
    }
  } catch (err) {
    console.warn('Failed to parse bank details from localStorage:', err);
  }
  return DEFAULT_BANK_DETAILS;
}

export function saveBankDetailsLocal(details: BankDetails): void {
  inMemoryBankDetailsCache = details;
  if (typeof window === 'undefined') return;
  try {
    localStorage.setItem(BANK_STORAGE_KEY, JSON.stringify(details));
  } catch (err) {
    console.warn('Failed to save bank details to localStorage:', err);
  }
}

export async function saveBankDetails(details: BankDetails): Promise<void> {
  saveBankDetailsLocal(details);
  try {
    const cleanDetails = JSON.parse(JSON.stringify(details));
    await setDoc(doc(db, SETTINGS_COLLECTION, BANK_DOC_ID), cleanDetails, { merge: true });
  } catch (err) {
    console.error('Failed to save bank details to Firestore:', err);
  }
}

export function subscribeToBankDetails(callback: (details: BankDetails) => void): () => void {
  // Notify immediately with cached/local value
  callback(getBankDetails());

  try {
    const unsub = onSnapshot(
      doc(db, SETTINGS_COLLECTION, BANK_DOC_ID),
      (snapshot) => {
        if (snapshot.exists()) {
          const data = snapshot.data() as BankDetails;
          const merged = { ...DEFAULT_BANK_DETAILS, ...data };
          saveBankDetailsLocal(merged);
          callback(merged);
        }
      },
      (err) => {
        console.warn('Firestore bank details snapshot error:', err);
        callback(getBankDetails());
      }
    );
    return unsub;
  } catch (err) {
    console.warn('Error subscribing to bank details:', err);
    callback(getBankDetails());
    return () => {};
  }
}
