<?php

namespace common\modules\banners\entities;

use common\modules\banners\entities\queries\BannerQuery;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\web\UploadedFile;
use Yii;

/**
 * This is the model class for table "banners".
 *
 * @property int $id
 * @property string $title
 * @property string $image
 * @property string $url
 * @property string $target
 * @property int $active
 * @property int $start_at
 * @property int $end_at
 * @property int $created_at
 * @property int $updated_at
 * @property string $include_urls
 * @property string $exclude_urls
 * @property int $views
 * @property int $clicks
 * @property int $place_id
 *
 * @property BannerPlace $place
 */
class Banner extends ActiveRecord
{
    const STATUS_DRAFT = 0;
    const STATUS_ACTIVE = 1;

    const TARGET_BLANK = '_blank';
    const TARGET_SELF = '_self';

    const FILE_ORIGINAL_PATH = '@staticRoot/origin/banners';

    public static function create(
        $title,
        $image,
        $url,
        $target,
        $start_at,
        $end_at,
        $include_urls,
        $exclude_urls,
        $active,
        $place_id
    ): self {
        $banner               = new static();
        $banner->title        = $title;
        $banner->image        = $image;
        $banner->url          = $url;
        $banner->target       = $target;
        $banner->start_at     = $start_at;
        $banner->end_at       = $end_at;
        $banner->include_urls = $include_urls;
        $banner->exclude_urls = $exclude_urls;
        $banner->active       = $active;
        $banner->place_id     = $place_id;

        return $banner;
    }

    public function setImage(UploadedFile $image): void
    {
        $this->image = $image;
    }


    public function edit(
        $title,
        $image,
        $url,
        $target,
        $start_at,
        $end_at,
        $include_urls,
        $exclude_urls,
        $active,
        $place_id
    ): void {
        $this->title        = $title;
        $this->image        = $image;
        $this->url          = $url;
        $this->target       = $target;
        $this->start_at     = $start_at;
        $this->end_at       = $end_at;
        $this->include_urls = $include_urls;
        $this->exclude_urls = $exclude_urls;
        $this->active       = $active;
        $this->place_id     = $place_id;
    }

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'banners';
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id'           => Yii::t('banners', 'ID'),
            'title'        => Yii::t('banners', 'Title'),
            'url'          => Yii::t('banners', 'URL'),
            'image'        => Yii::t('banners', 'Image'),
            'target'       => Yii::t('banners', 'Target'),
            'active'       => Yii::t('banners', 'Status'),
            'start_at'     => Yii::t('banners', 'Start At'),
            'end_at'       => Yii::t('banners', 'End At'),
            'created_at'   => Yii::t('banners', 'Created At'),
            'updated_at'   => Yii::t('banners', 'Updated At'),
            'include_urls' => Yii::t('banners', 'Show only on URLs'),
            'exclude_urls' => Yii::t('banners', 'Not show on URLs'),
            'views'        => Yii::t('banners', 'Views'),
            'clicks'       => Yii::t('banners', 'Visits'),
            'place_id'     => Yii::t('banners', 'Place'),
        ];
    }

    public function activate(): void
    {
        if ($this->isActive()) {
            throw new \DomainException('Banner is already active.');
        }
        $this->active = self::STATUS_ACTIVE;
    }

    public function draft(): void
    {
        if ($this->isDraft()) {
            throw new \DomainException('Banner is already draft.');
        }
        $this->active = self::STATUS_DRAFT;
    }

    public function isActive(): bool
    {
        return $this->active == self::STATUS_ACTIVE;
    }


    public function isDraft(): bool
    {
        return $this->active == self::STATUS_DRAFT;
    }

    public function getPlace()
    {
        return $this->hasOne(BannerPlace::class, ['id' => 'place_id']);
    }

    ######################################

    public function behaviors(): array
    {
        return [
            TimestampBehavior::class,
        ];
    }

    public static function find(): BannerQuery
    {
        return new BannerQuery(static::class);
    }
}