import type { Business, PersonalizedRoleTask, RoleTaskDefinition } from "@/lib/types";
import { getTasksForRole } from "@/lib/role-automation/task-catalog";
import { ensureSocialAnalysis } from "@/lib/role-automation/social-analysis-tasks";
import { getLeadershipDelegateRole, resolveUserRole } from "@/lib/user-workplace-role";

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

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

function buildPreview(
  task: RoleTaskDefinition,
  business: Business,
  roleName: string,
): Pick<PersonalizedRoleTask, "personalizedPreview" | "contextTags"> {
  const opp = topOpportunity(business);
  const rec = topRecommendation(business);
  const input = business.input;
  const user = resolveUserRole(business);
  const delegate = getLeadershipDelegateRole(business);

  const baseTags = [input.businessName, input.location].filter(Boolean);
  const oppTag = opp ? `$${opp.estimatedValue.toLocaleString()} opportunity` : undefined;

  switch (task.id) {
    case "draft-social-post": {
      const social = business.socialMediaAnalysis ?? ensureSocialAnalysis(business);
      const topRec = social.recommendations.find((r) => r.priority === "high");
      return {
        personalizedPreview: `Write a post for ${business.input.businessName} using social analysis (visibility ${social.visibilityScore}/100, pick share ${social.yourPickSharePercent}%) — angle: "${topRec?.title ?? opp?.title ?? "top priority"}".`,
        contextTags: [...baseTags, `Pick share ${social.yourPickSharePercent}%`, "Social analysis", "Social"].filter(Boolean) as string[],
      };
    }
    case "social-analysis-posts": {
      const social = business.socialMediaAnalysis ?? ensureSocialAnalysis(business);
      const topRec = social.recommendations.find((r) => r.priority === "high");
      return {
        personalizedPreview: `3-post pack from social analysis — visibility ${social.visibilityScore}/100, fix: "${topRec?.title ?? "reach gap"}".`,
        contextTags: [...baseTags, `Visibility ${social.visibilityScore}`, "Meta scheduler"],
      };
    }
    case "social-trust-sync": {
      const social = business.socialMediaAnalysis ?? ensureSocialAnalysis(business);
      return {
        personalizedPreview: `Sync trust messaging — ${social.trust.strongerChannel === "balanced" ? "channels balanced" : `${social.trust.strongerChannel} trust leads`} (web ${social.trust.websiteTrustScore} · social ${social.trust.socialTrustScore}).`,
        contextTags: [...baseTags, "Trust sync", social.trust.strongerChannel],
      };
    }
    case "social-competitive-beat": {
      const social = business.socialMediaAnalysis ?? ensureSocialAnalysis(business);
      const rival = social.pickShare.find((p) => !p.isYou);
      return {
        personalizedPreview: `Comparison post — you ${social.yourPickSharePercent}% pick share vs ${rival?.name ?? "top competitor"} at ${rival?.pickSharePercent ?? "?"}% (no direct naming in copy).`,
        contextTags: [...baseTags, rival?.name ?? "Competitor", "Pick share"],
      };
    }
    case "geo-ad-copy":
      return {
        personalizedPreview: `Build local ad copy targeting ${input.location} for ${opp?.title ?? input.productsServices.slice(0, 60)}.`,
        contextTags: [...baseTags, input.location, "Ads"],
      };
    case "landing-headline":
      return {
        personalizedPreview: `Draft a homepage headline for ${input.businessName}: "${business.profile.brandPositioning.slice(0, 80)}…"`,
        contextTags: [...baseTags, "Website", "Conversion"],
      };
    case "review-responses":
      return {
        personalizedPreview: `Draft replies to recent reviews for ${input.businessName} — address wait-time and quality themes vs ${business.competitors[0]?.name ?? "competitors"}.`,
        contextTags: [...baseTags, `${business.brandScore.trust}/100 trust`, "Reviews"],
      };
    case "review-requests":
      return {
        personalizedPreview: `Queue SMS review requests for ${input.businessName}'s recent jobs in ${input.location}.`,
        contextTags: [...baseTags, "SMS", "Reputation"],
      };
    case "reputation-report":
      return {
        personalizedPreview: `Compare ${input.businessName}'s reputation vs ${business.competitors[0]?.name ?? "top competitor"} — ${business.competitors[0]?.beatOpportunity?.slice(0, 70) ?? "close the review gap"}.`,
        contextTags: [...baseTags, "Trust score", "Competitive"],
      };
    case "outreach-dm":
      return {
        personalizedPreview: `Personalize outreach for "${opp?.title ?? "hot lead"}" — ${opp?.aiOutreach?.slice(0, 90) ?? rec?.dmMessage?.slice(0, 90) ?? "custom DM for your buyer"}.`,
        contextTags: [...baseTags, oppTag, roleName].filter(Boolean) as string[],
      };
    case "follow-up-sequence":
      return {
        personalizedPreview: `3-touch follow-up for ${input.businessName} leads stuck on "${input.biggestChallenge.slice(0, 60)}…"`,
        contextTags: [...baseTags, "Email", "CRM"],
      };
    case "proposal-outline":
      return {
        personalizedPreview: `Proposal outline for ${opp?.title ?? "active deal"} — $${(opp?.estimatedValue ?? 5000).toLocaleString()} value, scoped to ${input.productsServices.slice(0, 50)}.`,
        contextTags: [...baseTags, oppTag, "Proposal"].filter(Boolean) as string[],
      };
    case "lead-callback-list":
      return {
        personalizedPreview: `Prioritize callbacks for ${input.businessName}: "${business.metrics.topPriorityToday}" first, then new form leads.`,
        contextTags: [...baseTags, "Urgent", "Sales"],
      };
    case "schedule-optimization":
      return {
        personalizedPreview: `Protect high-value slots today for ${input.businessName} — focus blocks on ${opp?.title?.slice(0, 40) ?? "top opportunity"}.`,
        contextTags: [...baseTags, "Calendar", "Ops"],
      };
    case "ops-digest":
      return {
        personalizedPreview: `Daily digest for ${user.title}: ${business.metrics.opportunitiesFound} opportunities, $${business.metrics.revenuePotential.toLocaleString()} in pipeline.`,
        contextTags: [...baseTags, "Digest", roleName],
      };
    case "reactivation-sms":
      return {
        personalizedPreview: `Win-back SMS for lapsed ${input.businessName} clients — offer tied to ${rec?.offerIdea?.slice(0, 60) ?? "comeback promotion"}.`,
        contextTags: [...baseTags, "SMS", "Retention"],
      };
    case "appointment-reminders":
      return {
        personalizedPreview: `Reminder texts for tomorrow's ${input.businessName} appointments — reduce no-shows in ${input.location}.`,
        contextTags: [...baseTags, "SMS", "Bookings"],
      };
    case "intake-summary":
      return {
        personalizedPreview: `Summarize new leads for ${roleName} — hot action: ${opp?.recommendedAction ?? "call within 30 minutes"}.`,
        contextTags: [...baseTags, oppTag, "Intake"].filter(Boolean) as string[],
      };
    case "compliance-checklist":
      return {
        personalizedPreview: `${input.industryCategory} compliance checklist for ${input.businessName} — audit-ready for ${input.location} operations.`,
        contextTags: [...baseTags, input.industryCategory, "Compliance"],
      };
    case "rfp-doc-prep":
      return {
        personalizedPreview: `RFP pack for "${opp?.title ?? "active RFP"}" — docs for ${input.businessName} in ${input.industryCategory}.`,
        contextTags: [...baseTags, oppTag, "RFP"].filter(Boolean) as string[],
      };
    case "crm-audit":
      return {
        personalizedPreview: `Audit ${input.businessName}'s pipeline — ${business.opportunities.filter((o) => o.status === "new").length} stale leads need ${roleName} follow-up.`,
        contextTags: [...baseTags, "CRM", "Pipeline"],
      };
    case "automation-workflow":
      return {
        personalizedPreview: `Map lead nurture workflow for ${input.websiteUrl || input.businessName} — alert ${roleName} on new submissions.`,
        contextTags: [...baseTags, "Automation", "Zapier"],
      };
    case "priority-brief":
      return {
        personalizedPreview: `Today's priority brief for ${input.businessName}: ${business.metrics.topPriorityToday}.`,
        contextTags: [...baseTags, oppTag, "Brief"].filter(Boolean) as string[],
      };
    case "owner-digest":
      return {
        personalizedPreview: `Email digest to ${user.title} at ${input.businessName} — $${business.metrics.revenuePotential.toLocaleString()} potential, next: ${rec?.whatToDoNext?.slice(0, 50) ?? "review actions"}.`,
        contextTags: [...baseTags, user.title, "Email"],
      };
    case "task-handoff":
      return {
        personalizedPreview: `Handoff notes from ${roleName} — top priority remains "${business.metrics.topPriorityToday}".`,
        contextTags: [...baseTags, roleName, "Handoff"],
      };
    case "leader-priority-lock":
      return {
        personalizedPreview: `Lock #1 priority for ${user.title}: "${business.metrics.topPriorityToday}" — block distractions until done.`,
        contextTags: [...baseTags, oppTag, "Priority"].filter(Boolean) as string[],
      };
    case "leader-role-assignments":
      return {
        personalizedPreview: `Assign ${delegate} to own "${opp?.title ?? business.metrics.topPriorityToday}" — delegate ops and growth tasks.`,
        contextTags: [...baseTags, delegate, "Delegation"],
      };
    case "leader-accountability":
      return {
        personalizedPreview: `Accountability message to ${user.title}: hit "${opp?.recommendedAction ?? rec?.whatToDoNext ?? "today's move"}" by 3pm.`,
        contextTags: [...baseTags, user.title, "Deadline"],
      };
    case "leader-standup-brief":
      return {
        personalizedPreview: `Standup for ${input.businessName}: ship "${opp?.recommendedAction?.slice(0, 50) ?? "top action"}" before noon — ${business.metrics.opportunitiesFound} opps open.`,
        contextTags: [...baseTags, "Standup", "Leadership"],
      };
    default:
      return {
        personalizedPreview: `${task.description} — customized for ${input.businessName} in ${input.location}.`,
        contextTags: [...baseTags, roleName],
      };
  }
}

export function personalizeTask(
  task: RoleTaskDefinition,
  business: Business,
  roleName: string,
): PersonalizedRoleTask {
  const preview = buildPreview(task, business, roleName);
  return { ...task, ...preview };
}

export function personalizeTasksForRole(
  business: Business,
  roleName: string,
): PersonalizedRoleTask[] {
  return getTasksForRole(roleName).map((task) => personalizeTask(task, business, roleName));
}
