<?php
namespace App\Http\Controllers;
use App\Exports\VoucherPromoPointExport;
use App\Models\PromoPoint;
use App\Models\VoucherPromoPoint;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Carbon\Carbon;
use Yajra\DataTables\DataTables;
use Illuminate\Support\Facades\DB;
use DateTime;
use Illuminate\Validation\Rule;
use Intervention\Image\ImageManagerStatic as Image;

use Illuminate\Support\Facades\File;
use Maatwebsite\Excel\Facades\Excel;
class VoucherPromoPointController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('permission:view-voucher-promo-point', ['only' => ['index','show', 'listdata', 'export_all']]);
        $this->middleware('permission:create-voucher-promo-point', ['only' => ['create','store']]);
        $this->middleware('permission:edit-voucher-promo-point', ['only' => ['edit','update']]);
        $this->middleware('permission:delete-voucher-promo-point', ['only' => ['destroy']]);
    }
    public function index(Request $request)
    {

        return view('voucher-gb.index');
    }
    public function listdata()
    {
        $data = VoucherPromoPoint::with([
            'promoPoint' => function ($query) {
                $query->select('id', 'deskripsi');
            }
        ])
            ->select('id','nama_voucher','promo_point_id','status','tgl_active','tgl_inactive','external_code', 'kriteria_coin','alokasi','kuota', 'redeem')
            ->orderBy('id', 'asc')
            ->get();

        return DataTables::of($data)->make(true);
    }
    public function create()
    {
        $voucher_gb = new VoucherPromoPoint();
        $promo_point = PromoPoint::where('status', 'Aktif')
            ->select('id','deskripsi')
            ->get();
        $options = [
            'Aktif' => 'Aktif',
            'Tidak Aktif' => 'Tidak Aktif'
        ];
        $tgl_active = '';
        $tgl_inactive = '';
        return view('voucher-gb.create', compact('voucher_gb', 'promo_point', 'options', 'tgl_active','tgl_inactive'));
    }
    public function store(Request $request)
    {
        try{
        
            $tgl_active = $request->input('tgl_active');
            $tgl_inactive = $request->input('tgl_inactive');
            if ($tgl_active != null){
                $tgl_active_converted = DateTime::createFromFormat('d/m/Y', $tgl_active);
            }
            if ($tgl_inactive != null){
                $tgl_inactive_converted = DateTime::createFromFormat('d/m/Y', $tgl_inactive);
            }

            $user = DB::table('users')->where('id', Auth::id())->first();
            $validateData = $request->validate([
                'external_code' => 'required|unique:voucher_promo_point|max:200',
                'alokasi' => 'required|integer|min:1',
                'image' => 'image|max:2048',
                'tgl_active' => 'required|date|before_or_equal:tgl_inactive',
                'tgl_inactive' => 'required|date|after_or_equal:tgl_active',
                'status' => 'required',
                'promo_point_id' => 'required',
                'nama_voucher' => 'required',
                'kriteria_coin' => 'required|integer|min:1',
                'deskripsi' =>[
                    'required'
                ],
            ],[
                'nama_voucher.required' => 'Nama voucher belum diisi.',
                'promo_point_id.required' => 'Coin promo belum diisi.',
                'kriteria_coin.required' => 'Kriteria Coin belum diisi.',
                'status.required' => 'Status belum diisi.',
                'deskripsi.required' => 'Deskirpsi belum diisi.',
                'tgl_active.required' => 'Tanggal aktif belum diisi.',
                'tgl_inactive.required' => 'Tanggal tidak aktif belum diisi.',
                'alokasi.required' => 'Unit belum diisi.',
                'external_code.required' => 'Kode Voucher RGApp belum diisi.',

                'external_code.unique' => 'Kode Voucher RgApp sudah tersedia',
                'external_code.max' => 'Kode Voucher RgApp maximal 200 character',
                'alokasi.min' => 'Unit minimal 1',
                'kriteria_coin.min' => 'Kriteria coin minimal 1',
                'image.max' => 'Gambar maksimal 2 mb',
                'tgl_active.date' => 'Tanggal aktif belum dalam format tanggal yang benar.',
                'tgl_inactive.date' => 'Tanggal tidak aktif harus dalam format tanggal yang benar.',
                'tgl_active.before_or_equal' => 'Tanggal aktif harus diisi sebelum tanggal tidak aktif',
                'tgl_inactive.after_or_equal' => 'Tanggal tidak aktif harus diisi setelah tanggal aktif.',
            ]);
            $tanggal_mulai = Carbon::parse($request->tgl_active)->format('Y-m-d');
            $tanggal_selesai = Carbon::parse($request->tgl_inactive)->format('Y-m-d');

            $promo_point = PromoPoint::find($request->promo_point_id);
            if($tanggal_mulai < $promo_point->tgl_mulai_penukaran_point or $tanggal_mulai  > $promo_point->tgl_selesai_penukaran_point){
                return response()->json(['message' => 'Tanggal aktif tidak boleh lebih kecil atau lebih besar dari periode penukaran coin.'], 422);
            }
            if($tanggal_selesai < $promo_point->tgl_mulai_penukaran_point or $tanggal_selesai  > $promo_point->tgl_selesai_penukaran_point){
                return response()->json(['message' => 'Tanggal tidak aktif tidak boleh lebih kecil atau lebih besar dari periode penukaran coin.'], 422);
            }

            if ($request->hasFile('image')) {

                $extension = $request->file('image')->extension();
                $nameland=$request->file('image')->getClientOriginalname();
                $lower_file_name=strtolower($nameland);
                $replace_space=str_replace(' ', '-', $lower_file_name);
                $finalname=time().'-'.$replace_space;
                $destination=public_path('images/vouchergb/');


                $img = Image::make($request->file('image')->path());
                $img->resize(800, null, function ($const) {
                    $const->aspectRatio();
                })->save($destination.'/'.$finalname);



                $voucher_gb = VoucherPromoPoint::create([
                    'nama_voucher' => $request->nama_voucher,
                    'promo_point_id' => $request->promo_point_id,
                    'kriteria_coin' => $request->kriteria_coin,
                    'status' => $request->status,
                    'tgl_inactive' => $tanggal_selesai,
                    'tgl_active' => $tanggal_mulai,
                    'deskripsi' => $request->deskripsi,
                    'alokasi' => $request->alokasi,
                    'kuota' => $request->alokasi,
                    'external_code'=> $request->external_code,
                    'image' => $finalname,
                    'created_who' => $user->name,

                ]);
            }else{
                $voucher_gb = VoucherPromoPoint::create([
                    'nama_voucher' => $request->nama_voucher,
                    'promo_point_id' => $request->promo_point_id,
                    'kriteria_coin' => $request->kriteria_coin,
                    'status' => $request->status,
                    'tgl_inactive' => $tanggal_selesai,
                    'tgl_active' => $tanggal_mulai,
                    'alokasi' => $request->alokasi,
                    'kuota' => $request->alokasi,
                    'deskripsi' => $request->deskripsi,
                    'external_code'=> $request->external_code,
                    'created_who' => $user->name,
                ]);
            }
            if($request->action=='save_and_close'){
                return redirect()->route('voucher-gb.index')
                    ->with('success', 'Voucher GB Berhasil Dibuat.');
            }else{
                return redirect()->route('voucher-gb.create')
                    ->with('success', 'Voucher GB Berhasil Dibuat.');
            }

        }catch (\Exception $e) {
            $response['message'] = 'Gagal mengubah data: ' . $e->getMessage();
            return response()->json(['message' => 'Gagal mengubah data: ' . $e->getMessage()], 422);

        }

    }
    public function show($id)
    {
        $voucher_gb= VoucherPromoPoint::find($id);
        $promo_point = PromoPoint::find($voucher_gb->promo_point_id);
        return view('voucher-gb.show', compact('voucher_gb','promo_point'));
    }

    public function edit($id)
    {
        $voucher_gb = VoucherPromoPoint::find($id);
        $options = [
            'Aktif' => 'Aktif',
            'Tidak Aktif' => 'Tidak Aktif'
        ];
        $tgl_active = Carbon::parse($voucher_gb->tgl_active)->format('d-m-Y');
        $tgl_inactive = Carbon::parse($voucher_gb->tgl_inactive)->format('d-m-Y');
        $promo_point = PromoPoint::where('status', 'Aktif')
            ->select('id','deskripsi')
            ->get();
        return view('voucher-gb.edit', compact('voucher_gb' ,'promo_point', 'options', 'tgl_active','tgl_inactive'));
    }
    public function  updated(Request $request,$id){
        return 'sasa';
    }
    public function update(Request $request,$id)
    {
        $tgl_active = $request->input('tgl_active');
        $tgl_inactive = $request->input('tgl_inactive');
        if ($tgl_active != null){
            $tgl_active_converted = DateTime::createFromFormat('d/m/Y', $tgl_active);
        }
        if ($tgl_inactive != null){
            $tgl_inactive_converted = DateTime::createFromFormat('d/m/Y', $tgl_inactive);
        }

        $user = DB::table('users')->where('id', Auth::id())->first();
        $validateData = $request->validate([
            'external_code' => ['required',Rule::unique('voucher_promo_point', 'external_code')->where(function ($query) use ($request) {
                return $query->where('external_code', $request->external_code);
            })
                ->ignore($id, 'id')],
            'alokasi' => 'required|integer|min:1',
            'image' => 'image|max:2048',
            'tgl_active' => 'required|date|before_or_equal:tgl_inactive',
            'tgl_inactive' => 'required|date|after_or_equal:tgl_active',
            'status' => 'required',
            'promo_point_id' => 'required',
            'nama_voucher' => 'required',
            'kriteria_coin' => 'required|integer|min:1',
            'deskripsi' =>[
                'required'
            ],

        ],[
            'nama_voucher.required' => 'Nama voucher belum diisi.',
            'promo_point_id.required' => 'Coin promo belum diisi.',
            'kriteria_coin.required' => 'Kriteria Coin belum diisi.',
            'deskripsi.required' => 'Deskripsi belum diisi.',
            'status.required' => 'Status belum diisi.',
            'tgl_active.required' => 'Tanggal aktif belum diisi.',
            'tgl_inactive.required' => 'Tanggal tidak aktif belum diisi.',
            'alokasi.required' => 'Unit belum diisi.',
            'external_code.required' => 'Kode Voucher RGApp belum diisi.',

            'external_code.unique' => 'Kode Voucher RgApp sudah tersedia',
            'alokasi.min' => 'Unit minimal 1',
            'kriteria_coin.min' => 'Kriteria coin minimal 1',
            'image.max' => 'Gambar maksimal 2 mb',
            'tgl_active.date' => 'Tanggal aktif belum dalam format tanggal yang benar.',
            'tgl_inactive.date' => 'Tanggal tidak aktif aktif harus dalam format tanggal yang benar.',
            'tgl_active.before_or_equal' => 'Tanggal aktif harus diisi sebelum tanggal tidak aktif',
            'tgl_inactive.after_or_equal' => 'Tanggal tidak aktif harus diisi setelah tanggal aktif.',
        ]);
        $tanggal_mulai = Carbon::parse($request->tgl_active)->format('Y-m-d');
        $tanggal_selesai = Carbon::parse($request->tgl_inactive)->format('Y-m-d');
        $voucher_gb = VoucherPromoPoint::find($id);

        $promo_point = PromoPoint::find($request->promo_point_id);
        if($tanggal_mulai < $promo_point->tgl_mulai_penukaran_point or $tanggal_mulai  > $promo_point->tgl_selesai_penukaran_point){
            return response()->json(['message' => 'Tanggal aktif tidak boleh lebih kecil atau lebih besar dari periode penukaran coin.'], 422);
        }
        if($tanggal_selesai < $promo_point->tgl_mulai_penukaran_point or $tanggal_selesai  > $promo_point->tgl_selesai_penukaran_point){
            return response()->json(['message' => 'Tanggal tidak aktif tidak boleh lebih kecil atau lebih besar dari periode penukaran coin.'], 422);
        }
        if((int)$request->alokasi < (int)$voucher_gb->redeem){
            return response()->json(['message' => 'Nilai Alokasi tidak boleh kurang dari total redeem.'], 422);
        }
        try {

            if ($request->hasFile('image')) {
                File::delete('images/vouchergb/'.$request->old_foto);
                $extension = $request->file('image')->extension();
                $nameland=$request->file('image')->getClientOriginalname();
                $lower_file_name=strtolower($nameland);
                $replace_space=str_replace(' ', '-', $lower_file_name);
                $finalname=time().'-'.$replace_space;
                $destination=public_path('images/vouchergb/');

                $img = Image::make($request->file('image')->path());
                $img->resize(800, null, function ($const) {
                    $const->aspectRatio();
                })->save($destination.'/'.$finalname);

                $voucher_gb->update([
                    'nama_voucher' => $request->nama_voucher,
                    'promo_point_id' => $request->promo_point_id,
                    'kriteria_coin' => $request->kriteria_coin,
                    'deskripsi' => $request->deskripsi,
                    'status' => $request->status,
                    'tgl_inactive' => $tanggal_selesai,
                    'tgl_active' => $tanggal_mulai,
                    'alokasi' => $request->alokasi,
                    //'kuota' => $request->alokasi,
                    'external_code'=> $request->external_code,
                    'image' => $finalname,
                    'updated_who' => $user->name,

                ]);
            }else{
                $voucher_gb->update([
                    'nama_voucher' => $request->nama_voucher,
                    'promo_point_id' => $request->promo_point_id,
                    'kriteria_coin' => $request->kriteria_coin,
                    'status' => $request->status,
                    'deskripsi' => $request->deskripsi,
                    'tgl_inactive' => $tanggal_selesai,
                    'tgl_active' => $tanggal_mulai,
                    'alokasi' => $request->alokasi,
                    //'kuota' => $request->alokasi,
                    'external_code'=> $request->external_code,
                    'updated_who' => $user->name,
                ]);
            }
            return redirect()->route('voucher-gb.index')
                ->with('success', 'Voucher GB Berhasil Diubah');
        } catch (\Exception $e) {
            // Log the error
            Log::error('Error uploading image', ['message' => $e->getMessage(), 'trace' => $e->getTraceAsString()]);

            // Return a JSON response with the error message
            return response()->json(['message' => $e->getMessage()], 500);
        }
    }
    public function export_all()
    {

        return Excel::download(new VoucherPromoPointExport(), 'data_voucher_coin.xlsx');
    }
    public function destroy($id)
    {
        $voucher_gb = VoucherPromoPoint::find($id);
        $response = [];

        try {
            if($voucher_gb){
                $voucher_gb->update([
                    'external_code'=> null
                ]);
                $voucher_gb->delete();
                $response['message'] = 'Data berhasil dihapus.';
                return response()->json($response, 200);
            }
        }catch (\Exception $e) {
            $response['message'] = 'Gagal menghapus data: ' . $e->getMessage();
            return response()->json($response, 500);
        }
        return redirect()->route('voucher-gb.index')
            ->with('success', 'Promo Point Berhasil Dihapus');
    }

}




?>
