import { createAccessControl } from 'better-auth/plugins/access'
import {
  adminAc,
  defaultStatements,
} from 'better-auth/plugins/organization/access'

export const statements = {
  ...defaultStatements,
  organization: ['read', 'update', 'delete'],
  member: ['create', 'read', 'update', 'delete'],
  invitation: ['create', 'read', 'cancel'],
  team: ['create', 'read', 'update', 'delete'],
  ac: ['create', 'read', 'update', 'delete'],
  project: ['create', 'read', 'update', 'delete'],
  requirement: [
    'create',
    'read',
    'update',
    'delete',
    'send_for_sign',
    'request_changes',
    'resolve_changes',
    'reject_changes',
  ],
  invoice: [
    'create',
    'read',
    'update',
    'delete',
    'send',
    'sign',
    'request_changes',
  ],
  thread: ['create', 'read', 'update', 'resolve', 'reply'],
  time_entry: [
    'create',
    'read',
    'update',
    'delete',
    'submit',
    'approve',
    'reject',
  ],
  member_rate: ['read', 'manage'],
  project_budget: ['read', 'manage'],
  timesheet_report: ['create', 'read', 'send', 'approve', 'dispute'],
  milestone: ['create', 'read', 'update', 'delete', 'complete'],
  proposal: ['create', 'read', 'update', 'delete', 'send', 'sign'],
  expense: [
    'create',
    'read',
    'update',
    'delete',
    'submit',
    'approve',
    'reject',
  ],
  expense_category: ['create', 'read', 'update', 'delete'],
} as const

export const ac = createAccessControl(statements)

export const ownerRole = ac.newRole({
  ...adminAc.statements,
  organization: ['read', 'update', 'delete'],
  member: ['create', 'read', 'update', 'delete'],
  invitation: ['create', 'read', 'cancel'],
  team: ['create', 'read', 'update', 'delete'],
  ac: ['create', 'read', 'update', 'delete'],
  project: ['create', 'read', 'update', 'delete'],
  requirement: [
    'create',
    'read',
    'update',
    'delete',
    'send_for_sign',
    'request_changes',
    'resolve_changes',
    'reject_changes',
  ],
  invoice: [
    'create',
    'read',
    'update',
    'delete',
    'send',
    'sign',
    'request_changes',
  ],
  thread: ['create', 'read', 'update', 'resolve', 'reply'],
  time_entry: [
    'create',
    'read',
    'update',
    'delete',
    'submit',
    'approve',
    'reject',
  ],
  member_rate: ['read', 'manage'],
  project_budget: ['read', 'manage'],
  timesheet_report: ['create', 'read', 'send', 'approve', 'dispute'],
  milestone: ['create', 'read', 'update', 'delete', 'complete'],
  proposal: ['create', 'read', 'update', 'delete', 'send', 'sign'],
  expense: [
    'create',
    'read',
    'update',
    'delete',
    'submit',
    'approve',
    'reject',
  ],
  expense_category: ['create', 'read', 'update', 'delete'],
})

export const adminRole = ac.newRole({
  ...adminAc.statements,
  organization: ['read', 'update'],
  member: ['create', 'read', 'update', 'delete'],
  invitation: ['create', 'read', 'cancel'],
  team: ['create', 'read', 'update', 'delete'],
  ac: ['create', 'read', 'update', 'delete'],
  project: ['create', 'read', 'update', 'delete'],
  requirement: [
    'create',
    'read',
    'update',
    'delete',
    'send_for_sign',
    'request_changes',
    'resolve_changes',
    'reject_changes',
  ],
  invoice: [
    'create',
    'read',
    'update',
    'delete',
    'send',
    'sign',
    'request_changes',
  ],
  thread: ['create', 'read', 'update', 'resolve', 'reply'],
  time_entry: [
    'create',
    'read',
    'update',
    'delete',
    'submit',
    'approve',
    'reject',
  ],
  member_rate: ['read', 'manage'],
  project_budget: ['read', 'manage'],
  timesheet_report: ['create', 'read', 'send', 'approve', 'dispute'],
  milestone: ['create', 'read', 'update', 'delete', 'complete'],
  proposal: ['create', 'read', 'update', 'delete', 'send'],
  expense: [
    'create',
    'read',
    'update',
    'delete',
    'submit',
    'approve',
    'reject',
  ],
  expense_category: ['create', 'read', 'update', 'delete'],
})

export const memberRole = ac.newRole({
  organization: ['read'],
  member: ['read'],
  invitation: [],
  team: ['read'],
  ac: ['read'],
  project: ['read'],
  requirement: ['create', 'read', 'update'],
  invoice: ['read'],
  thread: ['create', 'read', 'update'],
  time_entry: ['create', 'read', 'update', 'delete', 'submit'],
  member_rate: ['read'],
  project_budget: [],
  timesheet_report: ['read'],
  milestone: ['read'],
  proposal: ['read'],
  expense: ['create', 'read', 'update', 'delete', 'submit'],
  expense_category: ['read'],
})

export const clientRole = ac.newRole({
  organization: ['read'],
  member: [],
  invitation: [],
  team: [],
  ac: ['read'],
  project: ['read'],
  requirement: ['read', 'request_changes', 'resolve_changes', 'reject_changes'],
  invoice: ['read', 'sign', 'request_changes'],
  thread: ['create', 'read', 'resolve', 'reply'],
  time_entry: [],
  member_rate: [],
  project_budget: [],
  timesheet_report: ['read', 'approve', 'dispute'],
  milestone: ['read'],
  proposal: ['read', 'sign'],
  expense: ['read', 'approve', 'reject'],
  expense_category: ['read'],
})

export const roles = {
  owner: ownerRole,
  admin: adminRole,
  member: memberRole,
  client: clientRole,
} as const
