import { BRAND_VOICES } from "@/lib/constants";
import {
  createDefaultSequencePosts,
  DEFAULT_CONTEXT_NAME,
} from "@/lib/context/sequence-templates";
import { createDefaultAccount, getPlatformConfig, listVisiblePlatforms } from "@/lib/social/platforms";
import type {
  BrandProfile,
  ConnectedAccount,
  PostingContextData,
  PostSequenceItem,
  Project,
} from "@/types/workflow";

export const DEFAULT_ACCOUNTS: ConnectedAccount[] = listVisiblePlatforms().map((p) =>
  createDefaultAccount(p),
);

export function migrateConnectedAccount(
  raw: Partial<ConnectedAccount> & { account?: string },
): ConnectedAccount {
  const platform = raw.platform ?? "linkedin";
  const config = getPlatformConfig(platform);
  const connected = Boolean(raw.connected);
  return {
    platform,
    label: raw.label ?? config?.label ?? platform,
    profileName: raw.profileName ?? raw.account ?? "Not connected",
    connected,
    connectionStatus: raw.connectionStatus ?? (connected ? "connected" : "disconnected"),
    accessToken: raw.accessToken ?? null,
    refreshToken: raw.refreshToken ?? null,
    expiresAt: raw.expiresAt ?? null,
    lastSyncedAt: raw.lastSyncedAt ?? null,
    externalId: raw.externalId ?? null,
  };
}

export function mergeProjectAccounts(stored: ConnectedAccount[] | undefined): ConnectedAccount[] {
  const list = Array.isArray(stored) ? stored : [];
  const migrated = list.map(migrateConnectedAccount);
  return listVisiblePlatforms().map((platform) => {
    const existing = migrated.find((a) => a.platform === platform.id);
    return existing ?? createDefaultAccount(platform);
  });
}

export const DEFAULT_SEQUENCE_POSTS: PostSequenceItem[] = createDefaultSequencePosts();

export interface ProjectSchedule {
  postsPerDay: 1 | 2;
  saved: boolean;
  scheduleSeed?: number;
}

export interface ProjectScopedData {
  brand: BrandProfile;
  context: PostingContextData;
  selectedPostId: string | null;
  accounts: ConnectedAccount[];
  schedule: ProjectSchedule;
  automation: Record<string, boolean>;
}

export function createDefaultScopedData(): ProjectScopedData {
  return {
    brand: {
      companyName: "",
      tagline: "",
      industry: "",
      brandVoice: BRAND_VOICES[0],
      logoDataUrl: null,
      logoFileName: null,
      contactPhone: "",
      contactEmail: "",
    },
    context: {
      name: DEFAULT_CONTEXT_NAME,
      posts: createDefaultSequencePosts().map((p) => ({ ...p })),
      saved: false,
    },
    selectedPostId: "seq-1",
    accounts: mergeProjectAccounts(undefined),
    schedule: { postsPerDay: 2, saved: false },
    automation: {
      "high-score": false,
      "loop-sequence": true,
      "smart-timing": true,
    },
  };
}

export function createEmptyProject(
  input: Omit<Project, "id" | "createdAt" | "updatedAt">,
): Project {
  const now = new Date().toISOString();
  return {
    ...input,
    id: crypto.randomUUID(),
    createdAt: now,
    updatedAt: now,
  };
}
