<?php

namespace App\Models;

use App\Services\Util;
use Cviebrock\EloquentSluggable\Sluggable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

/**
 * App\Models\Product
 *
 * @property int $id
 * @property string $name
 * @property array|null $trans_name
 * @property string $title
 * @property array|null $trans_title
 * @property string|null $copy
 * @property array|null $trans_copy
 * @property float|null $price
 * @property float|null $price_ek
 * @property float|null $tax
 * @property float|null $price_old
 * @property string|null $contents
 * @property string|null $number
 * @property array|null $icons
 * @property string|null $description
 * @property array|null $trans_description
 * @property string|null $usage
 * @property array|null $trans_usage
 * @property string|null $ingredients
 * @property array|null $trans_ingredients
 * @property int|null $pos
 * @property int $active
 * @property int|null $amount
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property \Illuminate\Support\Carbon|null $deleted_at
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductAttribute[] $attributes
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductCategory[] $categories
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductImage[] $images
 * @property-write mixed $price_vk
 * @method static bool|null forceDelete()
 * @method static \Illuminate\Database\Query\Builder|\App\Models\Product onlyTrashed()
 * @method static bool|null restore()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereActive($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereAmount($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereContents($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereCopy($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereCreatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereDeletedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereDescription($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereIcons($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereIngredients($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereName($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereNumber($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product wherePos($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product wherePrice($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product wherePriceEk($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product wherePriceOld($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereTax($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereTitle($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereTransCopy($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereTransDescription($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereTransIngredients($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereTransName($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereTransTitle($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereTransUsage($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereUpdatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereUsage($value)
 * @method static \Illuminate\Database\Query\Builder|\App\Models\Product withTrashed()
 * @method static \Illuminate\Database\Query\Builder|\App\Models\Product withoutTrashed()
 * @mixin \Eloquent
 * @property string|null $slug
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product findSimilarSlugs($attribute, $config, $slug)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereSlug($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product newQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product query()
 * @property int|null $weight
 * @property int|null $show_at
 * @property array|null $action
 * @property-read int|null $attributes_count
 * @property-read int|null $categories_count
 * @property-read int|null $images_count
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereAction($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereShowAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereWeight($value)
 * @property int|null $points
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductImage[] $imagesActive
 * @property-read int|null $images_active_count
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product wherePoints($value)
 * @property string|null $identifier
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereIdentifier($value)
 * @property int|null $upgrade_to_id
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereUpgradeToId($value)
 * @property int|null $contents_total
 * @property int|null $unit
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereContentsTotal($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereUnit($value)
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\CountryPrice[] $country_prices
 * @property-read int|null $country_prices_count
 * @property int|null $wp_number
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereWpNumber($value)
 * @property bool|null $single_commission
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereShippingAddon($value)
 * @property-read int|null $ingredients_count
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductIngredient[] $product_ingredients
 * @property-read int|null $product_ingredients_count
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Ingredient[] $p_ingredients
 * @property-read int|null $p_ingredients_count
 * @property bool $amount_commission
 * @property string|null $value_commission
 * @property string|null $partner_commission
 * @method static \Illuminate\Database\Eloquent\Builder|Product whereAmountCommission($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Product wherePartnerCommission($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Product whereSingleCommission($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Product whereValueCommission($value)
 */
class Product extends Model
{

    /*identifiers
        show_upgrade # in membership payment can upgrade this package to show order
        show_order  # in membership payment show always
        upgrade # need upgrade_to_id set user->payment_order_id to the package in the payment api
    */

    protected $table = 'products';

    protected $casts = [
        'trans_name' => 'array',
        'trans_title' => 'array',
        'trans_copy' => 'array',
        'icons' => 'array',
        'trans_description' => 'array',
        'trans_usage' => 'array',
        'trans_ingredients' => 'array',
        'action' => 'array',
        'wp_number' => 'int',
        'single_commission' => 'bool',
        'amount_commission' => 'bool',
        'active' => 'bool'
    ];
    use Sluggable;

    use SoftDeletes;

    protected $dates = ['deleted_at'];

    protected $fillable = [
        'name',
        'title',
        'copy',
        'price',
        'price_ek',
        'tax',
        'price_old',
        'points',
        'weight',
        'contents',
        'contents_total',
        'unit',
        'number',
        'wp_number',
        'icons',
        'description',
        'usage',
        'ingredients',
        'pos',
        'amount',
        'active',
        'show_at',
        'single_commission',
        'amount_commission',
        'value_commission',
        'partner_commission',
        'identifier',
        'action',
        'upgrade_to_id'
    ];

    public $identifiers_types = [
        '' => '-',
        'show_upgrade' => 'Kann geupdatet werden',
        'show_order' => 'Wird immer als Option angezeigt',
        'upgrade' => 'Produktupgrade zur Produkt ID',
        'upgrade_member' => 'Vertriebspartnerupgrade zur Karriere ID',
        //'proportional_voucher' => 'Anteiliger Gutschein Vertriebspartner',


    ];
    public $unitTypes = [
        0 => '',
        1 => 'ml',
        2 => 'g',
        3 => 'Liter',
        4 => 'KG',
    ];

    public $showATs = [
        0 => 'Nur Kunden Bestellungen',
        1 => 'Kunden + Vertriebspartner Bestellungen',
        2 => 'Nur Vertriebspartner Bestellungen',
        3 => 'Registrierung / Mitgliedschaft Vertriebspartner',
        4 => 'Nur Mitgliedschaft Vertriebspartner',
        //5 => 'Onboarding Vertriebspartner',
        //6 => 'Onboarding Vertriebspartner + Vertriebspartner Shop',
        7 => 'zur internen Berechnung',

    ];

    public $actions = [
        0 => 'payment_for_account',
       // 1 => 'payment_for_shop',
       // 2 => 'payment_for_shop_upgrade',
       // 4 => 'payment_for_lead_upgrade',

    ];

    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'name'
            ]
        ];
    }

    public function attributes(){
        return $this->hasMany('App\Models\ProductAttribute', 'product_id', 'id');
    }

    public function categories(){
        return $this->hasMany('App\Models\ProductCategory', 'product_id', 'id');
    }

    public function images(){
        return $this->hasMany('App\Models\ProductImage', 'product_id', 'id')->orderBy('pos');
    }

    public function imagesActive(){
        return $this->hasMany('App\Models\ProductImage', 'product_id', 'id')->where('active', true)->orderBy('pos');
    }

    public function country_prices()
    {
        return $this->hasMany(CountryPrice::class, 'product_id');
    }


    public function p_ingredients()
    {
        return $this->belongsToMany(Ingredient::class, 'product_ingredients')
            ->withPivot('id')
            ->withTimestamps();
    }

    public function product_ingredients()
    {
        return $this->hasMany(ProductIngredient::class, 'product_ingredients', 'id');
    }


    public function getActionName($id = 0){
        if(isset($this->actions[$id])){
            return $this->actions[$id];
        }
        return false;
    }
    public function _format_number($value){
        return preg_replace("/[^0-9,]/", "", $value);
    }

    public function setPriceAttribute( $value ) {

        $this->attributes['price'] = $value ? Util::reFormatNumber($value) : null;
    }
    public function setPriceEkAttribute( $value ) {

        $this->attributes['price_ek'] = $value ? Util::reFormatNumber($value) : null;
    }
    public function setTaxAttribute( $value ) {

        $this->attributes['tax'] = $value ? Util::reFormatNumber($value) : null;
    }
    public function setPriceOldAttribute( $value ) {

        $this->attributes['price_old'] = $value ? Util::reFormatNumber($value) : null;
    }

    public function setValueCommissionAttribute( $value ) {
        $this->attributes['value_commission'] = $value ? Util::reFormatNumber($value) : 0;
    }

    public function setPartnerCommissionAttribute( $value ) {
        $this->attributes['partner_commission'] = $value ? Util::reFormatNumber($value) : 0;
    }

    public function getFormattedPrice()
    {
        return isset($this->attributes['price']) ? Util::formatNumber($this->attributes['price']) : "";
    }

    public function getFormattedPriceEk()
    {
        return isset($this->attributes['price_ek']) ? Util::formatNumber($this->attributes['price_ek']) : "";
    }

    public function getFormattedTax()
    {
        return isset($this->attributes['tax']) ? Util::formatNumber($this->attributes['tax'], 0) : "";
    }

    public function getFormattedPriceOld()
    {
        return isset($this->attributes['price_old']) ? Util::formatNumber($this->attributes['price_old']) : "";
    }
    public function getFormattedValueCommission()
    {
        return isset($this->attributes['value_commission']) ? Util::formatNumber($this->attributes['value_commission']) : 0;
    }

    public function getFormattedPartnerCommission()
    {
        return isset($this->attributes['partner_commission']) ? Util::formatNumber($this->attributes['partner_commission']) : 0;
    }


    /*price by user Factor*/
    private function calcPriceUserFactor($price){
        if(\Auth::user() && \Auth::user()->user_level){
            $margin = ((\Auth::user()->user_level->margin -100)*-1) / 100;
            $price = $price * $margin;
        }
        return $price;
    }
    /*price net*/
    private function calcPriceNet($price){
        $tax_rate = ($this->attributes['tax'] + 100) / 100;

        return $price / $tax_rate;
    }
    //price calu with
    public function getPriceWith(Bool $net = true, Bool $ufactor = true){
        $price = $this->attributes['price'];
        $price = $net ? $this->calcPriceNet($price) : $price;
        $price = $ufactor ? $this->calcPriceUserFactor($price) : $price;
        return round($price, 2);
    }
    /*out*/
    public function getFormattedPriceWith(Bool $net = true, Bool $ufactor = true)
    {
        return isset($this->attributes['price']) ? Util::formatNumber($this->getPriceWith($net, $ufactor)) : "";
    }


    public function getBasePriceFormattedFull(){
        if($price = $this->getBasePrice()){
            $unit = $this->attributes['unit'];
            //ml g
            if($unit === 1 || $unit === 2){
                return Util::formatNumber($price) . ' € / 100 '.$this->getUnitType();
            }
            //l kg
            if($unit === 3 || $unit === 4){
                return Util::formatNumber($price) . ' € / 1 '.$this->getUnitType();
            }
        }
        return "";
    }

    public function getBasePriceFormatted(){
        if($price = $this->getBasePrice()){
            return Util::formatNumber($price);
        }
        return "";
    }

    public function getBasePrice(){
        if(isset($this->attributes['unit']) && isset($this->attributes['contents_total']) && $this->attributes['contents_total'] != 0){
            $unit = $this->attributes['unit'];
            //ml g
            if($unit === 1 || $unit === 2){
                return $this->attributes['price'] * 100 / $this->attributes['contents_total'];
            }
            //l kg
            if($unit === 3 || $unit === 4){
                return $this->attributes['price'] *  1000 / $this->attributes['contents_total'];
            }
        }
        return "";
    }
    public function getUnitType(){
        return isset($this->unitTypes[$this->unit]) ? $this->unitTypes[$this->unit] : '-';
    }
    public function getShowAtType(){
        return isset($this->showATs[$this->show_at]) ? $this->showATs[$this->show_at] : '-';
    }


    public function setPosAttribute($value){
        $this->attributes['pos'] = is_numeric($value) ? $value : null;

    }
    public function getLang($key)
    {
        $lang = \App::getLocale();
        if ($lang == 'de') {
            return $this->{$key};
        }
        $trans = $this->getTrans($key, $lang);
        if (!$trans || $trans == '') {
            return $this->{$key};
        }
        return $trans;
    }

    public function getTrans($key, $lang)
    {
        $key = 'trans_' . $key;
        if (!empty($this->{$key}[$lang])) {
            return $this->{$key}[$lang];
        }
    }

    public function getTranNames()
    {
        $ret = "";
        foreach ((array) $this->trans_name as $value){
            $ret .= $value.', ';
        }
        return rtrim($ret, ', ');
    }

    public function getCountryPrice($country_id){
        return $this->country_prices->where('country_id', '=', $country_id)->first() ?: new CountryPrice();
    }

    public function getCPrice($country_id){
        return $this->getCountryPrice($country_id)->c_price;
    }
    public function getCTax($country_id){
        return $this->getCountryPrice($country_id)->c_tax;
    }
    public function getCPriceOld($country_id){
        return $this->getCountryPrice($country_id)->c_price_old;
    }
    public function getCCurrency($country_id){
        return $this->getCountryPrice($country_id)->c_currency;
    }

    public function getRealPrice(Country $country){
        if($country->own_eur && $this->getCPrice($country->id)){
            return $this->getCPrice($country->id);
        }
        return $this->price;
    }


}
