<?php

namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Auth;

class DisbursementOffersData extends Model
{
    use SoftDeletes;

    private $status = false;
    protected $table = 'disbursement_offers';

    public function saveOffers($offers){
        $user_id = Auth::user()->id;
        if (isset($offers['per_disbursement_amount']) && is_array($offers['per_disbursement_amount']) && isset($offers['day_from_disbursement_date']) && is_array($offers['day_from_disbursement_date'])){
            $existingOffers = $this->where('offer_id',$offers['offer_id'])->get(['id'])->toArray();
            $existingOffers = array_flip(array_map(function ($item){return $item['id'];},$existingOffers));
            $phase = 0;
            foreach ($offers['per_disbursement_amount'] as $key=>$offerPercentageAmount) {
                if ($offerPercentageAmount && isset($offers['day_from_disbursement_date'][$key])) {
                    $phase++;
                    if ($key > 0){
                        unset($existingOffers[$key]);

                        $disbursementOffers = [
                            'per_disbursement_amount' => $offerPercentageAmount,
                            'phase' => $phase,
                            'day_from_disbursement_date' => $offers['day_from_disbursement_date'][$key],
                            'disbursement_at' => $offers['disbursement_at_phase'][$key] == 'others' ? $offers['disbursement_at_other_phase'][$key] : $offers['disbursement_at_phase'][$key]
                        ];

                        $status = $this->lockDisbursementOffers($disbursementOffers, $user_id, $offers, $key);

                        $this->where('id', $key)->update(
                            $disbursementOffers
                        );

                        if ($status)
                            $this->status = true;
                    }else{
                        $this->insert(
                            [
                                'offer_id' => $offers['offer_id'],
                                'phase' => $phase,
                                'per_disbursement_amount' => $offerPercentageAmount,
                                'day_from_disbursement_date' => $offers['day_from_disbursement_date'][$key],
                                'disbursement_at' => $offers['disbursement_at_phase'][$key] == 'others' ? $offers['disbursement_at_other_phase'][$key] : $offers['disbursement_at_phase'][$key],
                                'created_by' => $user_id,
                                'status' => 1
                            ]
                        );
                        $this->status = true;
                    }
                }
            }
            if ($existingOffers)
                $this->whereIn('id',array_flip($existingOffers))->delete();
        }

        return $this->status;
    }

    public function lockDisbursementOffers($disbursementOffers, $user_id, $offers, $key){
        $lock = DisbursementOffersData::where('id', $key)->first();
        $keys = array_keys($disbursementOffers);
        $update = false;
        foreach ($keys as $_key){
            if (isset($lock->$_key) && $lock->$_key != $disbursementOffers[$_key]){
                $update = true;
            }
        }
        if ($update) {
            $disbursementOffers['changed_by'] = $user_id;
            $disbursementOffers['offer_id'] = $offers['offer_id'];
            $disbursementOffers['created_at'] = Carbon::now()->toDateTimeString();
            DisbursementOffersLock::insert($disbursementOffers);
        }
        return $update;
    }

    public static function getOffers($id){
        $offers = static::where('offer_id', $id)->get();
        if (!count($offers)){
            $offersData = new \stdClass();
            $offersData->per_disbursement_amount = '';
            $offersData->day_from_disbursement_date = '';
            $offers[] = $offersData;
        }
        return $offers;
    }
}
