<?php
namespace App;

use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Image\Manipulations;
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\Models\Media;

/**
 * Class CourseOfConstruction
 *
 * @package App
 * @property string $youtube_link
 * @property string $report_date
 * @property string $description
 * @property string $residental_complex
 * @property-read string $report_year
 * @property-read \Illuminate\Database\Eloquent\Collection|\Spatie\MediaLibrary\Models\Media[] $media
 * @property-write mixed $residental_complex_id
 * @method static bool|null forceDelete()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\CourseOfConstruction newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\CourseOfConstruction newQuery()
 * @method static \Illuminate\Database\Query\Builder|\App\CourseOfConstruction onlyTrashed()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\CourseOfConstruction query()
 * @method static bool|null restore()
 * @method static \Illuminate\Database\Query\Builder|\App\CourseOfConstruction withTrashed()
 * @method static \Illuminate\Database\Query\Builder|\App\CourseOfConstruction withoutTrashed()
 * @mixin \Eloquent
 */
class CourseOfConstruction extends Model implements HasMedia
{
    use SoftDeletes, HasMediaTrait;

    protected $fillable = ['youtube_link', 'report_date', 'description', 'residental_complex_id'];
    protected $hidden = [];
    
    

    /**
     * Set attribute to date format
     * @param $input
     */
    public function setReportDateAttribute($input)
    {
        if ($input != null && $input != '') {
            $this->attributes['report_date'] = Carbon::createFromFormat(config('app.date_format'), '01.' . $input)
                ->format('Y-m-d');
        } else {
            $this->attributes['report_date'] = null;
        }
    }

    /**
     * Get attribute from date format
     * @param $input
     *
     * @return string
     */
    public function getReportDateAttribute($input)
    {
        $zeroDate = str_replace(['Y', 'm', 'd'], ['0000', '00', '00'], config('app.date_format'));

        if ($input != $zeroDate && $input != null) {
            return Carbon::createFromFormat('Y-m-d', $input)->format(config('app.month_format'));
        } else {
            return '';
        }
    }

    /**
     * Get attribute from date format
     * @param $input
     *
     * @param array $parameters
     * @return string
     */
    public function getReportYearAttribute($input, $parameters = [])
    {
        $zeroDate = str_replace(['Y', 'm', 'd'], ['0000', '00', '00'], config('app.date_format'));

        if ($input != $zeroDate && $input != null) {
            if (isset($parameters['year'])) {
                return Carbon::createFromFormat(config('app.month_format'), $input)->format(config('app.date_year_format'));
            } elseif (isset($parameters['month'])) {
                return Carbon::createFromFormat(config('app.date_format'), '01.' . $input)->format(config('app.date_month_format'));
            } else {
                return Carbon::createFromFormat(config('app.month_format'), $input)->format(config('app.date_format'));
            }
        } else {
            return '';
        }
    }

    /**
     * Set to null if empty
     * @param $input
     */
    public function setResidentalComplexIdAttribute($input)
    {
        $this->attributes['residental_complex_id'] = $input ? $input : null;
    }
    
    public function residental_complex()
    {
        return $this->belongsTo(ResidentialComplex::class, 'residental_complex_id')->withTrashed();
    }

    public function registerMediaConversions(Media $media = null)
    {
        $this->addMediaConversion('residential_complex_slider')
            ->fit(Manipulations::FIT_STRETCH, 555, 428)
            ->optimize();

        $this->addMediaConversion('residential_complex_slider_webp')
            ->format('webp')
            ->fit(Manipulations::FIT_STRETCH, 555, 428)
            ->optimize();
    }
}
