<?php

namespace Yas\Member\Http\Controllers\Admin;

use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Event;
use Yas\AdminTheme\DataGrids\Customers\ReviewDataGrid;
use Yas\AdminTheme\Http\Controllers\Controller;
use Yas\AdminTheme\Http\Requests\MassDestroyRequest;
use Yas\AdminTheme\Http\Requests\MassUpdateRequest;
use Webkul\Product\Repositories\ProductReviewRepository;
//use Yas\FrontTheme\Repositories\ConsignmentEnquiryRepository;
use Yas\Member\Repositories\ConsignmentEnquiryRepository;
use Yas\AdminTheme\DataGrids\Customers\ConsignmentDataGrid;
use Webkul\Attribute\Repositories\AttributeFamilyRepository;
use Webkul\Attribute\Repositories\AttributeRepository;
use Webkul\Attribute\Repositories\AttributeGroupRepository;
use Illuminate\Support\Facades\DB;
use Webkul\Attribute\Repositories\AttributeOptionRepository;
use Yas\Member\Mail\ConsignmentFormApprovedNotification;
use Illuminate\Support\Facades\Mail;
use Yas\User\Models\Admin;

class ConsignmentEnquiryController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct(protected ProductReviewRepository $productReviewRepository,protected ConsignmentEnquiryRepository $consignmentEnquiryRepository,
    protected AttributeFamilyRepository $attributeFamilyRepository,protected AttributeRepository $attributeRepository,protected AttributeGroupRepository $attributeGroupRepository) {}

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\View\View
     */
    public function index()
    {
        //dd($logo = core()->getCurrentChannel()->logo_url);
        if (request()->ajax()) {
            return datagrid(ConsignmentDataGrid::class)->process();
        }

        $families = $this->attributeFamilyRepository->all();

        return view('yas_member::admin.consignment.index',compact('families'));
        
    }

    /**
     * Consignment Details
     */
    public function edit(int $id): JsonResponse
    {
        $consignment = $this->consignmentEnquiryRepository->with(['images'])->findOrFail($id);
        
        //$consignment->date = $consignment->created_at->format('Y-m-d');
        $attributeGroupId = DB::table('attribute_groups')
        ->where('code', 'custom')
        ->value('id');
        
        $attributeIds = DB::table('attribute_group_mappings')
        ->where('attribute_group_id', $attributeGroupId)
        ->pluck('attribute_id')
        ->toArray();
        $attributes = $this->attributeRepository->whereIn('id',$attributeIds)->pluck('admin_name', 'code')
        ->toArray();

        $brandLabel = null;

        if ($consignment->brand) {
            $brandOption = app(AttributeOptionRepository::class)
                ->find($consignment->brand);

            $brandLabel = $brandOption?->admin_name ?? $brandOption?->label;
        }
        $consignment->brand_label = $brandLabel;

        $brandAttribute = $this->attributeRepository->where('code','brand')->first();
        $brands = $brandAttribute->options()->orderBy('admin_name')->get();

        //dd($brands);

        return new JsonResponse([
            'data' => $consignment,
            'attributes' => $attributes,
            'brands' => $brands,
        ]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @return \Illuminate\Http\Response
     */
    public function update(int $id)
    {
        try {
        
            $this->validate(request(), [
                'status'              => 'required|in:approved,disapproved,pending',
                'name'                => 'string|required',
                'contact'             => 'integer|required', 
                'item_description'    => 'required',
                'brand'               => 'required',
                'model'               => 'required',
                'material'            => 'required',
                'color'               => 'required',
                'hardware'            => 'required',
                'stamp'               => 'required',
                'condition'           => 'required',
                'nric'                => 'required',
                'consignment_date'    => 'required|date',
                'price'               => 'numeric|nullable',
                'net_takeback_amount' => 'numeric|nullable',
            ]);

            $checkboxKeys = ['b','db','ss','c','l','k','or','cr','sr','cc','ac','rc'];

            $fields = request()->only(array_merge([
                'name', 'email', 'contact', 'item_description', 'brand', 'model', 
                'material', 'color', 'hardware', 'stamp', 'condition', 'price', 
                'net_takeback_amount', 'nric', 'consignment_date', 'status'
            ], $checkboxKeys));

            // 4. Force missing checkboxes to be 0 (so they actually uncheck in the DB)
            foreach ($checkboxKeys as $key) {
                $fields[$key] = request()->has($key) ? 1 : 0;
            }

            // 5. Update
            // $consignment = $this->consignmentEnquiryRepository->update([
            //     'status' => request()->input('status'),
            // ], $id);
            $consignment = $this->consignmentEnquiryRepository->update($fields, $id);

            // --- EMAIL when status is aproved  ---
            if (request()->get('status') === 'approved') {

                $admins = Admin::whereHas('role', function ($query) {
                    $query->where('code', 'admin');
                })->orderBy('created_at', 'asc')->get(); 

                if ($admins->isNotEmpty()) {
                    // First admin in the DB (Oldest)
                    $primaryAdmin = $admins->first();

                    // Get all other admin emails for BCC
                    $bccEmails = $admins->slice(1)->pluck('email')->toArray();

                    // Pass both to the Mailable
                    Mail::queue(new ConsignmentFormApprovedNotification($primaryAdmin, $consignment, $bccEmails));
                }
                
                //Mail::queue(new ConsignmentFormApprovedNotification($admin, $consignment));
            }

            return new JsonResponse([
                'message' => trans('yas_admin::app.customers.consignment.index.datagrid.update-success'),
            ]);
        } catch (\Exception $e) {
            return new JsonResponse([
                'message' => trans('yas_admin::app.response.delete-failed', ['name' => 'Consignment']),
            ], 500);
        }

    }

    /**
     * Delete the consignment of the current product
     */
    public function destroy(int $id): JsonResponse
    {
        try {
            //Event::dispatch('customer.consignment.delete.before', $id);

            $this->consignmentEnquiryRepository->delete($id);

            //Event::dispatch('customer.consignment.delete.after', $id);

            return new JsonResponse([
                'message' => trans('yas_admin::app.customers.consignment.index.datagrid.delete-success', ['name' => 'Consignment']),

            ]);
        } catch (\Exception $e) {
            return new JsonResponse([
                'message' => trans('yas_admin::app.response.delete-failed', ['name' => 'Consignment']),
            ], 500);
        }
    }

    /**
     * Mass delete the consignments on the products.
     */
    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse
    {
        $indices = $massDestroyRequest->input('indices');

        try {
            foreach ($indices as $index) {
                //Event::dispatch('customer.consignment.delete.before', $index);

                $this->consignmentEnquiryRepository->delete($index);

                //Event::dispatch('customer.consignment.delete.after', $index);
            }

            return new JsonResponse([
                'message' => trans('yas_admin::app.customers.consignment.index.datagrid.mass-delete-success'),
            ], 200);
        } catch (\Exception $e) {
            return new JsonResponse([
                'message' => $e->getMessage(),
            ], 500);
        }
    }

    /**
     * Mass approve the consignments on the products.
     */
    public function massUpdate(MassUpdateRequest $massUpdateRequest): JsonResponse
    {
        $indices = $massUpdateRequest->input('indices');

        foreach ($indices as $id) {
            //Event::dispatch('customer.consignment.update.before', $id);

            $consignment = $this->consignmentEnquiryRepository->update([
                'status' => $massUpdateRequest->input('value'),
            ], $id);

            //Event::dispatch('customer.consignment.update.after', $consignment);
        }

        return new JsonResponse([
            'message' => trans('yas_admin::app.customers.consignment.index.datagrid.mass-update-success'),
        ], 200);
    }
}
