import type {
  Business,
  RoleAutomationRun,
  RoleGroups,
  RoleTaskDefinition,
  RoleTaskReceipt,
} from "@/lib/types";
import { getTasksForRole } from "@/lib/role-automation/task-catalog";
import {
  buildSocialAnalysisPostPack,
  buildSocialCompetitivePost,
  buildSocialTrustSyncContent,
  enrichDraftSocialPost,
  ensureSocialAnalysis,
} from "@/lib/role-automation/social-analysis-tasks";
import { AI_LEADER_ROLE_NAME, getLeadershipDelegateRole, resolveUserRole } from "@/lib/user-workplace-role";

function now() {
  return new Date().toISOString();
}

function topOpportunity(business: Business) {
  return [...business.opportunities].sort((a, b) => b.estimatedValue - a.estimatedValue)[0];
}

function topRecommendation(business: Business) {
  return business.recommendations[0];
}

function executeTask(task: RoleTaskDefinition, business: Business, roleName: string): RoleTaskReceipt {
  const opp = topOpportunity(business);
  const rec = topRecommendation(business);
  const input = business.input;
  const completedAt = now();

  const base = {
    taskId: task.id,
    taskTitle: task.title,
    status: "completed" as const,
    integrationTarget: task.integrationTarget,
    completedAt,
  };

  switch (task.id) {
    case "draft-social-post": {
      const fallback =
        rec?.socialPost ??
        opp?.aiOutreach ??
        `🚀 ${input.businessName} — ${opp?.recommendedAction ?? "Book your free consultation today."} → ${input.websiteUrl || "link in bio"}`;
      return {
        ...base,
        summary: `Drafted social post using social analysis (visibility ${business.socialMediaAnalysis?.visibilityScore ?? "—"}/100).`,
        artifact: enrichDraftSocialPost(business, fallback),
        metrics: {
          characters: 280,
          platform: "Instagram + Facebook",
          pickSharePercent: business.socialMediaAnalysis?.yourPickSharePercent ?? 0,
        },
      };
    }

    case "social-analysis-posts":
      return {
        ...base,
        summary: "Drafted 3-post pack from social media analysis recommendations.",
        artifact: buildSocialAnalysisPostPack(business),
        metrics: {
          posts: 3,
          visibilityScore: business.socialMediaAnalysis?.visibilityScore ?? ensureSocialAnalysis(business).visibilityScore,
          pickSharePercent: business.socialMediaAnalysis?.yourPickSharePercent ?? 0,
        },
      };

    case "social-trust-sync":
      return {
        ...base,
        summary: `Trust sync content for ${business.socialMediaAnalysis?.trust.strongerChannel ?? "balanced"} channel strategy.`,
        artifact: buildSocialTrustSyncContent(business),
        metrics: {
          websiteTrust: business.socialMediaAnalysis?.trust.websiteTrustScore ?? 0,
          socialTrust: business.socialMediaAnalysis?.trust.socialTrustScore ?? 0,
        },
      };

    case "social-competitive-beat":
      return {
        ...base,
        summary: `Competitive social post vs ${business.socialMediaAnalysis?.pickShare.find((p) => !p.isYou)?.name ?? "top competitor"}.`,
        artifact: buildSocialCompetitivePost(business),
        metrics: {
          yourPickShare: business.socialMediaAnalysis?.yourPickSharePercent ?? 0,
        },
      };

    case "geo-ad-copy":
      return {
        ...base,
        summary: `Created geo ad set targeting ${input.location}.`,
        artifact: [
          `Headline: ${rec?.adConcept?.split(".")[0] ?? opp?.title ?? `${input.businessName} — Local Experts`}`,
          `Body: ${input.businessName} helps ${input.targetCustomer.toLowerCase()} with ${input.productsServices.toLowerCase()}.`,
          `CTA: Book Free Estimate | Location: ${input.location}`,
          `Budget suggestion: $25–50/day for 7-day test`,
        ].join("\n"),
        metrics: { geo: input.location, adSets: 1 },
      };

    case "landing-headline":
      return {
        ...base,
        summary: "Updated primary landing headline draft.",
        artifact: rec?.landingHeadline ?? `${input.businessName}: ${business.profile.brandPositioning}`,
        metrics: { variants: 2 },
      };

    case "review-responses":
      return {
        ...base,
        summary: "Drafted 3 personalized review responses.",
        artifact: [
          `Response 1 (4★): "Thank you for the feedback on wait times — we've added SMS check-in updates."`,
          `Response 2 (5★): "We're thrilled ${input.businessName} exceeded expectations! Would you refer a friend?"`,
          `Response 3 (3★): "Sorry we missed the mark. I'd like to make this right — please call us directly."`,
        ].join("\n\n"),
        metrics: { reviewsDrafted: 3 },
      };

    case "review-requests":
      return {
        ...base,
        summary: "Queued review requests for recent completed jobs.",
        artifact: `SMS batch (mock): "Hi {{name}} — thanks for choosing ${input.businessName}! Mind leaving a quick Google review? {{link}} — ${input.businessName} Team"`,
        metrics: { recipients: 20, channel: "SMS" },
      };

    case "reputation-report":
      return {
        ...base,
        summary: `Reputation snapshot vs ${business.competitors[0]?.name ?? "competitors"}.`,
        artifact: [
          `Your score context: ${business.brandScore.trust}/100 trust`,
          `Competitor gap: ${business.competitors[0]?.name ?? "Top competitor"} — see beat opportunity: ${business.competitors[0]?.beatOpportunity ?? "N/A"}`,
          `Action: ${opp?.recommendedAction ?? "Request 5 new reviews this week"}`,
        ].join("\n"),
        metrics: { trustScore: business.brandScore.trust },
      };

    case "outreach-dm":
      return {
        ...base,
        summary: `Personalized outreach for "${opp?.title ?? "top lead"}".`,
        artifact:
          rec?.dmMessage ??
          opp?.aiOutreach ??
          `Hi {{name}} — ${input.businessName} specializes in ${input.productsServices.toLowerCase()}. ${opp?.recommendedAction ?? "Worth a quick chat?"}`,
        metrics: { leadsTargeted: 3 },
      };

    case "follow-up-sequence":
      return {
        ...base,
        summary: "Built 3-touch follow-up for unanswered inquiries.",
        artifact: [
          `Touch 1 (Day 0): ${rec?.emailDraft?.split("\n")[0] ?? `Subject: Quick follow-up from ${input.businessName}`}`,
          `Touch 2 (Day 2): "Just checking in — still happy to help with ${input.biggestChallenge.toLowerCase()}."`,
          `Touch 3 (Day 5): "Last note — we have availability this week if you'd like to move forward."`,
        ].join("\n\n"),
        metrics: { touches: 3 },
      };

    case "proposal-outline":
      return {
        ...base,
        summary: `Proposal outline for ${opp?.title ?? "active opportunity"}.`,
        artifact: [
          `# Proposal: ${input.businessName}`,
          `Scope: ${input.productsServices}`,
          `Investment: $${(opp?.estimatedValue ?? 5000).toLocaleString()} estimated value opportunity`,
          `Timeline: Start within 7 days`,
          `Next step: ${opp?.recommendedAction ?? rec?.whatToDoNext ?? "Schedule kickoff call"}`,
        ].join("\n"),
        metrics: { estimatedValue: opp?.estimatedValue ?? 0 },
      };

    case "lead-callback-list":
      return {
        ...base,
        summary: "Prioritized callback queue by urgency and value.",
        artifact: [
          `1. [URGENT] ${business.metrics.topPriorityToday} — call before 10am`,
          `2. [HIGH] Top opportunity follow-up — ${opp?.title ?? "Review queue"}`,
          `3. [MEDIUM] Form submissions from last 48 hours — 4 pending`,
        ].join("\n"),
        metrics: { leadsQueued: 4 },
      };

    case "schedule-optimization":
      return {
        ...base,
        summary: "Optimized today's schedule for high-value slots.",
        artifact: `Blocked 9–11am and 2–4pm for high-intent callbacks. Flagged ${business.metrics.topPriorityToday.slice(0, 40)} as same-day priority.`,
        metrics: { slotsProtected: 4 },
      };

    case "ops-digest":
      return {
        ...base,
        summary: "Operations digest prepared for owner.",
        artifact: [
          `Open opportunities: ${business.metrics.opportunitiesFound}`,
          `Top priority: ${business.metrics.topPriorityToday}`,
          `Revenue potential in pipeline: $${business.metrics.revenuePotential.toLocaleString()}`,
          `Role ${roleName} completed ${task.title.toLowerCase()}.`,
        ].join("\n"),
        metrics: { opportunities: business.metrics.opportunitiesFound },
      };

    case "reactivation-sms":
      return {
        ...base,
        summary: "Reactivation SMS campaign drafted for lapsed customers.",
        artifact:
          rec?.socialPost ??
          `Hi {{name}}! It's been a while since your last visit at ${input.businessName}. We'd love to see you — reply YES for 15% off this week.`,
        metrics: { recipients: 47, openRateEstimate: "22%" },
      };

    case "appointment-reminders":
      return {
        ...base,
        summary: "Appointment reminders queued for tomorrow's bookings.",
        artifact: `Reminder SMS: "Hi {{name}}, confirming your appointment with ${input.businessName} tomorrow at {{time}}. Reply C to confirm or R to reschedule."`,
        metrics: { appointments: 8 },
      };

    case "intake-summary":
      return {
        ...base,
        summary: "Compiled new lead intake with recommended actions.",
        artifact: [
          `New leads: 3 (2 high-intent, 1 nurture)`,
          `Hot lead action: ${opp?.recommendedAction ?? "Call within 30 minutes"}`,
          `Draft response: ${opp?.aiOutreach?.slice(0, 200) ?? rec?.dmMessage?.slice(0, 200) ?? "See outreach template"}`,
        ].join("\n"),
        metrics: { newLeads: 3 },
      };

    case "compliance-checklist":
      return {
        ...base,
        summary: `Compliance checklist for ${input.industryCategory}.`,
        artifact: [
          "☑ Business license current",
          "☑ Insurance certificates on file",
          "☑ Industry-specific compliance docs reviewed",
          "☐ Schedule quarterly audit reminder",
        ].join("\n"),
        metrics: { itemsChecked: 3 },
      };

    case "rfp-doc-prep":
      return {
        ...base,
        summary: `RFP documentation pack for "${opp?.title ?? "active RFP"}".`,
        artifact: [
          `Cover letter draft for ${input.businessName}`,
          `Pricing tier outline attached (mock)`,
          `Compliance appendix: ${input.industryCategory} requirements`,
          `Delivery SLA: same-week response per ${input.location} coverage`,
        ].join("\n"),
        metrics: { documents: 4 },
      };

    case "crm-audit":
      return {
        ...base,
        summary: "CRM pipeline audit completed.",
        artifact: [
          `Stale opportunities: ${business.opportunities.filter((o) => o.status === "new").length} need follow-up`,
          `In progress: ${business.opportunities.filter((o) => o.status === "in_progress").length}`,
          `Recommendation: ${rec?.whatToDoNext ?? "Move top 3 to in_progress today"}`,
        ].join("\n"),
        metrics: { staleLeads: business.opportunities.filter((o) => o.status === "new").length },
      };

    case "automation-workflow":
      return {
        ...base,
        summary: "Automation workflow mapped for lead nurture.",
        artifact: [
          `Trigger: New form submission on ${input.websiteUrl || "website"}`,
          `Action 1: SMS alert to ${roleName} within 5 min`,
          `Action 2: Email follow-up sequence (3 touches)`,
          `Action 3: CRM task created if no response in 24h`,
        ].join("\n"),
        metrics: { steps: 3 },
      };

    case "priority-brief":
      return {
        ...base,
        summary: "Today's priority brief generated.",
        artifact: business.aiSummary ?? rec?.whyItMatters ?? business.metrics.topPriorityToday,
        metrics: { priorityCount: 1 },
      };

    case "owner-digest":
      return {
        ...base,
        summary: "Owner digest email drafted.",
        artifact: [
          `Subject: ${roleName} completed today's tasks — ${input.businessName}`,
          ``,
          `Summary: ${business.metrics.topPriorityToday}`,
          `Revenue potential: $${business.metrics.revenuePotential.toLocaleString()}`,
          `Next: ${rec?.whatToDoNext ?? opp?.recommendedAction ?? "Review receipts in BrandLxft"}`,
        ].join("\n"),
        metrics: { recipients: 1 },
      };

    case "task-handoff":
      return {
        ...base,
        summary: "Handoff notes documented for team review.",
        artifact: `[${roleName} — ${new Date().toLocaleDateString()}]\nCompleted automated task batch.\nTop priority remains: ${business.metrics.topPriorityToday}\nAll receipts logged in BrandLxft Role Agents.`,
        metrics: { handoffReady: "yes" },
      };

    case "leader-priority-lock":
      return {
        ...base,
        summary: "Locked today's single revenue priority.",
        artifact: [
          `# Today's locked priority`,
          ``,
          `**${business.metrics.topPriorityToday}**`,
          ``,
          `Everything else waits until this ships.`,
          `Deadline: end of business today.`,
          `Revenue at stake: $${(opp?.estimatedValue ?? business.metrics.revenuePotential).toLocaleString()}`,
          `Owner action: ${opp?.recommendedAction ?? rec?.whatToDoNext ?? "Execute before noon"}`,
        ].join("\n"),
        metrics: { prioritiesLocked: 1 },
      };

    case "leader-role-assignments": {
      const delegate = getLeadershipDelegateRole(business);
      return {
        ...base,
        summary: `Delegated execution to ${delegate} and supporting roles.`,
        artifact: [
          `Role assignments for ${input.businessName}:`,
          ``,
          `1. **${delegate}** — own ${opp?.title ?? "top opportunity"} (${opp?.recommendedAction ?? "execute outreach"})`,
          `2. **Operations** — clear blockers on ${business.metrics.topPriorityToday.slice(0, 50)}…`,
          `3. **${resolveUserRole(business).title}** — approve outbound and check receipts by 3pm`,
          ``,
          `Run these agents in Role Agents → ${delegate}, Dispatcher, Reputation Manager as needed.`,
        ].join("\n"),
        metrics: { rolesAssigned: 3, leadDelegate: delegate },
      };
    }

    case "leader-accountability": {
      const user = resolveUserRole(business);
      return {
        ...base,
        summary: `Accountability message drafted for ${user.title}.`,
        artifact: [
          `Hey — your AI Leader here.`,
          ``,
          `You said revenue goal is "${input.revenueGoal}". Today's move is **${business.metrics.topPriorityToday}**.`,
          ``,
          `Non-negotiable by 3pm:`,
          `• ${opp?.recommendedAction ?? rec?.whatToDoNext ?? "Complete one high-value action"}`,
          `• Review Role Agent receipts before EOD`,
          ``,
          `If this doesn't happen today, ${business.metrics.revenuePotential.toLocaleString()} in pipeline value stays idle.`,
          `Reply DONE in BrandLxft when complete.`,
        ].join("\n"),
        metrics: { deadline: "3pm today" },
      };
    }

    case "leader-standup-brief":
      return {
        ...base,
        summary: "Morning standup brief prepared.",
        artifact: [
          `## Standup — ${input.businessName}`,
          ``,
          `**Win target:** ${business.metrics.topPriorityToday}`,
          `**Pipeline:** ${business.metrics.opportunitiesFound} opportunities · $${business.metrics.revenuePotential.toLocaleString()} potential`,
          `**Blocker:** ${business.roleIntelligence?.growthBottlenecks[0] ?? input.biggestChallenge}`,
          `**Ship before noon:** ${opp?.recommendedAction ?? rec?.whatToDoNext ?? "One outbound action"}`,
          `**Delegated to:** ${getLeadershipDelegateRole(business)}`,
        ].join("\n"),
        metrics: { standupReady: "yes" },
      };

    default:
      return {
        ...base,
        summary: `Completed ${task.title}.`,
        artifact: `${task.description} — executed for ${input.businessName}.`,
      };
  }
}

export function runRoleAutomation(
  business: Business,
  roleName: string,
  roleGroup?: keyof RoleGroups,
  taskIds?: string[],
): RoleAutomationRun {
  let tasks = getTasksForRole(roleName);
  if (taskIds?.length) {
    tasks = tasks.filter((t) => taskIds.includes(t.id));
  }
  const startedAt = now();
  const receipts = tasks.map((task) => executeTask(task, business, roleName));
  const opp = topOpportunity(business);
  const completedAt = now();
  const singleTask = tasks.length === 1 ? tasks[0] : undefined;

  const executiveSummary =
    singleTask
      ? `${roleName} completed "${singleTask.title}" for ${business.input.businessName}. ${receipts[0]?.summary ?? ""}`
      : roleName === AI_LEADER_ROLE_NAME
        ? [
            `Your AI Leader ran ${receipts.length} leadership tasks for ${business.input.businessName}.`,
            `You're ${resolveUserRole(business).title} — I locked today's priority, assigned role agents, and set your accountability check-in.`,
            opp
              ? `Focus: ${opp.title} ($${opp.estimatedValue.toLocaleString()} potential).`
              : `Focus: ${business.metrics.topPriorityToday}.`,
          ].join(" ")
        : [
            `${roleName} completed ${receipts.length} automated tasks for ${business.input.businessName}.`,
            opp
              ? `Primary focus: ${opp.title} ($${opp.estimatedValue.toLocaleString()} potential).`
              : `Focused on operational execution for ${business.input.industry}.`,
            `All deliverables are logged below with receipts you can copy, approve, or push to integrations when connected.`,
          ].join(" ");

  return {
    id: `run-${crypto.randomUUID()}`,
    roleName,
    roleGroup,
    startedAt,
    completedAt,
    status: receipts.length && receipts.every((r) => r.status === "completed") ? "completed" : "partial",
    executiveSummary,
    receipts,
    tasksCompleted: receipts.filter((r) => r.status === "completed").length,
    tasksTotal: receipts.length,
    estimatedRevenueImpact: opp?.estimatedValue,
    nextSteps: [
      opp?.recommendedAction ?? "Review receipts and approve outbound messages.",
      "Connect integrations in Settings to push tasks live (coming soon).",
      "Mark related opportunity as in progress once approved.",
    ],
  };
}
