import { useSyncExternalStore } from "react";
import { mockProposals } from "@/lib/mock/proposals";
import { mockProposalDetails } from "@/lib/mock/proposal-details";
import type { ProposalDetail, ProposalSummary } from "@/lib/mock/types";

// Mock store em memória. Seed inicial vem dos mocks da fase 1.
// Quando trocarmos por backend, basta substituir esta camada.
let proposals: ProposalSummary[] = [...mockProposals];
let details: Record<string, ProposalDetail> = { ...mockProposalDetails };
const listeners = new Set<() => void>();

const emit = () => listeners.forEach((l) => l());

// Fallback sintético para quando uma proposta antiga não tem detalhe
// cadastrado — útil até migrar para backend real.
const synthesizeDetail = (s: ProposalSummary): ProposalDetail => ({
  id: s.id,
  contactName: "Contato não informado",
  email: "—",
  whatsapp: "—",
  items: [
    {
      serviceId: "svc-generic",
      name: s.title,
      unitPrice: s.total,
      quantity: 1,
      recurring: s.recurringTotal ? "mensal" : null,
    },
  ],
  scope: "Escopo não detalhado para esta proposta.",
  deliverables: ["Entregas a definir"],
  deadlineDays: 15,
  paymentMethod: "pix",
  installments: 1,
});

export const proposalsStore = {
  getAll(): ProposalSummary[] {
    return proposals;
  },
  getById(id: string): ProposalSummary | undefined {
    return proposals.find((p) => p.id === id);
  },
  getDetail(id: string): ProposalDetail | undefined {
    if (details[id]) return details[id];
    const summary = proposals.find((p) => p.id === id);
    return summary ? synthesizeDetail(summary) : undefined;
  },
  add(p: ProposalSummary, detail?: ProposalDetail) {
    proposals = [p, ...proposals];
    if (detail) details = { ...details, [p.id]: detail };
    emit();
  },
  update(
    id: string,
    summaryPatch: Partial<ProposalSummary>,
    detailPatch?: Partial<ProposalDetail>,
  ) {
    proposals = proposals.map((p) => (p.id === id ? { ...p, ...summaryPatch } : p));
    if (detailPatch) {
      const current = details[id] ?? synthesizeDetail(proposals.find((p) => p.id === id)!);
      details = { ...details, [id]: { ...current, ...detailPatch, id } };
    }
    emit();
  },
  markApproved(idOrSlug: string) {
    const target = proposals.find((p) => p.id === idOrSlug || p.slug === idOrSlug);
    if (!target) return;
    if (target.status === "aprovada") return;
    proposals = proposals.map((p) =>
      p.id === target.id ? { ...p, status: "aprovada" } : p,
    );
    emit();
  },
  setStatus(id: string, status: "rascunho" | "enviada" | "aprovada") {
    const target = proposals.find((p) => p.id === id);
    if (!target || target.status === status) return;
    proposals = proposals.map((p) => (p.id === id ? { ...p, status } : p));
    emit();
  },
  nextNumber(): string {
    const year = new Date().getFullYear();
    const sameYear = proposals.filter((p) => p.number.startsWith(`${year}-`));
    const max = sameYear.reduce((acc, p) => {
      const n = parseInt(p.number.split("-")[1] ?? "0", 10);
      return n > acc ? n : acc;
    }, 0);
    return `${year}-${String(max + 1).padStart(4, "0")}`;
  },
  subscribe(cb: () => void) {
    listeners.add(cb);
    return () => listeners.delete(cb);
  },
};


export function useProposals(): ProposalSummary[] {
  return useSyncExternalStore(
    proposalsStore.subscribe,
    proposalsStore.getAll,
    proposalsStore.getAll,
  );
}
