<?php

namespace App\Http\Controllers\Subadmin;

use App\Http\Controllers\Controller;
use App\Models\Admin;
use App\Models\SubadminRequest;
use App\Models\User;
use App\Models\UserDepositRequest;
use App\Models\Transaction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;

class SubadminController extends Controller
{
    public function dashboard()
    {
        $pageTitle = 'Subadmin Dashboard';
        $subadmin = Auth::guard('admin')->user();
        $widget['total_users'] = User::where('subadmin_id', $subadmin->id)->count();
        $widget['wallet_balance'] = $subadmin->wallet;
        return view('subadmin.dashboard', compact('pageTitle', 'subadmin', 'widget'));
    }

    public function allUsers()
    {
        $pageTitle = 'My Users';
        $subadmin = Auth::guard('admin')->user();
        $users = User::where('subadmin_id', $subadmin->id)->paginate(getPaginate());
        return view('subadmin.user.index', compact('pageTitle', 'users'));
    }

    public function userCreate()
    {
        $pageTitle = 'Create User';
        return view('subadmin.user.create', compact('pageTitle'));
    }

    public function userStore(Request $request)
    {
        $request->validate([
            'firstname' => 'required|string|max:191',
            'lastname' => 'required|string|max:191',
            'mobile' => 'required|string|max:191|unique:users',
        ]);

        $subadmin = Auth::guard('admin')->user();
        
        $user = new User();
        $user->firstname = $request->firstname;
        $user->lastname = $request->lastname;
        $user->username = 'user_' . $request->mobile;
        $user->email = $request->mobile . '@skycrestaviationacademy.com';
        $user->mobile = $request->mobile;
        $user->password = Hash::make($request->mobile); // Default password as mobile for now
        $user->subadmin_id = $subadmin->id;
        $user->status = 1;
        $user->ev = 1;
        $user->sv = 1;
        $user->save();

        $notify[] = ['success', 'User created successfully'];
        return redirect()->route('subadmin.users.all')->withNotify($notify);
    }

    public function addBalance(Request $request, $id)
    {
        $request->validate(['amount' => 'required|numeric|gt:0']);
        $subadmin = Auth::guard('admin')->user();
        $user = User::where('subadmin_id', $subadmin->id)->findOrFail($id);

        if ($subadmin->wallet < $request->amount) {
            $notify[] = ['error', 'Insufficient balance in your wallet'];
            return back()->withNotify($notify);
        }

        $subadmin->wallet -= $request->amount;
        $subadmin->save();

        $user->balance += $request->amount;
        $user->save();

        $transaction = new Transaction();
        $transaction->user_id = $user->id;
        $transaction->amount = $request->amount;
        $transaction->post_balance = $user->balance;
        $transaction->charge = 0;
        $transaction->trx_type = '+';
        $transaction->details = 'Added by Subadmin: ' . $subadmin->username;
        $transaction->trx = getTrx();
        $transaction->save();

        $notify[] = ['success', 'Balance transferred to user successfully'];
        return back()->withNotify($notify);
    }

    public function depositRequest()
    {
        $pageTitle = 'Deposit Request to Admin';
        return view('subadmin.deposit_request', compact('pageTitle'));
    }

    public function depositRequestSubmit(Request $request)
    {
        $request->validate([
            'amount' => 'required|numeric|gt:0',
            'trx_id' => 'required',
            'screenshot' => 'required|image|mimes:jpg,jpeg,png',
        ]);

        $subadmin = Auth::guard('admin')->user();
        
        $depRequest = new SubadminRequest();
        $depRequest->subadmin_id = $subadmin->id;
        $depRequest->amount = $request->amount;
        $depRequest->type = 'deposit';
        $depRequest->trx_id = $request->trx_id;
        
        if ($request->hasFile('screenshot')) {
            $path = imagePath()['verify']['deposit']['path'];
            $depRequest->screenshot = uploadImage($request->screenshot, $path);
        }
        
        $depRequest->status = 0;
        $depRequest->save();

        $notify[] = ['success', 'Deposit request sent to admin'];
        return back()->withNotify($notify);
    }

    public function userDeposits()
    {
        $pageTitle = 'User Deposit Requests';
        $subadmin = Auth::guard('admin')->user();
        $deposits = UserDepositRequest::where('subadmin_id', $subadmin->id)->with('user')->orderBy('id', 'desc')->paginate(getPaginate());
        return view('subadmin.user.deposits', compact('pageTitle', 'deposits'));
    }

    public function userDepositApprove($id)
    {
        $subadmin = Auth::guard('admin')->user();
        $depRequest = UserDepositRequest::where('subadmin_id', $subadmin->id)->where('status', 0)->findOrFail($id);

        if ($subadmin->wallet < $depRequest->amount) {
            $notify[] = ['error', 'Insufficient balance in your wallet to approve this request'];
            return back()->withNotify($notify);
        }

        $depRequest->status = 1;
        $depRequest->save();

        $subadmin->wallet -= $depRequest->amount;
        $subadmin->save();

        $user = User::findOrFail($depRequest->user_id);
        $user->balance += $depRequest->amount;
        $user->save();

        $transaction = new Transaction();
        $transaction->user_id = $user->id;
        $transaction->amount = $depRequest->amount;
        $transaction->post_balance = $user->balance;
        $transaction->charge = 0;
        $transaction->trx_type = '+';
        $transaction->details = 'Deposit approved by Subadmin: ' . $subadmin->username;
        $transaction->trx = getTrx();
        $transaction->save();

        $notify[] = ['success', 'User deposit approved successfully'];
        return back()->withNotify($notify);
    }

    public function userDetail($id)
    {
        $subadmin = Auth::guard('admin')->user();
        $user = User::where('subadmin_id', $subadmin->id)->findOrFail($id);
        $pageTitle = 'User Detail - ' . $user->username;
        return view('subadmin.user.detail', compact('pageTitle', 'user'));
    }

    public function userUpdate(Request $request, $id)
    {
        $subadmin = Auth::guard('admin')->user();
        $user = User::where('subadmin_id', $subadmin->id)->findOrFail($id);
        
        $request->validate([
            'firstname' => 'required|string|max:191',
            'lastname' => 'required|string|max:191',
        ]);

        $user->firstname = $request->firstname;
        $user->lastname = $request->lastname;
        $user->save();

        $notify[] = ['success', 'User updated successfully'];
        return back()->withNotify($notify);
    }

    public function userStatusToggle($id)
    {
        $subadmin = Auth::guard('admin')->user();
        $user = User::where('subadmin_id', $subadmin->id)->findOrFail($id);
        
        $user->status = $user->status == 1 ? 0 : 1;
        $user->save();

        $statusText = $user->status == 1 ? 'activated' : 'put on hold';
        $notify[] = ['success', 'User account ' . $statusText . ' successfully'];
        return back()->withNotify($notify);
    }

    public function userDelete($id)
    {
        $subadmin = Auth::guard('admin')->user();
        $user = User::where('subadmin_id', $subadmin->id)->findOrFail($id);
        
        // Cascade delete all subordinate child records cleanly using Eloquent relationships
        $user->login_logs()->delete();
        $user->transactions()->delete();
        
        // Also delete deposits/withdrawals and user deposit requests
        $user->deposits()->delete();
        $user->withdrawals()->delete();
        UserDepositRequest::where('user_id', $user->id)->delete();
        
        // Delete bets and commissions
        $user->bets()->delete();
        $user->commissions()->delete();

        // Finally, delete the user record
        $user->delete();

        $notify[] = ['success', 'User and all associated data deleted successfully'];
        return redirect()->route('subadmin.users.all')->withNotify($notify);
    }
}

