<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use App\Models\Member;
use App\Policies\MemberPolicy;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The model to policy mappings for the application.
     *
     * @var array<class-string, class-string>
     */
    protected $policies = [
        // Member::class => MemberPolicy::class,
        // 'App\Models\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        // ✅ Disable error reporting in authorization for stability
        error_reporting(0);
        ini_set('display_errors', 0);

        // কমিটি মেম্বার ম্যানেজমেন্ট
        Gate::define('manage-members', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        // মেম্বার ম্যানেজমেন্ট গেটস
        Gate::define('view-members', function ($user) {
            return in_array($user->user_type, ['admin', 'committee', 'member']);
        });

        Gate::define('view-member', function ($user, Member $member) {
            // কমিটি/অ্যাডমিন সব দেখতে পারবে
            if (in_array($user->user_type, ['admin', 'committee'])) {
                return true;
            }
            
            // মেম্বার শুধু নিজের প্রোফাইল দেখতে পারবে
            if ($user->user_type === 'member') {
                return $user->member_id === $member->member_id;
            }
            
            return false;
        });

        Gate::define('create-member', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        Gate::define('update-member', function ($user, Member $member) {
            // কমিটি/অ্যাডমিন সব আপডেট করতে পারবে
            if (in_array($user->user_type, ['admin', 'committee'])) {
                return true;
            }
            
            // মেম্বার শুধু নিজের প্রোফাইল আপডেট করতে পারবে
            if ($user->user_type === 'member') {
                return $user->member_id === $member->member_id;
            }
            
            return false;
        });

        Gate::define('delete-member', function ($user, Member $member) {
            // শুধুমাত্র কমিটি/অ্যাডমিন ডিলিট করতে পারবে
            if (!in_array($user->user_type, ['admin', 'committee'])) {
                return false;
            }
            
            // অনুমোদিত সদস্য ডিলিট করা যাবে না
            return $member->approval_status !== 'approved';
        });

        Gate::define('approve-member', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        Gate::define('export-members', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        Gate::define('view-reports', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        // লোন সম্পর্কিত গেটস
        Gate::define('manage-loans', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        Gate::define('view-loans', function ($user) {
            return in_array($user->user_type, ['admin', 'committee', 'member']);
        });

        // লোন অনুমোদন বিশেষ গেট (memory issue ঠিক করার জন্য)
        Gate::define('approve-loan', function ($user) {
            // Simple check without loading relations
            try {
                return in_array($user->user_type, ['admin', 'committee']);
            } catch (\Exception $e) {
                // If any error, default to false for safety
                error_log('Gate approve-loan error: ' . substr($e->getMessage(), 0, 100));
                return false;
            }
        });

        // আয়/ব্যয় সম্পর্কিত গেটস
        Gate::define('manage-finances', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        // নোটিশ সম্পর্কিত গেটস
        Gate::define('manage-notices', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        // ব্যবহারকারী ম্যানেজমেন্ট
        Gate::define('manage-users', function ($user) {
            return $user->user_type === 'admin';
        });

        // সেটিংস ম্যানেজমেন্ট
        Gate::define('manage-settings', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        // ড্যাশবোর্ড অ্যাক্সেস
        Gate::define('access-dashboard', function ($user) {
            return in_array($user->user_type, ['admin', 'committee', 'member']);
        });

        // অডিট লগ ভিউ
        Gate::define('view-audit-logs', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        // বাল্ক অপারেশন
        Gate::define('perform-bulk-operations', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        // স্ট্যাটাস পরিবর্তন
        Gate::define('change-member-status', function ($user, Member $member) {
            if (in_array($user->user_type, ['admin', 'committee'])) {
                return true;
            }
            
            // মেম্বার শুধু নিজের প্রোফাইলের কিছু স্ট্যাটাস পরিবর্তন করতে পারবে
            if ($user->user_type === 'member') {
                return $user->member_id === $member->member_id;
            }
            
            return false;
        });

        // ফর্ম ফি আদায়
        Gate::define('collect-form-fee', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        // মাসিক সঞ্চয় আদায়
        Gate::define('collect-monthly-saving', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        // কার্ড প্রিন্ট
        Gate::define('print-member-card', function ($user, Member $member) {
            if (in_array($user->user_type, ['admin', 'committee'])) {
                return true;
            }
            
            if ($user->user_type === 'member') {
                return $user->member_id === $member->member_id;
            }
            
            return false;
        });

        // SMS/নোটিফিকেশন পাঠানো
        Gate::define('send-notifications', function ($user) {
            return in_array($user->user_type, ['admin', 'committee']);
        });

        // ডাটা ব্যাকআপ/রিস্টোর
        Gate::define('manage-backups', function ($user) {
            return $user->user_type === 'admin';
        });

        // সিস্টেম মেইনটেনেন্স
        Gate::define('perform-maintenance', function ($user) {
            return $user->user_type === 'admin';
        });

        // Loan-specific simplified gates (to prevent memory issues)
        Gate::define('loan-approval', function ($user) {
            // Ultra-simple check
            return $user && in_array($user->user_type, ['admin', 'committee']);
        });

        Gate::define('loan-disbursement', function ($user) {
            return $user && in_array($user->user_type, ['admin', 'committee']);
        });
    }
}