<?php

namespace Botble\Commission\Http\Controllers;

use Botble\Base\Http\Controllers\BaseController;
use Botble\Commission\Models\Commission;
use Botble\Marketplace\Models\Store;
use Botble\Commission\Tables\CommissionTable; 
use Botble\Ecommerce\Models\ProductCategory;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\DB;
use Botble\Base\Http\Responses\BaseHttpResponse;
use Botble\Base\Facades\PageTitle;
use Botble\Base\Facades\Breadcrumb;
use Botble\Base\Facades\BaseHelper;



class CommissionController extends BaseController
{

    public function index()
    {
        return redirect()->route('commission.vendors');
    }

    public function vendors()
    {
        // Simple list (fast). You can switch to a Table later if needed.
        $stores = Store::query()
            ->select('id', 'name')
            ->orderBy('name')
            ->get();

        return view('plugins/commission::vendors', compact('stores'));
    }

    public function byStore(CommissionTable $table, Store $store)
    {
        $table->storeId = $store->id;

        // Optional: hide Store column since we already filtered by it
        // unset($table->columns()['store_name']); // or adjust columns in table if you want

        return $table->renderTable([
            'pageTitle' => 'Commissions — ' . $store->name,
            'store'     => $store,
        ]);
    }

    // If you created a dedicated POST route for AJAX (route: commission.ajax)
    public function ajax(CommissionTable $table): JsonResponse
    {
        return $table->ajax();
    }

    public function create(Request $request)
    {
        $preStoreId = $request->integer('store_id'); // comes from button when viewing a vendor

        $stores = Store::query()
            ->select(['id', 'name'])
            ->orderBy('name')
            ->pluck('name', 'id')
            ->all();

        $cats = ProductCategory::query()
            ->select(['id','name','parent_id','order'])
            ->where('status', 'published')
            ->orderBy('parent_id')->orderBy('order')->orderBy('name')
            ->get();

        $categories = $this->buildHierarchicalOptions($cats);

        return view('plugins/commission::create', [
            'stores'      => $stores,
            'categories'  => $categories,
            'preStoreId'  => $preStoreId, // 👈 use this in Blade to preselect/lock store
        ]);
    }

     public function store(Request $request)
    {
        $pcTable = (new ProductCategory())->getTable();

        $request->validate([
            'store_id'    => ['required', 'integer', Rule::exists((new Store())->getTable(), 'id')],
            'category_id' => ['required', 'integer', Rule::exists($pcTable, 'id')],
            'rate'        => ['required', 'numeric', 'min:0', 'max:100'],
        ]);

        // ✅ enforce "leaf only"
        $isLeaf = !ProductCategory::query()
            ->where('parent_id', $request->integer('category_id'))
            ->where('status', 'published')
            ->exists();

        if (!$isLeaf) {
            return back()
                ->withInput()
                ->with('error_msg', 'Please select a leaf category (no child categories).');
        }

        // ✅ prevent duplicate store_id + category_id
        $exists = Commission::query()
            ->where('store_id', $request->integer('store_id'))
            ->where('category_id', $request->integer('category_id'))
            ->exists();

        if ($exists) {
            return back()
                ->withInput()
                ->with('error_msg', 'A commission for this store and category already exists.');
        }

        // ✅ create new commission
        Commission::create([
            'store_id'    => $request->integer('store_id'),
            'category_id' => $request->integer('category_id'),
            'rate'        => $request->input('rate'),
        ]);

        return redirect()->route('commission.index')
            ->with('success_msg', 'Commission saved.');
    }

    /**
     * Build a flat list of categories with indentation and leaf flag.
     * Returns an array of rows: ['id' => int, 'label' => string, 'leaf' => bool]
     */
    
    protected function buildHierarchicalOptions($cats)
    {
        $children = [];
        foreach ($cats as $c) {
            $children[(int) $c->parent_id][] = $c;
        }

        $out = [];
        $walk = function ($parentId, $depth) use (&$walk, &$out, $children) {
            if (!isset($children[$parentId])) {
                return;
            }

            foreach ($children[$parentId] as $idx => $node) {
                $hasKids = isset($children[$node->id]);
                $indent  = str_repeat('— ', max(0, $depth));
                $label   = $indent . $node->name;

                $out[] = [
                    'id'       => $node->id,
                    'label'    => $label,
                    'leaf'     => !$hasKids,
                    'heading'  => ($depth === 0 && $hasKids), // only bold root if it has children
                    'divider'  => false,
                ];

                $walk($node->id, $depth + 1);

                if ($depth === 0) {
                    $out[] = [
                        'id'      => null,
                        'label'   => '────────────',
                        'leaf'    => false,
                        'heading' => false,
                        'divider' => true,
                    ];
                }
            }
        };

        $walk(0, 0);

        return $out;
    }

    public function edit($id)
    {
        $commission = Commission::findOrFail($id);

        $stores = Store::query()->pluck('name', 'id')->all();

        $categories = $this->buildHierarchicalOptions(
            ProductCategory::query()
                ->where('status', 'published')
                ->get()
        );

        return view('plugins/commission::edit', compact('commission', 'stores', 'categories'));
    }

    public function update(Request $request, $id)
    {
        $commission = Commission::findOrFail($id);

        $request->validate([
            'store_id'    => ['required', 'integer', Rule::exists((new Store())->getTable(), 'id')],
            'category_id' => ['required', 'integer', Rule::exists((new ProductCategory())->getTable(), 'id')],
            'rate'        => ['required', 'numeric', 'min:0', 'max:100'],
        ]);

        // ✅ still enforce leaf rule
        $isLeaf = !ProductCategory::query()
            ->where('parent_id', $request->integer('category_id'))
            ->where('status', 'published')
            ->exists();

        if (!$isLeaf) {
            return back()
                ->withInput()
                ->with('error_msg', 'Please select a leaf category (no child categories).');
        }

        // ✅ only update rate (store_id + category_id are locked)
        $commission->update([
            'rate' => $request->input('rate'),
        ]);

        return redirect()->route('commission.index')
            ->with('success_msg', 'Commission updated.');
    }

    public function destroy($id, BaseHttpResponse $response)
    {
        $commission = Commission::findOrFail($id);
        $commission->delete();

        return $response
            ->setMessage(__('Commission deleted successfully.'))
            ->setPreviousUrl(route('commission.index'))
            ->setNextUrl(route('commission.index'));


    }
    

}
