<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\PartnerData;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;

class DaPartnerController extends Controller
{
    public function index()
    {
        $partners = PartnerData::where(function($q) {
                $q->whereNull('sub_partner_id')->orWhere('sub_partner_id', '');
            })
            ->with('children')
            ->orderBy('id', 'desc')
            ->paginate(20);
        return view('admin.da-system.partners.index', compact('partners'));
    }

    public function create()
    {
        $partnersList = \App\PartnerData::where(function($q) {
            $q->whereNull('sub_partner_id')->orWhere('sub_partner_id', '');
        })->orderBy('name')->pluck('name', 'id');
        return view('admin.da-system.partners.create', compact('partnersList'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'nullable|email|max:255',
            'mobile' => 'nullable|string|max:20',
            'pan' => 'nullable|string|max:20',
            'gstn' => 'nullable|string|max:20',
        ]);

        $bankInputs = $request->input('banks', []);
        $firstBank = reset($bankInputs);
        
        $partnerData = $request->only((new PartnerData())->getFillable());
        if ($firstBank) {
            $partnerData['bank_name'] = $firstBank['bank_name'] ?? null;
            $partnerData['bank_account_holder_name'] = $firstBank['bank_account_holder_name'] ?? null;
            $partnerData['bank_account_number'] = $firstBank['bank_account_number'] ?? null;
            $partnerData['bank_identifier_code'] = $firstBank['bank_identifier_code'] ?? null;
        }

        $partner = PartnerData::create($partnerData);

        if ($request->has('banks')) {
            foreach ($request->input('banks') as $bankData) {
                if (!empty($bankData['bank_name']) || !empty($bankData['bank_account_number'])) {
                    $partner->banks()->create($bankData);
                }
            }
        }

        Session::flash('success', 'Partner created successfully.');
        return redirect('/admin/da-system/partners');
    }

    public function edit($id)
    {
        $partner = PartnerData::with('banks')->findOrFail($id);
        $partnersList = PartnerData::where('id', '!=', $id)
            ->where(function($query) {
                $query->whereNull('sub_partner_id')->orWhere('sub_partner_id', '');
            })
            ->orderBy('name')->pluck('name', 'id');
        return view('admin.da-system.partners.create', compact('partner', 'partnersList'));
    }

    public function update(Request $request, $id)
    {
        $partner = PartnerData::findOrFail($id);

        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'nullable|email|max:255',
            'mobile' => 'nullable|string|max:20',
            'pan' => 'nullable|string|max:20',
            'gstn' => 'nullable|string|max:20',
        ]);

        $bankInputs = $request->input('banks', []);
        $firstBank = reset($bankInputs);

        $partnerData = $request->only((new PartnerData())->getFillable());
        if ($firstBank) {
            $partnerData['bank_name'] = $firstBank['bank_name'] ?? null;
            $partnerData['bank_account_holder_name'] = $firstBank['bank_account_holder_name'] ?? null;
            $partnerData['bank_account_number'] = $firstBank['bank_account_number'] ?? null;
            $partnerData['bank_identifier_code'] = $firstBank['bank_identifier_code'] ?? null;
        } else {
            $partnerData['bank_name'] = null;
            $partnerData['bank_account_holder_name'] = null;
            $partnerData['bank_account_number'] = null;
            $partnerData['bank_identifier_code'] = null;
        }

        $partner->update($partnerData);

        if ($request->has('banks')) {
            $submittedBankIds = collect($request->input('banks'))->pluck('id')->filter()->toArray();
            $partner->banks()->whereNotIn('id', $submittedBankIds)->delete();

            foreach ($request->input('banks') as $bankData) {
                if (!empty($bankData['bank_name']) || !empty($bankData['bank_account_number'])) {
                    if (isset($bankData['id']) && !empty($bankData['id'])) {
                        $partner->banks()->where('id', $bankData['id'])->update([
                            'bank_name' => $bankData['bank_name'] ?? null,
                            'bank_account_holder_name' => $bankData['bank_account_holder_name'] ?? null,
                            'bank_account_number' => $bankData['bank_account_number'] ?? null,
                            'bank_identifier_code' => $bankData['bank_identifier_code'] ?? null,
                        ]);
                    } else {
                        $partner->banks()->create($bankData);
                    }
                }
            }
        } else {
            $partner->banks()->delete();
        }

        Session::flash('success', 'Partner updated successfully.');
        return redirect('/admin/da-system/partners');
    }

    public function destroy($id)
    {
        PartnerData::findOrFail($id)->delete();
        Session::flash('success', 'Partner deleted successfully.');
        return redirect('/admin/da-system/partners');
    }
}
