import { create } from "zustand";
import { getCampaignReportAction } from "../actions/get-campaign-report-action";
import { retryFailedAction } from "../actions/retry-failed-action";

export type LogStatus = "PENDING" | "SUCCESS" | "FAILED";

export interface CampaignLogEntry {
  id: string;
  status: LogStatus;
  sentAt: string | null;
  errorMessage: string | null;
  retryCount: number;
  contact: {
    id: string;
    email: string;
    name: string | null;
  };
}

export interface CampaignSummary {
  total: number;
  success: number;
  failed: number;
  pending: number;
}

export interface CampaignOpener {
  contactId: string;
  email: string;
  name: string | null;
  firstOpenedAt: string;
  openCount: number;
}

export interface OpenTimelinePoint {
  label: string;
  opens: number;
}

export interface CampaignOpens {
  total: number;
  unique: number;
  rate: number;
  openers: CampaignOpener[];
  timeline: OpenTimelinePoint[];
}

interface CampaignReportState {
  campaignId: string | null;
  campaignTitle: string;
  summary: CampaignSummary;
  opens: CampaignOpens;
  logs: CampaignLogEntry[];
  searchTerm: string;
  page: number;
  pageSize: number;
  isLoading: boolean;
  isRetrying: boolean;

  loadReport: (campaignId: string) => Promise<void>;
  setSearchTerm: (term: string) => void;
  setPage: (page: number) => void;
  retryFailed: () => Promise<{ retried: number; succeeded: number; failed: number } | null>;
}

const EMPTY_SUMMARY: CampaignSummary = { total: 0, success: 0, failed: 0, pending: 0 };
const EMPTY_OPENS: CampaignOpens = { total: 0, unique: 0, rate: 0, openers: [], timeline: [] };

export const useCampaignReportStore = create<CampaignReportState>((set, get) => ({
  campaignId: null,
  campaignTitle: "",
  summary: EMPTY_SUMMARY,
  opens: EMPTY_OPENS,
  logs: [],
  searchTerm: "",
  page: 1,
  pageSize: 10,
  isLoading: false,
  isRetrying: false,

  loadReport: async (campaignId: string) => {
    set({ isLoading: true, campaignId });

    try {
      const data = await getCampaignReportAction(campaignId);
      set({
        campaignTitle: data.campaign.title,
        summary: data.summary,
        opens: {
          ...data.opens,
          openers: data.opens.openers.map((opener) => ({
            ...opener,
            firstOpenedAt: opener.firstOpenedAt.toISOString(),
          })),
        },
        logs: data.campaign.logs.map((log) => ({
          ...log,
          sentAt: log.sentAt ? new Date(log.sentAt).toISOString() : null,
        })),
        isLoading: false,
        page: 1,
      });
    } catch {
      set({ isLoading: false });
    }
  },

  setSearchTerm: (term: string) => set({ searchTerm: term, page: 1 }),

  setPage: (page: number) => set({ page }),

  retryFailed: async () => {
    const { campaignId } = get();
    if (!campaignId) return null;

    set({ isRetrying: true });

    try {
      const result = await retryFailedAction(campaignId);
      await get().loadReport(campaignId);
      set({ isRetrying: false });
      return result;
    } catch {
      set({ isRetrying: false });
      return null;
    }
  },
}));
