// Only these tables and fields can be read by the recycle bin.
// Never add authentication fields (passwords, tokens or sessions) here.
export interface ParentRule {
  field: string;
  table: string;
  label: string;
  title: string;
}

export interface RecordHandler {
  table: string;
  title: string;
  fields: string[];
  parents: ParentRule[];
  // Each entry is a separate uniqueness rule; columns within it match together.
  unique: { fields: string[]; insensitive?: boolean }[];
}

const owner: ParentRule = {
  field: 'user_id',
  table: 'users',
  label: 'users',
  title: 'email',
};
const parent = (
  field: string,
  table: string,
  label: string,
  title = 'name',
): ParentRule => ({ field, table, label, title });
const named = (
  table: string,
  fields: string[] = [],
  parents: ParentRule[] = [],
): RecordHandler => ({
  table,
  title: 'name',
  fields: ['name', ...fields],
  parents,
  unique: [{ fields: ['name'], insensitive: true }],
});

export const recordHandlers = {
  issues: {
    table: 'issues',
    title: 'title',
    fields: [
      'title',
      'number_issue',
      'description',
      'recommendation',
      'attachment',
      'user_id',
      'stakeholder_id',
      'category_id',
      'issue_status_id',
      'meeting_request_id',
    ],
    parents: [
      owner,
      parent('stakeholder_id', 'stakeholders', 'stakeholders'),
      parent('category_id', 'categories', 'categories'),
      parent('issue_status_id', 'issue_statuses', 'issue-statuses'),
      parent(
        'meeting_request_id',
        'meeting_requests',
        'meeting-requests',
        'title',
      ),
    ],
    unique: [{ fields: ['number_issue'] }],
  },
  'meeting-requests': {
    table: 'meeting_requests',
    title: 'title',
    fields: [
      'title',
      'description',
      'status',
      'meeting_request_letter',
      'user_id',
    ],
    parents: [owner],
    unique: [],
  },
  meetings: {
    table: 'meetings',
    title: 'title',
    fields: [
      'title',
      'description',
      'status',
      'meeting_date',
      'location',
      'document_reference',
      'user_id',
      'meeting_request_id',
    ],
    parents: [
      owner,
      parent(
        'meeting_request_id',
        'meeting_requests',
        'meeting-requests',
        'title',
      ),
    ],
    unique: [],
  },
  'meeting-summaries': {
    table: 'meeting_summaries',
    title: 'id',
    fields: [
      'meeting_id',
      'meeting_request_id',
      'meeting_summary_status_id',
      'document_reference',
      'share',
      'user_id',
    ],
    parents: [
      owner,
      parent('meeting_id', 'meetings', 'meetings', 'title'),
      parent(
        'meeting_request_id',
        'meeting_requests',
        'meeting-requests',
        'title',
      ),
      parent(
        'meeting_summary_status_id',
        'meeting_summary_statuses',
        'meeting-summary-statuses',
      ),
    ],
    unique: [{ fields: ['meeting_id'] }],
  },
  plenaries: {
    table: 'plenaries',
    title: 'name',
    fields: [
      'name',
      'meeting_date',
      'deadline',
      'status',
      'document_reference',
      'user_id',
    ],
    parents: [owner],
    unique: [],
  },
  'rgc-decisions': {
    table: 'plenary_rgc_decisions',
    title: 'decision',
    fields: [
      'decision',
      'status',
      'meeting_date',
      'focal_person',
      'verification_source',
      'verification_link',
      'submitted_to_cdc_at',
      'plenary_id',
      'stakeholder_id',
      'category_id',
      'indicator_id',
      'user_id',
    ],
    parents: [
      owner,
      parent('plenary_id', 'plenaries', 'plenaries'),
      parent('stakeholder_id', 'stakeholders', 'stakeholders'),
      parent('category_id', 'categories', 'categories'),
      parent('indicator_id', 'indicators', 'indicators'),
    ],
    unique: [],
  },
  'progress-reports': {
    table: 'progress_reports',
    title: 'title',
    fields: [
      'title',
      'year',
      'semester',
      'status',
      'description',
      'attachment',
      'draft_semester_report',
      'final_semester_report',
      'user_id',
    ],
    parents: [owner],
    unique: [{ fields: ['year', 'semester'] }],
  },
  users: {
    ...named('users', ['email', 'is_active']),
    title: 'email',
    unique: [{ fields: ['email'] }],
  },
  roles: {
    ...named('roles', ['guard_name']),
    unique: [{ fields: ['name', 'guard_name'] }],
  },
  permissions: {
    ...named('permissions', ['guard_name']),
    unique: [{ fields: ['name', 'guard_name'] }],
  },
  stakeholders: {
    ...named(
      'stakeholders',
      [
        'kh_name',
        'description',
        'active',
        'stakeholder_type_id',
        'related_stakeholder_id',
      ],
      [
        parent('stakeholder_type_id', 'stakeholder_types', 'stakeholder-types'),
        parent('related_stakeholder_id', 'stakeholders', 'stakeholders'),
      ],
    ),
    unique: [],
  },
  'stakeholder-types': named('stakeholder_types', ['user_id'], [owner]),
  categories: named(
    'categories',
    ['kh_name', 'description', 'user_id'],
    [owner],
  ),
  'issue-statuses': {
    ...named('issue_statuses', ['code', 'description', 'user_id'], [owner]),
    unique: [
      { fields: ['name'], insensitive: true },
      { fields: ['code'], insensitive: true },
    ],
  },
  indicators: named('indicators', ['description']),
  'comment-types': named('comment_types', ['description']),
} satisfies Record<string, RecordHandler>;

export type DeletedRecordType = keyof typeof recordHandlers;
export const deletedRecordTypes = Object.keys(
  recordHandlers,
) as DeletedRecordType[];

export interface DeletedRecord {
  id: number;
  type: DeletedRecordType;
  title: string;
  deletedAt: Date;
  createdAt: Date;
  deletedBy: { id: number; name: string } | null;
  details: Record<string, unknown>;
}

export interface LinkedRecord {
  type: string;
  id: number;
  title: string;
  khName?: string | null;
  deleted: boolean;
}
