<?php

namespace App\Http\Controllers;

use App\Models\Partner;
use App\Models\Country;
use App\Models\Journal;
use App\Traits\DataTable;
use App\Models\Coordinator;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class PartnerController extends Controller
{
    use DataTable;

    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index(Request $request)
    {
        $trashed = $request->segment(count(request()->segments()));
        $options = [
            'breadcrumb' => [
                'لوحة التحكم'=>route('home')
                , 'قائمة مزودي الخدمة' . ($trashed == 'trashed' ? ' المحذوفة' : '')],
            'route' => route('partners.' . ($trashed == 'trashed' ? 'trashed' : 'index')),
            'buttons' => [
                'delete' => 'partners.multiDelete',
                'restore' => 'partners.multiRestore',
                'forceDelete' => 'partners.multiForceDelete',
            ],
            'trashed' => $trashed,
            'create' => [
                'route' => 'partners.create',
                'title' => 'إضافة مزود خدمة',
            ],
            'search' => true,
            'export' => true,
            'filters' => [
                [
                    'name' => 'country',
                    'type' => 'select',
                    'title' => 'الدولة',
                    'all' => 'كل الدول',
                    'column' => 3,
                    'data' => Country::pluck('name', 'id')->toArray(),
                    'get' => [
                        'ajax' => route('ajax.citiesFromCountry', ':id'),
                        'empty' => [
                            'city',
                        ],
                        'select' => [
                            'city',
                        ]
                    ],
                ],
                [
                    'name' => 'city',
                    'type' => 'select',
                    'title' => 'المدينة',
                    'all' => 'كل المدن',
                    'column' => 4,
                    'data' => [],
                ]
            ],
            'defaultOrder' => [
                [1, 'desc']
            ],
            'columns' => [
                [
                    'title' => 'Checkbox',
                    'id' => 'checkbox',
                    'width' => 5,
                    'orderable' => false,
                    'exportable' => false,
                    'commas' => '',
                    'data' => [
                        [
                            'column' => 'allColumns',
                            'functions' => [
                                'checkbox' => []
                            ],
                            'before' => '',
                            'after' => '',
                        ]
                    ]
                ],
                [
                    'title' => 'الرقم',
                    'id' => 'id',
                    'width' => 5,
                    'orderable' => true,
                    'exportable' => true,
                    'commas' => '',
                    'data' => [
                        [
                            'column' => 'id',
                            'functions' => [],
                            'before' => '',
                            'after' => '',
                        ]
                    ]
                ],
                [
                    'title' => 'الاسم',
                    'id' => 'name',
                    'width' => 40,
                    'orderable' => true,
                    'exportable' => true,
                    'commas' => '',
                    'data' => [
                        [
                            'column' => 'name',
                            'functions' => [],
                            'before' => '',
                            'after' => '',
                        ]
                    ]
                ],
                [
                    'title' => 'الدولة',
                    'id' => 'country',
                    'width' => 10,
                    'orderable' => true,
                    'exportable' => true,
                    'commas' => '',
                    'data' => [
                        [
                            'column' => 'city->country->name',
                            'functions' => [],
                            'before' => '',
                            'after' => '',
                        ]
                    ]
                ],
                [
                    'title' => 'المدينة',
                    'id' => 'city',
                    'width' => 10,
                    'orderable' => true,
                    'exportable' => true,
                    'commas' => '',
                    'data' => [
                        [
                            'column' => 'city->name',
                            'functions' => [],
                            'before' => '',
                            'after' => '',
                        ]
                    ]
                ],
                [
                    'title' => 'البريد الإلكتروني',
                    'id' => 'email',
                    'width' => 10,
                    'orderable' => true,
                    'exportable' => true,
                    'commas' => '',
                    'data' => [
                        [
                            'column' => 'email',
                            'functions' => [],
                            'before' => '',
                            'after' => '',
                        ]
                    ]
                ],
                [
                    'title' => 'الهاتف',
                    'id' => 'phone',
                    'width' => 10,
                    'orderable' => true,
                    'exportable' => true,
                    'commas' => '',
                    'data' => [
                        [
                            'column' => 'phone',
                            'functions' => [],
                            'before' => '',
                            'after' => '',
                        ]
                    ]
                ],

                [
                    'title' => 'المجموعات',
                    'id' => 'groups',
                    'width' => 20,
                    'orderable' => true,
                    'exportable' => true,
                    'commas' => '',
                    'data' => [
                        [
                            'column' => 'group_names',
                            'functions' => [],
                            'before' => '',
                            'after' => '',
                        ]
                    ]
                ],

                [
                    'title' => 'الإعدادات',
                    'id' => 'settings',
                    'width' => 10,
                    'orderable' => false,
                    'exportable' => false,
                    'commas' => '',
                    'data' => [
                        [
                            'column' => 'allColumns',
                            'functions' => [
                                'settings' => [
                                    [
                                        [
                                            'title' => 'تعديل',
                                            'route' => 'partners.edit',
                                            'id' => 'inside',
                                            'columnId' => 'id',
                                            'permission' => 'partners.edit',
                                            'type' => 'popup',
                                            'conditions' => [
                                                [
                                                    'column' => 'deleted_at',
                                                    'type' => '==',
                                                    'value' => [null]
                                                ]
                                            ]
                                        ],
                                        [
                                            'title' => 'حذف',
                                            'route' => 'partners.destroy',
                                            'id' => 'inside',
                                            'columnId' => 'id',
                                            'permission' => 'partners.destroy',
                                            'type' => 'sweet_alert',
                                            'sweetAlert' => 'هل أنت متأكد من حذف الشركة؟',
                                            'conditions' => [
                                                [
                                                    'column' => 'deleted_at',
                                                    'type' => '==',
                                                    'value' => [null]
                                                ]
                                            ]
                                        ],
                                        [
                                            'title' => 'استعادة',
                                            'route' => 'partners.restore',
                                            'id' => 'inside',
                                            'columnId' => 'id',
                                            'permission' => 'partners.restore',
                                            'type' => 'sweet_alert',
                                            'sweetAlert' => 'هل أنت متأكد من استعادة الشركة؟',
                                            'conditions' => [
                                                [
                                                    'column' => 'deleted_at',
                                                    'type' => '!=',
                                                    'value' => [null]
                                                ]
                                            ]
                                        ],
                                        [
                                            'title' => 'حذف نهائي',
                                            'route' => 'partners.forceDelete',
                                            'id' => 'inside',
                                            'columnId' => 'id',
                                            'permission' => 'partners.forceDelete',
                                            'type' => 'sweet_alert',
                                            'sweetAlert' => 'هل أنت متأكد من حذف الشركة نهائيا؟',
                                            'conditions' => [
                                                [
                                                    'column' => 'deleted_at',
                                                    'type' => '!=',
                                                    'value' => [null]
                                                ]
                                            ]
                                        ]
                                    ]
                                ]
                            ],
                            'before' => '',
                            'after' => '',
                        ]
                    ]
                ]
            ]
        ];

        if($request->ajax == true) {
            $data = Partner::withTrashed()->where(function ($query) use ($trashed) {
                if ($trashed == 'trashed') {
                    $query->onlyTrashed();
                } else {
                    $query->withoutTrashed();
                }
            })->with(['city', 'city.country'])->get()->toArray();

            return $this->init($data, $options['columns']);
        }

        return view('data', compact(
            'options'
        ));
    }

    public function create(Request $request)
    {
        $options = [
            'title' => 'إضافة مزود خدمة',
            'route' => route('partners.store'),
            'submit' => 'إضافة',
            'inputs' => [
                [
                    'formtype' => 'input',
                    'type' => 'text',
                    'label' => 'الإسم',
                    'placeholder' => 'ضع الإسم',
                    'id' => 'name',
                    'name' => 'name',
                    'value' => '',
                    'required' => 'required',
                    'other' => '',
                    'colsize' => '6'
                ],
                [
                    'formtype' => 'input',
                    'type' => 'text',
                    'label' => 'الموقع الإلكتروني',
                    'placeholder' => 'ضع الموقع الإلكتروني',
                    'id' => 'website',
                    'name' => 'website',
                    'value' => '',
                    'required' => '',
                    'other' => '',
                    'colsize' => '6'
                ],
                [
                    'formtype' => 'input',
                    'type' => 'email',
                    'label' => 'البريد الإلكتروني',
                    'placeholder' => 'ضع البريد الإلكتروني',
                    'id' => 'email',
                    'name' => 'email',
                    'value' => '',
                    'required' => '',
                    'other' => '',
                    'colsize' => '6'
                ],
                [
                    'formtype' => 'input',
                    'type' => 'number',
                    'label' => 'الهاتف',
                    'placeholder' => 'ضع الهاتف',
                    'id' => 'phone',
                    'name' => 'phone',
                    'value' => '',
                    'required' => '',
                    'other' => '',
                    'colsize' => '6'
                ],
                [
                    'formtype' => 'image',
                    'label' => 'الشعار',
                    'id' => 'logo',
                    'name' => 'logo',
                    'value' => '',
                    'required' => '',
                    'defaultSize' => 'no',
                    'width' => 300,
                    'height' => 300,
                    'fit' => 'no',
                    'folder' => 'partners',
                    'other' => '',
                    'colsize' => '12'
                ],
                [
                    'formtype' => 'select',
                    'label' => 'الدولة',
                    'placeholder' => 'اختر الدولة',
                    'id' => 'country_id',
                    'name' => 'country_id',
                    'value' => '',
                    'required' => 'required',
                    'options' => Country::pluck('name', 'id')->toArray(),
                    'hide-search' => false,
                    'get' => [
                        'ajax' => route('ajax.citiesFromCountry', ':id'),
                        'empty' => [
                            'city_id',
                        ],
                        'select' => [
                            'city_id',
                        ]
                    ],
                    'modal' => true,
                    'multiple' => false,
                    'other' => '',
                    'colsize' => '6',
                ],
                [
                    'formtype' => 'select',
                    'label' => 'المدينة',
                    'placeholder' => 'اختر المدينة',
                    'id' => 'city_id',
                    'name' => 'city_id',
                    'value' => '',
                    'required' => 'required',
                    'options' => [],
                    'hide-search' => false,
                    'modal' => true,
                    'multiple' => false,
                    'other' => '',
                    'colsize' => '6',
                ],
                [
                    'formtype' => 'select',
                    'label' => 'المنسقين',
                    'placeholder' => 'اختر المنسقين',
                    'id' => 'coordinators',
                    'name' => 'coordinators[]',
                    'value' => '',
                    'required' => '',
                    'options' => Coordinator::all()->pluck('my_full_name', 'id')->toArray(),
                    'hide-search' => false,
                    'modal' => true,
                    'multiple' => true,
                    'other' => '',
                    'colsize' => '12'
                ],
                /* [
                    'formtype' => 'map',
                    'label' => 'الإحداثيات',
                    'id' => 'map',
                    'name' => 'map',
                    'value' => '',
                    'mapcurrent' => true,
                    'required' => '',
                    'other' => '',
                    'colsize' => '12'
                ] */
            ]
        ];

        return response()->json([
            'title' => $options['title'],
            'html' => view('form', compact('options'))->render()
        ]);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => ['required', 'string', 'max:255', 'min:2'],
            'country_id' => ['required', 'exists:countries,id'],
            'city_id' => ['required', 'exists:cities,id'],
        ]);

        if ($validator->fails()) {
            return response()->json([
                'status' => false,
                'errors' => $validator->errors()
            ]);
        }

        $model = Partner::create($request->all());
        $model->coordinators()->attach($request->coordinators);

        Journal::create([
            'user_id' => Auth::user()->id,
            'title' => 'إضافة مزود خدمة جديدة',
            'content' => 'قام بإضافة مزود خدمة جديدة تحمل الرقم: ' . $model->id
        ]);

        return response()->json([
            'status' => true,
            'message' => 'تم إضافة المزود خدمة بنجاح'
        ]);
    }

    public function edit(Request $request, $id)
    {
        $model = Partner::findOrfail($id);

        $options = [
            'title' => 'تعديل مزود خدمة',
            'route' => route('partners.update', $model->id),
            'submit' => 'تعديل',
            'inputs' => [
                [
                    'formtype' => 'input',
                    'type' => 'text',
                    'label' => 'الإسم',
                    'placeholder' => 'ضع الإسم',
                    'id' => 'name',
                    'name' => 'name',
                    'value' => $model->name,
                    'required' => 'required',
                    'other' => '',
                    'colsize' => '6'
                ],
                [
                    'formtype' => 'input',
                    'type' => 'text',
                    'label' => 'الموقع الإلكتروني',
                    'placeholder' => 'ضع الموقع الإلكتروني',
                    'id' => 'website',
                    'name' => 'website',
                    'value' => $model->website,
                    'required' => '',
                    'other' => '',
                    'colsize' => '6'
                ],
                [
                    'formtype' => 'input',
                    'type' => 'email',
                    'label' => 'البريد الإلكتروني',
                    'placeholder' => 'ضع البريد الإلكتروني',
                    'id' => 'email',
                    'name' => 'email',
                    'value' => $model->email,
                    'required' => '',
                    'other' => '',
                    'colsize' => '6'
                ],
                [
                    'formtype' => 'input',
                    'type' => 'number',
                    'label' => 'الهاتف',
                    'placeholder' => 'ضع الهاتف',
                    'id' => 'phone',
                    'name' => 'phone',
                    'value' => $model->phone,
                    'required' => '',
                    'other' => '',
                    'colsize' => '6'
                ],
                [
                    'formtype' => 'image',
                    'label' => 'الشعار',
                    'id' => 'logo',
                    'name' => 'logo',
                    'value' => $model->logo,
                    'required' => '',
                    'defaultSize' => 'no',
                    'width' => 300,
                    'height' => 300,
                    'fit' => 'no',
                    'folder' => 'partners',
                    'other' => '',
                    'colsize' => '12'
                ],
                [
                    'formtype' => 'select',
                    'label' => 'الدولة',
                    'placeholder' => 'اختر الدولة',
                    'id' => 'country_id',
                    'name' => 'country_id',
                    'value' => $model->city->country_id,
                    'required' => 'required',
                    'options' => Country::pluck('name', 'id')->toArray(),
                    'hide-search' => false,
                    'get' => [
                        'ajax' => route('ajax.citiesFromCountry', ':id'),
                        'empty' => [
                            'city_id',
                        ],
                        'select' => [
                            'city_id',
                        ]
                    ],
                    'modal' => true,
                    'multiple' => false,
                    'other' => '',
                    'colsize' => '6',
                ],
                [
                    'formtype' => 'select',
                    'label' => 'المدينة',
                    'placeholder' => 'اختر المدينة',
                    'id' => 'city_id',
                    'name' => 'city_id',
                    'value' => $model->city_id,
                    'required' => 'required',
                    'options' => $model->city->country->cities->pluck('name', 'id')->toArray(),
                    'hide-search' => false,
                    'modal' => true,
                    'multiple' => false,
                    'other' => '',
                    'colsize' => '6',
                ],
                [
                    'formtype' => 'select',
                    'label' => 'المنسقين',
                    'placeholder' => 'اختر المنسقين',
                    'id' => 'coordinators',
                    'name' => 'coordinators[]',
                    'value' => $model->coordinators->pluck('id')->toArray(),
                    'required' => '',
                    'options' => Coordinator::all()->pluck('my_full_name', 'id')->toArray(),
                    'hide-search' => false,
                    'modal' => true,
                    'multiple' => true,
                    'other' => '',
                    'colsize' => '12'
                ],
                /* [
                    'formtype' => 'map',
                    'label' => 'الإحداثيات',
                    'id' => 'map',
                    'name' => 'map',
                    'value' => $model->map,
                    'mapcurrent' => true,
                    'required' => '',
                    'other' => '',
                    'colsize' => '12'
                ] */
            ]
        ];

        return response()->json([
            'title' => $options['title'],
            'html' => view('form', compact('options'))->render()
        ]);
    }

    public function update(Request $request, $id)
    {
        $model = Partner::findOrfail($id);

        $validator = Validator::make($request->all(), [
            'name' => ['required', 'string', 'max:255', 'min:2'],
            'country_id' => ['required', 'exists:countries,id'],
            'city_id' => ['required', 'exists:cities,id'],
        ]);

        if ($validator->fails()) {
            return response()->json([
                'status' => false,
                'errors' => $validator->errors()
            ]);
        }

        $model->update($request->all());
        $model->coordinators()->sync($request->coordinators);

        Journal::create([
            'user_id' => Auth::user()->id,
            'title' => 'تعديل مزود خدمة',
            'content' => 'قام بتعديل بيانات الشركة رقم: ' . $model->id
        ]);

        return response()->json([
            'status' => true,
            'message' => 'تم تعديل الشركة بنجاح'
        ]);
    }

    public function destroy(Request $request, $id)
    {
        $model = Partner::findOrfail($id);

        Journal::create([
            'user_id' => Auth::user()->id,
            'title' => 'حذف مزود خدمة',
            'content' => 'قام بحذف الشركة رقم: ' . $model->id
        ]);

        $model->delete();

        return response()->json([
            'status' => true,
            'message' => "تم حذف الشركة بنجاح"
        ]);
    }

    public function restore(Request $request, $id)
    {
        $model = Partner::onlyTrashed()->findOrfail($id);

        Journal::create([
            'user_id' => Auth::user()->id,
            'title' => 'استعادة مزود خدمة',
            'content' => 'قام بإستعادة الشركة رقم: ' . $model->id
        ]);

        $model->restore();

        return response()->json([
            'status' => true,
            'message' => "تم استعادة الشركة بنجاح"
        ]);
    }

    public function forceDelete(Request $request, $id)
    {
        $model = Partner::onlyTrashed()->findOrfail($id);

        Journal::create([
            'user_id' => Auth::user()->id,
            'title' => 'حذف مزود خدمة نهائيا',
            'content' => 'قام بحذف نهائيا الشركة رقم: ' . $model->id
        ]);

        $model->forceDelete();

        return response()->json([
            'status' => true,
            'message' => "تم حذف الشركة نهائيا بنجاح"
        ]);
    }

    public function multiDelete(Request $request)
    {
        $ids = $request->ids;
        $newIds = [];

        foreach ($ids as $id) {
            Partner::find($id)->delete();
            $newIds[] = $id;
        }

        Journal::create([
            'user_id' => Auth::user()->id,
            'title' => 'حذف فنادق',
            'content' => 'قام بحذف فنادق تحمل الأرقام التالية: ' . implode(', ', $newIds)
        ]);

        return response()->json([
            'status' => true,
            'message' => "تم حذف مزودي الخدمة المحددين بنجاح",
            'ids' => $newIds
        ]);
    }

    public function multiRestore(Request $request)
    {
        $ids = $request->ids;
        $newIds = [];

        foreach ($ids as $id) {
            Partner::withTrashed()->find($id)->restore();
            $newIds[] = $id;
        }

        Journal::create([
            'user_id' => Auth::user()->id,
            'title' => 'استعادة فنادق',
            'content' => 'قام بإستعادة فنادق تحمل الأرقام التالية: ' . implode(', ', $newIds)
        ]);

        return response()->json([
            'status' => true,
            'message' => "تم استعادة مزودي الخدمة المحددين بنجاح",
            'ids' => $newIds
        ]);
    }

    public function multiForceDelete(Request $request)
    {
        $ids = $request->ids;
        $newIds = [];

        foreach ($ids as $id) {
            Partner::withTrashed()->find($id)->forceDelete();
            $newIds[] = $id;
        }

        Journal::create([
            'user_id' => Auth::user()->id,
            'title' => 'حذف فنادق نهائيا',
            'content' => 'قام بحذف نهائيا فنادق تحمل الأرقام التالية: ' . implode(', ', $newIds)
        ]);

        return response()->json([
            'status' => true,
            'message' => "تم حذف نهائيا مزودي الخدمة المحددين بنجاح",
            'ids' => $newIds
        ]);
    }
}
