import type { Noun } from 'ai-database'

/**
 * Communication & Collaboration Entities
 * Meeting, Decision, ActionItem, Announcement, Feedback, Discussion
 */

export const Meeting: Noun = {
  singular: 'meeting',
  plural: 'meetings',
  description: 'A scheduled meeting or event',
  properties: {
    name: { type: 'string', description: 'Meeting name' },
    description: { type: 'string', description: 'Meeting description' },
    type: { type: 'string', description: 'Type of meeting', examples: ['one-on-one', 'team', 'all-hands', 'standup', 'planning', 'review', 'retrospective', 'interview', 'client', 'board', 'workshop', 'training'] },
    status: { type: 'string', description: 'Meeting status', examples: ['scheduled', 'confirmed', 'in-progress', 'completed', 'cancelled', 'rescheduled', 'no-show'] },
    recurring: { type: 'boolean', description: 'Is recurring meeting' },
    recurrencePattern: { type: 'string', description: 'Recurrence pattern', examples: ['daily', 'weekly', 'biweekly', 'monthly', 'quarterly'], optional: true },
    startTime: { type: 'date', description: 'Start date and time' },
    endTime: { type: 'date', description: 'End date and time' },
    duration: { type: 'number', description: 'Duration in minutes' },
    timezone: { type: 'string', description: 'Meeting timezone' },
    location: { type: 'string', description: 'Physical location', optional: true },
    virtualLink: { type: 'string', description: 'Virtual meeting link', optional: true },
    platform: { type: 'string', description: 'Meeting platform', examples: ['zoom', 'teams', 'meet', 'webex', 'in-person', 'hybrid'] },
    organizer: { type: 'string', description: 'Meeting organizer' },
    attendees: { type: 'string[]', description: 'Attendees list' },
    requiredAttendees: { type: 'string[]', description: 'Required attendees' },
    optionalAttendees: { type: 'string[]', description: 'Optional attendees' },
    actualAttendees: { type: 'string[]', description: 'Actual attendees' },
    agenda: { type: 'string[]', description: 'Meeting agenda items' },
    objectives: { type: 'string[]', description: 'Meeting objectives' },
    notes: { type: 'string', description: 'Meeting notes', optional: true },
    notesUrl: { type: 'string', description: 'Notes document URL', optional: true },
    recordingUrl: { type: 'string', description: 'Recording URL', optional: true },
    transcriptUrl: { type: 'string', description: 'Transcript URL', optional: true },
    calendarEventId: { type: 'string', description: 'Calendar event ID', optional: true },
    reminderMinutes: { type: 'number', description: 'Reminder before meeting (minutes)' },
    tags: { type: 'string[]', description: 'Meeting tags' },
    metadata: { type: 'object', description: 'Additional metadata', optional: true },
  },
  relationships: {
    decisions: { type: 'decision[]', description: 'Decisions made', backref: 'meeting' },
    actionItems: { type: 'actionItem[]', description: 'Action items', backref: 'meeting' },
    project: { type: 'project', description: 'Related project', backref: 'meetings' },
    deal: { type: 'deal', description: 'Related deal', backref: 'meetings' },
    customer: { type: 'customer', description: 'Related customer', backref: 'meetings' },
    series: { type: 'meeting', description: 'Parent series', backref: 'instances' },
    instances: { type: 'meeting[]', description: 'Series instances', backref: 'series' },
  },
  actions: ['create', 'update', 'schedule', 'reschedule', 'cancel', 'start', 'end', 'summarize', 'record'],
  events: ['created', 'updated', 'scheduled', 'rescheduled', 'cancelled', 'started', 'ended', 'summarized', 'recorded'],
}

export const Decision: Noun = {
  singular: 'decision',
  plural: 'decisions',
  description: 'A documented business decision',
  properties: {
    name: { type: 'string', description: 'Decision title' },
    description: { type: 'string', description: 'Decision description' },
    type: { type: 'string', description: 'Type of decision', examples: ['strategic', 'tactical', 'operational', 'technical', 'policy', 'resource', 'budget', 'hiring', 'process'] },
    status: { type: 'string', description: 'Decision status', examples: ['proposed', 'under-review', 'approved', 'rejected', 'deferred', 'superseded', 'implemented'] },
    outcome: { type: 'string', description: 'Decision outcome' },
    rationale: { type: 'string', description: 'Decision rationale' },
    alternatives: { type: 'string[]', description: 'Alternatives considered' },
    impact: { type: 'string', description: 'Impact assessment' },
    risks: { type: 'string[]', description: 'Associated risks' },
    benefits: { type: 'string[]', description: 'Expected benefits' },
    constraints: { type: 'string[]', description: 'Constraints considered' },
    stakeholders: { type: 'string[]', description: 'Stakeholders consulted' },
    decisionMaker: { type: 'string', description: 'Decision maker' },
    approvers: { type: 'string[]', description: 'Required approvers' },
    proposedBy: { type: 'string', description: 'Proposed by' },
    proposedDate: { type: 'date', description: 'Date proposed' },
    decidedDate: { type: 'date', description: 'Date decided' },
    implementationDate: { type: 'date', description: 'Target implementation date', optional: true },
    reviewDate: { type: 'date', description: 'Review date', optional: true },
    expirationDate: { type: 'date', description: 'Decision expiration', optional: true },
    documentUrl: { type: 'string', description: 'Decision document URL' },
    category: { type: 'string', description: 'Decision category' },
    priority: { type: 'string', description: 'Decision priority', examples: ['critical', 'high', 'medium', 'low'] },
    reversible: { type: 'boolean', description: 'Is reversible' },
    notes: { type: 'string', description: 'Additional notes', optional: true },
    tags: { type: 'string[]', description: 'Decision tags' },
    metadata: { type: 'object', description: 'Additional metadata', optional: true },
  },
  relationships: {
    meeting: { type: 'meeting', description: 'Decision meeting', backref: 'decisions' },
    actionItems: { type: 'actionItem[]', description: 'Follow-up actions', backref: 'decision' },
    project: { type: 'project', description: 'Related project', backref: 'decisions' },
    supersedes: { type: 'decision', description: 'Previous decision', backref: 'supersededBy' },
    supersededBy: { type: 'decision', description: 'Superseding decision', backref: 'supersedes' },
    relatedDecisions: { type: 'decision[]', description: 'Related decisions', backref: 'relatedDecisions' },
  },
  actions: ['create', 'update', 'propose', 'review', 'approve', 'reject', 'defer', 'implement', 'supersede', 'archive'],
  events: ['created', 'updated', 'proposed', 'reviewed', 'approved', 'rejected', 'deferred', 'implemented', 'superseded', 'archived'],
}

export const ActionItem: Noun = {
  singular: 'actionItem',
  plural: 'actionItems',
  description: 'An action item or follow-up task',
  properties: {
    name: { type: 'string', description: 'Action item title' },
    description: { type: 'string', description: 'Action item description' },
    status: { type: 'string', description: 'Action item status', examples: ['pending', 'in-progress', 'completed', 'cancelled', 'blocked', 'deferred'] },
    priority: { type: 'string', description: 'Priority level', examples: ['critical', 'high', 'medium', 'low'] },
    source: { type: 'string', description: 'Source of action item', examples: ['meeting', 'email', 'decision', 'review', 'audit', 'incident'] },
    assignee: { type: 'string', description: 'Assigned person' },
    assignedBy: { type: 'string', description: 'Assigned by' },
    collaborators: { type: 'string[]', description: 'Collaborators' },
    dueDate: { type: 'date', description: 'Due date' },
    completedDate: { type: 'date', description: 'Completion date', optional: true },
    createdDate: { type: 'date', description: 'Creation date' },
    context: { type: 'string', description: 'Context or background' },
    outcome: { type: 'string', description: 'Expected outcome' },
    actualOutcome: { type: 'string', description: 'Actual outcome', optional: true },
    blockers: { type: 'string[]', description: 'Current blockers' },
    progress: { type: 'number', description: 'Progress percentage' },
    notes: { type: 'string', description: 'Additional notes', optional: true },
    tags: { type: 'string[]', description: 'Action item tags' },
    metadata: { type: 'object', description: 'Additional metadata', optional: true },
  },
  relationships: {
    meeting: { type: 'meeting', description: 'Source meeting', backref: 'actionItems' },
    decision: { type: 'decision', description: 'Related decision', backref: 'actionItems' },
    task: { type: 'task', description: 'Linked task', backref: 'actionItem' },
    project: { type: 'project', description: 'Related project', backref: 'actionItems' },
    dependencies: { type: 'actionItem[]', description: 'Dependencies', backref: 'dependents' },
    dependents: { type: 'actionItem[]', description: 'Dependent items', backref: 'dependencies' },
  },
  actions: ['create', 'update', 'assign', 'reassign', 'start', 'complete', 'cancel', 'defer', 'escalate'],
  events: ['created', 'updated', 'assigned', 'reassigned', 'started', 'completed', 'cancelled', 'deferred', 'escalated'],
}

export const Announcement: Noun = {
  singular: 'announcement',
  plural: 'announcements',
  description: 'A company-wide or team announcement',
  properties: {
    title: { type: 'string', description: 'Announcement title' },
    content: { type: 'string', description: 'Announcement content' },
    summary: { type: 'string', description: 'Brief summary' },
    type: { type: 'string', description: 'Type of announcement', examples: ['general', 'product', 'company', 'HR', 'policy', 'event', 'milestone', 'emergency', 'recognition'] },
    status: { type: 'string', description: 'Announcement status', examples: ['draft', 'scheduled', 'published', 'archived', 'recalled'] },
    priority: { type: 'string', description: 'Priority level', examples: ['urgent', 'high', 'normal', 'low'] },
    audience: { type: 'string[]', description: 'Target audience', examples: ['all', 'engineering', 'sales', 'leadership', 'specific-team'] },
    channels: { type: 'string[]', description: 'Distribution channels', examples: ['email', 'slack', 'intranet', 'all-hands', 'newsletter'] },
    author: { type: 'string', description: 'Author' },
    approver: { type: 'string', description: 'Approver', optional: true },
    publishDate: { type: 'date', description: 'Publish date' },
    expirationDate: { type: 'date', description: 'Expiration date', optional: true },
    acknowledgmentRequired: { type: 'boolean', description: 'Requires acknowledgment' },
    acknowledgmentCount: { type: 'number', description: 'Acknowledgment count' },
    viewCount: { type: 'number', description: 'View count' },
    attachments: { type: 'string[]', description: 'Attachment URLs' },
    featured: { type: 'boolean', description: 'Is featured/pinned' },
    comments: { type: 'boolean', description: 'Comments enabled' },
    notes: { type: 'string', description: 'Internal notes', optional: true },
    tags: { type: 'string[]', description: 'Announcement tags' },
    metadata: { type: 'object', description: 'Additional metadata', optional: true },
  },
  relationships: {
    department: { type: 'department', description: 'Source department', backref: 'announcements' },
    relatedAnnouncements: { type: 'announcement[]', description: 'Related announcements', backref: 'relatedAnnouncements' },
  },
  actions: ['create', 'update', 'draft', 'schedule', 'publish', 'recall', 'archive', 'acknowledge', 'feature'],
  events: ['created', 'updated', 'drafted', 'scheduled', 'published', 'recalled', 'archived', 'acknowledged', 'featured'],
}

export const Feedback: Noun = {
  singular: 'feedback',
  plural: 'feedbacks',
  description: 'Feedback from customers, employees, or stakeholders',
  properties: {
    title: { type: 'string', description: 'Feedback title' },
    content: { type: 'string', description: 'Feedback content' },
    type: { type: 'string', description: 'Type of feedback', examples: ['feature-request', 'bug-report', 'complaint', 'praise', 'suggestion', 'review', 'survey-response', 'NPS'] },
    source: { type: 'string', description: 'Feedback source', examples: ['customer', 'employee', 'partner', 'support', 'sales', 'survey', 'social', 'review-site'] },
    status: { type: 'string', description: 'Feedback status', examples: ['new', 'acknowledged', 'under-review', 'in-progress', 'resolved', 'declined', 'archived'] },
    sentiment: { type: 'string', description: 'Sentiment analysis', examples: ['positive', 'neutral', 'negative', 'mixed'] },
    rating: { type: 'number', description: 'Rating score (1-5 or 1-10)' },
    npsScore: { type: 'number', description: 'NPS score (-100 to 100)', optional: true },
    category: { type: 'string', description: 'Feedback category', examples: ['product', 'service', 'support', 'pricing', 'UX', 'performance', 'documentation'] },
    priority: { type: 'string', description: 'Priority level', examples: ['critical', 'high', 'medium', 'low'] },
    submitter: { type: 'string', description: 'Feedback submitter' },
    submitterEmail: { type: 'string', description: 'Submitter email', optional: true },
    submitterType: { type: 'string', description: 'Submitter type', examples: ['customer', 'prospect', 'employee', 'partner', 'anonymous'] },
    submittedDate: { type: 'date', description: 'Submission date' },
    assignee: { type: 'string', description: 'Assigned handler' },
    response: { type: 'string', description: 'Response to feedback', optional: true },
    responseDate: { type: 'date', description: 'Response date', optional: true },
    resolvedDate: { type: 'date', description: 'Resolution date', optional: true },
    productArea: { type: 'string', description: 'Related product area' },
    feature: { type: 'string', description: 'Related feature', optional: true },
    channel: { type: 'string', description: 'Submission channel' },
    publicUrl: { type: 'string', description: 'Public URL if applicable', optional: true },
    votes: { type: 'number', description: 'Vote count (for public feedback)' },
    notes: { type: 'string', description: 'Internal notes', optional: true },
    tags: { type: 'string[]', description: 'Feedback tags' },
    metadata: { type: 'object', description: 'Additional metadata', optional: true },
  },
  relationships: {
    customer: { type: 'customer', description: 'Related customer', backref: 'feedback' },
    product: { type: 'product', description: 'Related product', backref: 'feedback' },
    feature: { type: 'feature', description: 'Related feature', backref: 'feedback' },
    task: { type: 'task', description: 'Created task', backref: 'feedback' },
    relatedFeedback: { type: 'feedback[]', description: 'Related feedback', backref: 'relatedFeedback' },
  },
  actions: ['create', 'update', 'acknowledge', 'assign', 'respond', 'resolve', 'decline', 'archive', 'merge', 'upvote'],
  events: ['created', 'updated', 'acknowledged', 'assigned', 'responded', 'resolved', 'declined', 'archived', 'merged', 'upvoted'],
}

export const Discussion: Noun = {
  singular: 'discussion',
  plural: 'discussions',
  description: 'A threaded discussion or conversation',
  properties: {
    title: { type: 'string', description: 'Discussion title' },
    content: { type: 'string', description: 'Initial post content' },
    type: { type: 'string', description: 'Type of discussion', examples: ['question', 'proposal', 'brainstorm', 'announcement', 'decision', 'RFC', 'retrospective'] },
    status: { type: 'string', description: 'Discussion status', examples: ['open', 'active', 'resolved', 'closed', 'locked', 'archived'] },
    category: { type: 'string', description: 'Discussion category' },
    author: { type: 'string', description: 'Discussion author' },
    participants: { type: 'string[]', description: 'Participants' },
    mentions: { type: 'string[]', description: 'Mentioned users' },
    replyCount: { type: 'number', description: 'Number of replies' },
    viewCount: { type: 'number', description: 'View count' },
    lastReplyDate: { type: 'date', description: 'Last reply date' },
    lastReplyBy: { type: 'string', description: 'Last reply by' },
    pinned: { type: 'boolean', description: 'Is pinned' },
    locked: { type: 'boolean', description: 'Is locked' },
    resolved: { type: 'boolean', description: 'Is resolved' },
    resolvedBy: { type: 'string', description: 'Resolved by', optional: true },
    resolvedDate: { type: 'date', description: 'Resolution date', optional: true },
    visibility: { type: 'string', description: 'Visibility', examples: ['public', 'team', 'private', 'confidential'] },
    createdDate: { type: 'date', description: 'Creation date' },
    notes: { type: 'string', description: 'Internal notes', optional: true },
    tags: { type: 'string[]', description: 'Discussion tags' },
    metadata: { type: 'object', description: 'Additional metadata', optional: true },
  },
  relationships: {
    project: { type: 'project', description: 'Related project', backref: 'discussions' },
    team: { type: 'team', description: 'Related team', backref: 'discussions' },
    decision: { type: 'decision', description: 'Related decision', backref: 'discussions' },
    parentDiscussion: { type: 'discussion', description: 'Parent discussion', backref: 'replies' },
    replies: { type: 'discussion[]', description: 'Replies', backref: 'parentDiscussion' },
  },
  actions: ['create', 'update', 'reply', 'resolve', 'close', 'reopen', 'pin', 'unpin', 'lock', 'unlock', 'archive'],
  events: ['created', 'updated', 'replied', 'resolved', 'closed', 'reopened', 'pinned', 'unpinned', 'locked', 'unlocked', 'archived'],
}

// Export all communication entities
export const CommunicationEntities = {
  Meeting,
  Decision,
  ActionItem,
  Announcement,
  Feedback,
  Discussion,
}

export default CommunicationEntities
