"""Default ERP permission definitions and initialization."""

from api.models.data.permissions import Permission

DEFAULT_PERMISSIONS = [
    # Users
    {'name': 'View Users', 'codename': 'view_users',
        'module': 'users', 'description': 'Can view user accounts'},
    {'name': 'Add Users', 'codename': 'add_users',
        'module': 'users', 'description': 'Can create new users'},
    {'name': 'Edit Users', 'codename': 'edit_users',
        'module': 'users', 'description': 'Can edit user accounts'},
    {'name': 'Delete Users', 'codename': 'delete_users',
        'module': 'users', 'description': 'Can delete user accounts'},
    # Products
    {'name': 'View Products', 'codename': 'view_products',
        'module': 'products', 'description': 'Can view products'},
    {'name': 'Add Products', 'codename': 'add_products',
        'module': 'products', 'description': 'Can create new products'},
    {'name': 'Edit Products', 'codename': 'edit_products',
        'module': 'products', 'description': 'Can edit existing products'},
    {'name': 'Delete Products', 'codename': 'delete_products',
        'module': 'products', 'description': 'Can delete products'},
    # Stock
    {'name': 'View Stock', 'codename': 'view_stock',
        'module': 'stock', 'description': 'Can view stock levels'},
    {'name': 'Add Stock', 'codename': 'add_stock',
        'module': 'stock', 'description': 'Can add stock entries'},
    {'name': 'Edit Stock', 'codename': 'edit_stock',
        'module': 'stock', 'description': 'Can edit stock entries'},
    {'name': 'Delete Stock', 'codename': 'delete_stock',
        'module': 'stock', 'description': 'Can delete stock entries'},
    # Customers
    {'name': 'View Customers', 'codename': 'view_customers',
        'module': 'customers', 'description': 'Can view customers'},
    {'name': 'Add Customers', 'codename': 'add_customers',
        'module': 'customers', 'description': 'Can create new customers'},
    {'name': 'Edit Customers', 'codename': 'edit_customers',
        'module': 'customers', 'description': 'Can edit customer information'},
    {'name': 'Delete Customers', 'codename': 'delete_customers',
        'module': 'customers', 'description': 'Can delete customers'},
    # Vendors
    {'name': 'View Vendors', 'codename': 'view_vendors',
        'module': 'vendors', 'description': 'Can view vendors'},
    {'name': 'Add Vendors', 'codename': 'add_vendors',
        'module': 'vendors', 'description': 'Can create new vendors'},
    {'name': 'Edit Vendors', 'codename': 'edit_vendors',
        'module': 'vendors', 'description': 'Can edit vendor information'},
    {'name': 'Delete Vendors', 'codename': 'delete_vendors',
        'module': 'vendors', 'description': 'Can delete vendors'},
    # Salesmen
    {'name': 'View Salesmen', 'codename': 'view_salesmen',
        'module': 'salesmen', 'description': 'Can view salesmen'},
    {'name': 'Add Salesmen', 'codename': 'add_salesmen',
        'module': 'salesmen', 'description': 'Can create salesmen'},
    {'name': 'Edit Salesmen', 'codename': 'edit_salesmen',
        'module': 'salesmen', 'description': 'Can edit salesmen'},
    {'name': 'Delete Salesmen', 'codename': 'delete_salesmen',
        'module': 'salesmen', 'description': 'Can delete salesmen'},
    # Sales
    {'name': 'View Sales', 'codename': 'view_sales',
        'module': 'sales', 'description': 'Can view sales records'},
    {'name': 'Add Sales', 'codename': 'add_sales',
        'module': 'sales', 'description': 'Can create new sales'},
    {'name': 'Edit Sales', 'codename': 'edit_sales',
        'module': 'sales', 'description': 'Can edit existing sales'},
    {'name': 'Delete Sales', 'codename': 'delete_sales',
        'module': 'sales', 'description': 'Can delete sales records'},

    # Raw materials
    {'name': 'View Raw Materials', 'codename': 'view_raw_materials',
        'module': 'raw_materials', 'description': 'Can view raw materials'},
    {'name': 'Add Raw Materials', 'codename': 'add_raw_materials',
        'module': 'raw_materials', 'description': 'Can create raw materials'},
    {'name': 'Edit Raw Materials', 'codename': 'edit_raw_materials',
        'module': 'raw_materials', 'description': 'Can edit raw materials'},
    {'name': 'Delete Raw Materials', 'codename': 'delete_raw_materials',
        'module': 'raw_materials', 'description': 'Can delete raw materials'},
    {'name': 'View Raw Material Purchases', 'codename': 'view_raw_material_purchases',
        'module': 'raw_material_purchases', 'description': 'Can view raw-material purchases'},
    {'name': 'Add Raw Material Purchases', 'codename': 'add_raw_material_purchases',
        'module': 'raw_material_purchases', 'description': 'Can create raw-material purchases'},
    {'name': 'Edit Raw Material Purchases', 'codename': 'edit_raw_material_purchases',
        'module': 'raw_material_purchases', 'description': 'Can edit raw-material purchases'},
    {'name': 'Delete Raw Material Purchases', 'codename': 'delete_raw_material_purchases',
        'module': 'raw_material_purchases', 'description': 'Can delete raw-material purchases'},
    {'name': 'View Raw Material Stock', 'codename': 'view_raw_material_stocks',
        'module': 'raw_material_stocks', 'description': 'Can view raw-material stock levels'},
    {'name': 'Add Raw Material Stock', 'codename': 'add_raw_material_stocks',
        'module': 'raw_material_stocks', 'description': 'Can add raw-material stock entries'},
    {'name': 'Edit Raw Material Stock', 'codename': 'edit_raw_material_stocks',
        'module': 'raw_material_stocks', 'description': 'Can edit raw-material stock entries'},
    {'name': 'Delete Raw Material Stock', 'codename': 'delete_raw_material_stocks',
        'module': 'raw_material_stocks', 'description': 'Can delete raw-material stock entries'},

    # Raw-material production
    {'name': 'View Raw Material Processes', 'codename': 'view_raw_material_processes',
        'module': 'raw_material_processes', 'description': 'Can view raw-material production runs'},
    {'name': 'Add Raw Material Processes', 'codename': 'add_raw_material_processes',
        'module': 'raw_material_processes', 'description': 'Can create raw-material production runs'},
    {'name': 'Edit Raw Material Processes', 'codename': 'edit_raw_material_processes',
        'module': 'raw_material_processes', 'description': 'Can edit raw-material production runs'},
    {'name': 'Delete Raw Material Processes', 'codename': 'delete_raw_material_processes',
        'module': 'raw_material_processes', 'description': 'Can delete raw-material production runs'},
    {'name': 'View Storage Tanks', 'codename': 'view_storage_tanks',
        'module': 'storage_tanks', 'description': 'Can view production storage tanks'},
    {'name': 'Add Storage Tanks', 'codename': 'add_storage_tanks',
        'module': 'storage_tanks', 'description': 'Can create production storage tanks'},
    {'name': 'Edit Storage Tanks', 'codename': 'edit_storage_tanks',
        'module': 'storage_tanks', 'description': 'Can edit production storage tanks'},
    {'name': 'Delete Storage Tanks', 'codename': 'delete_storage_tanks',
        'module': 'storage_tanks', 'description': 'Can delete empty production storage tanks'},
    {'name': 'View Packing Runs', 'codename': 'view_packing',
        'module': 'packing', 'description': 'Can view packing runs'},
    {'name': 'Add Packing Runs', 'codename': 'add_packing',
        'module': 'packing', 'description': 'Can pack stored production into finished stock'},
    {'name': 'Edit Packing Runs', 'codename': 'edit_packing',
        'module': 'packing', 'description': 'Can edit packing runs'},
    {'name': 'Delete Packing Runs', 'codename': 'delete_packing',
        'module': 'packing', 'description': 'Can delete packing runs'},

    {'name': 'View Withdrawals', 'codename': 'view_withdrawals',
        'module': 'withdrawals', 'description': 'Can view owner withdrawals'},
    {'name': 'Add Withdrawals', 'codename': 'add_withdrawals',
        'module': 'withdrawals', 'description': 'Can record owner withdrawals'},
    {'name': 'Edit Withdrawals', 'codename': 'edit_withdrawals',
        'module': 'withdrawals', 'description': 'Can edit withdrawals'},
    {'name': 'Delete Withdrawals', 'codename': 'delete_withdrawals',
        'module': 'withdrawals', 'description': 'Can delete withdrawals'},

    {'name': 'View Equipment', 'codename': 'view_equipment',
        'module': 'equipment', 'description': 'Can view equipment'},
    {'name': 'Add Equipment', 'codename': 'add_equipment',
        'module': 'equipment', 'description': 'Can add equipment'},
    {'name': 'Edit Equipment', 'codename': 'edit_equipment',
        'module': 'equipment', 'description': 'Can edit equipment'},
    {'name': 'Delete Equipment', 'codename': 'delete_equipment',
        'module': 'equipment', 'description': 'Can delete equipment'},
    # Notifications
    {'name': 'View Notifications', 'codename': 'view_notifications',
        'module': 'notifications', 'description': 'Can view notifications'},
    # Returns
    {'name': 'View Returns', 'codename': 'view_returns',
        'module': 'returns', 'description': 'Can view returns'},
    {'name': 'Add Returns', 'codename': 'add_returns',
        'module': 'returns', 'description': 'Can create new returns'},
    {'name': 'Edit Returns', 'codename': 'edit_returns',
        'module': 'returns', 'description': 'Can edit existing returns'},
    {'name': 'Delete Returns', 'codename': 'delete_returns',
        'module': 'returns', 'description': 'Can delete returns'},
    # Payments
    {'name': 'View Payments', 'codename': 'view_payments',
        'module': 'payments', 'description': 'Can view payment records'},
    {'name': 'Add Payments', 'codename': 'add_payments',
        'module': 'payments', 'description': 'Can create new payments'},
    {'name': 'Edit Payments', 'codename': 'edit_payments',
        'module': 'payments', 'description': 'Can edit payment records'},
    {'name': 'Delete Payments', 'codename': 'delete_payments',
        'module': 'payments', 'description': 'Can delete payment records'},
    {'name': 'View Sale Payments', 'codename': 'view_sale_payments',
        'module': 'payments', 'description': 'Can access sale payments in the sidebar'},
    {'name': 'View Purchase Payments', 'codename': 'view_purchase_payments',
        'module': 'payments', 'description': 'Can access raw-material purchase payments in the sidebar'},
    {'name': 'View Salesman Commission Payments', 'codename': 'view_salesman_commission_payments',
        'module': 'salesman_commission_payments',
        'description': 'Can view and manage salesman commission payments'},
    {'name': 'Add Salesman Commission Payments', 'codename': 'add_salesman_commission_payments',
        'module': 'salesman_commission_payments',
        'description': 'Can create salesman commission payments'},
    {'name': 'Edit Salesman Commission Payments', 'codename': 'edit_salesman_commission_payments',
        'module': 'salesman_commission_payments',
        'description': 'Can edit salesman commission payments'},
    {'name': 'Delete Salesman Commission Payments', 'codename': 'delete_salesman_commission_payments',
        'module': 'salesman_commission_payments',
        'description': 'Can delete salesman commission payments'},
    # Employees
    {'name': 'View Employees', 'codename': 'view_employees',
        'module': 'employees', 'description': 'Can view employee records'},
    {'name': 'Add Employees', 'codename': 'add_employees',
        'module': 'employees', 'description': 'Can create new employees'},
    {'name': 'Edit Employees', 'codename': 'edit_employees',
        'module': 'employees', 'description': 'Can edit employee information'},
    {'name': 'Delete Employees', 'codename': 'delete_employees',
        'module': 'employees', 'description': 'Can delete employees'},
    # Attendance
    {'name': 'View Attendance', 'codename': 'view_attendance',
        'module': 'attendance', 'description': 'Can view attendance records'},
    {'name': 'Add Attendance', 'codename': 'add_attendance',
        'module': 'attendance', 'description': 'Can create attendance records'},
    {'name': 'Edit Attendance', 'codename': 'edit_attendance',
        'module': 'attendance', 'description': 'Can edit attendance records'},
    {'name': 'Delete Attendance', 'codename': 'delete_attendance',
        'module': 'attendance', 'description': 'Can delete attendance records'},
    # Payroll
    {'name': 'View Payroll', 'codename': 'view_payroll',
        'module': 'payroll', 'description': 'Can view payroll records'},
    {'name': 'Add Payroll', 'codename': 'add_payroll',
        'module': 'payroll', 'description': 'Can create payroll records'},
    {'name': 'Edit Payroll', 'codename': 'edit_payroll',
        'module': 'payroll', 'description': 'Can edit payroll records'},
    {'name': 'Delete Payroll', 'codename': 'delete_payroll',
        'module': 'payroll', 'description': 'Can delete payroll records'},
    {'name': 'Process Payroll', 'codename': 'process_payroll',
        'module': 'payroll', 'description': 'Can process payroll'},
    # Loans
    {'name': 'View Loans', 'codename': 'view_loans',
        'module': 'loans', 'description': 'Can view loan records'},
    {'name': 'Add Loans', 'codename': 'add_loans',
        'module': 'loans', 'description': 'Can create loan records'},
    {'name': 'Edit Loans', 'codename': 'edit_loans',
        'module': 'loans', 'description': 'Can edit loan records'},
    {'name': 'Delete Loans', 'codename': 'delete_loans',
        'module': 'loans', 'description': 'Can delete loan records'},
    {'name': 'Approve Loans', 'codename': 'approve_loans',
        'module': 'loans', 'description': 'Can approve loan applications'},
    # Expenses
    {'name': 'View Expenses', 'codename': 'view_expenses',
        'module': 'expenses', 'description': 'Can view expense records'},
    {'name': 'Add Expenses', 'codename': 'add_expenses',
        'module': 'expenses', 'description': 'Can create expense records'},
    {'name': 'Edit Expenses', 'codename': 'edit_expenses',
        'module': 'expenses', 'description': 'Can edit expense records'},
    {'name': 'Delete Expenses', 'codename': 'delete_expenses',
        'module': 'expenses', 'description': 'Can delete expense records'},
    {'name': 'Approve Expenses', 'codename': 'approve_expenses',
        'module': 'expenses', 'description': 'Can approve expense claims'},
    {'name': 'View Expense Categories', 'codename': 'view_expense_categories',
        'module': 'expenses', 'description': 'Can access expense categories in the sidebar'},
    {'name': 'Add Expense Categories', 'codename': 'add_expense_categories',
        'module': 'expenses', 'description': 'Can create expense categories'},
    {'name': 'Edit Expense Categories', 'codename': 'edit_expense_categories',
        'module': 'expenses', 'description': 'Can edit expense categories'},
    {'name': 'Delete Expense Categories', 'codename': 'delete_expense_categories',
        'module': 'expenses', 'description': 'Can delete expense categories'},
    # Currencies
    {'name': 'View Currencies', 'codename': 'view_currencies',
        'module': 'currencies', 'description': 'Can view currency settings'},
    {'name': 'Add Currencies', 'codename': 'add_currencies',
        'module': 'currencies', 'description': 'Can create new currencies'},
    {'name': 'Edit Currencies', 'codename': 'edit_currencies',
        'module': 'currencies', 'description': 'Can edit currency settings'},
    {'name': 'Delete Currencies', 'codename': 'delete_currencies',
        'module': 'currencies', 'description': 'Can delete currencies'},
    # Accounting
    {'name': 'View Accounting', 'codename': 'view_accounting',
        'module': 'accounting', 'description': 'Can view accounting overview'},
    {'name': 'Edit Accounting', 'codename': 'edit_accounting', 'module': 'accounting',
        'description': 'Can edit accounting settings and journal entries'},
    {'name': 'View Daily Ledger', 'codename': 'view_daily_ledger',
        'module': 'accounting', 'description': 'Can access daily ledger in the sidebar'},
    {'name': 'View Trial Balance', 'codename': 'view_trial_balance',
        'module': 'accounting', 'description': 'Can access trial balance in the sidebar'},
    {'name': 'View Balance Sheet', 'codename': 'view_balance_sheet',
        'module': 'accounting', 'description': 'Can access balance sheet in the sidebar'},
    {'name': 'View Income Statement', 'codename': 'view_income_statement',
        'module': 'accounting', 'description': 'Can access income statement in the sidebar'},
    {'name': 'View Fiscal Years', 'codename': 'view_fiscal_years',
        'module': 'accounting', 'description': 'Can access fiscal years in the sidebar'},
    {'name': 'View GL Accounts', 'codename': 'view_gl_accounts',
        'module': 'accounting', 'description': 'Can access GL accounts in the sidebar'},
    {'name': 'View Journal Entries', 'codename': 'view_journal_entries',
        'module': 'accounting', 'description': 'Can access journal entries in the sidebar'},
    {'name': 'View Currency Exchanges', 'codename': 'view_currency_exchanges',
        'module': 'accounting', 'description': 'Can access currency exchange documents'},
    {'name': 'Add Currency Exchanges', 'codename': 'add_currency_exchanges',
        'module': 'accounting', 'description': 'Can create currency exchange documents'},
    {'name': 'Edit Currency Exchanges', 'codename': 'edit_currency_exchanges',
        'module': 'accounting', 'description': 'Can edit or reverse currency exchange documents'},
    {'name': 'Delete Currency Exchanges', 'codename': 'delete_currency_exchanges',
        'module': 'accounting', 'description': 'Can delete draft currency exchange documents'},
    {'name': 'View FX Revaluations', 'codename': 'view_fx_revaluations',
        'module': 'accounting', 'description': 'Can access period-end FX revaluation runs'},
    {'name': 'Add FX Revaluations', 'codename': 'add_fx_revaluations',
        'module': 'accounting', 'description': 'Can create period-end FX revaluation runs'},
    {'name': 'Edit FX Revaluations', 'codename': 'edit_fx_revaluations',
        'module': 'accounting', 'description': 'Can reverse or update FX revaluation runs'},
    {'name': 'Delete FX Revaluations', 'codename': 'delete_fx_revaluations',
        'module': 'accounting', 'description': 'Can delete draft FX revaluation runs'},
    # Reports
    {'name': 'View Reports', 'codename': 'view_reports',
        'module': 'reports', 'description': 'Can view system reports'},
    {'name': 'Export Reports', 'codename': 'export_reports',
        'module': 'reports', 'description': 'Can export reports'},
    {'name': 'Financial Reports', 'codename': 'view_financial_reports',
        'module': 'reports', 'description': 'Can view financial reports'},
    {'name': 'Sales Reports', 'codename': 'view_sales_reports',
        'module': 'reports', 'description': 'Can view sales reports'},
    {'name': 'Inventory Reports', 'codename': 'view_inventory_reports',
        'module': 'reports', 'description': 'Can view inventory reports'},
    {'name': 'HR Reports', 'codename': 'view_hr_reports',
        'module': 'reports', 'description': 'Can view HR reports'},
    # Dashboard
    {'name': 'View Dashboard', 'codename': 'view_dashboard',
        'module': 'dashboard', 'description': 'Can view main dashboard'},
    {'name': 'Sales Dashboard', 'codename': 'view_sales_dashboard',
        'module': 'dashboard', 'description': 'Can view sales dashboard'},
    {'name': 'Finance Dashboard', 'codename': 'view_finance_dashboard',
        'module': 'dashboard', 'description': 'Can view finance dashboard'},
    {'name': 'HR Dashboard', 'codename': 'view_hr_dashboard',
        'module': 'dashboard', 'description': 'Can view HR dashboard'},
    # Settings
    {'name': 'View Settings', 'codename': 'view_settings',
        'module': 'settings', 'description': 'Can view system settings'},
    {'name': 'Edit Settings', 'codename': 'edit_settings',
        'module': 'settings', 'description': 'Can modify system settings'},
    {'name': 'System Configuration', 'codename': 'system_config',
        'module': 'settings', 'description': 'Can configure system settings'},
    {'name': 'Backup System', 'codename': 'backup_system',
        'module': 'settings', 'description': 'Can create system backups'},
    {'name': 'View Exchange Rates', 'codename': 'view_exchange_rates',
        'module': 'settings', 'description': 'Can access exchange rates in the sidebar'},
    {'name': 'Add Exchange Rates', 'codename': 'add_exchange_rates',
        'module': 'settings', 'description': 'Can create currency exchange rates'},
    {'name': 'Edit Exchange Rates', 'codename': 'edit_exchange_rates',
        'module': 'settings', 'description': 'Can edit currency exchange rates'},
    {'name': 'Delete Exchange Rates', 'codename': 'delete_exchange_rates',
        'module': 'settings', 'description': 'Can delete currency exchange rates'},
    {'name': 'View Activity Logs', 'codename': 'view_activity_logs',
        'module': 'settings', 'description': 'Can access activity logs in the sidebar'},
    {'name': 'View Backups', 'codename': 'view_backups', 'module': 'settings',
        'description': 'Can access database backups in the sidebar'},
    # Permission management
    {'name': 'View Permissions', 'codename': 'view_permissions',
        'module': 'permissions', 'description': 'Can view user permissions'},
    {'name': 'Edit Permissions', 'codename': 'edit_permissions',
        'module': 'permissions', 'description': 'Can modify user permissions'},
    {'name': 'Assign Roles', 'codename': 'assign_roles',
        'module': 'permissions', 'description': 'Can assign roles to users'},
]

USER_MANAGEMENT_CODENAMES = frozenset({
    'view_users', 'add_users', 'edit_users', 'delete_users',
    'view_permissions', 'edit_permissions',
})


def initialize_default_permissions():
    """Create or update all default permissions. Safe to run multiple times."""
    created = 0
    updated = 0

    for perm_data in DEFAULT_PERMISSIONS:
        _, was_created = Permission.objects.update_or_create(
            codename=perm_data['codename'],
            defaults={
                'name': perm_data['name'],
                'module': perm_data['module'],
                'description': perm_data.get('description', ''),
            },
        )
        if was_created:
            created += 1
        else:
            updated += 1

    return {
        'created': created,
        'updated': updated,
        'total': Permission.objects.count(),
    }
