<?php
/**
 * Разработал Максим Руденко
 * email: rudenko.programmer@gmail.com
 * Дата: 02.12.2017
 */

namespace common\models\team;


use common\models\opportunities\OpportunitiesModel;
use common\models\Slack;
use common\models\User;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\helpers\ArrayHelper;

/**
 * This class works with team table
 * Class Team
 * @package common\models
 * @property integer id
 * @property string name
 * @property string description
 * @property integer owner_id
 * @property integer opportunity_id
 * @property string slack_id
 * @property integer visible
 * @property string status
 * @property integer created_by
 * @property integer created_at
 * @property integer updated_by
 * @property integer updated_at
 * @property integer deleted_by
 * @property integer deleted_at
 * @method users
 */
class Team extends ActiveRecord
{

	const STATUS_IN_USE = 'IN_USE'; //if opportunity create adn approved -> team update to in_ise
	const STATUS_TEMP   = 'TEMP';//if opportunity created but not approved -> team update to temp

    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                    ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
                ],
            ],
        ];
    }

    /**
     * @return string
     */
    public static function tableName()
    {
        return 'team';
    }

    /**
     * @return array
     */
    public function rules()
    {
        return [
            [['name'], 'trim'],
            [['name'], 'string', 'length' => [4, 21]],
            [['name'],'unique'],
            [['name', 'opportunity_id', 'description'], 'required'],
            [['owner_id', 'slack_id', 'status', 'visible', 'created_by', 'created_at', 'updated_by', 'updated_at', 'deleted_by', 'deleted_at'], 'safe'],
        ];
    }

    /**
     * @return array
     */
    public function attributeLabels()
    {
        return [
            'name' => 'Team name',
            'owner_id' => 'Team owner',
            'description' => 'Description',
            'slack_id' => 'Slack #ID',
            'visible' => 'Is visible'
        ];
    }

    /**
     * Get team owner
     * @return \yii\db\ActiveQuery
     */
    public function getOwner()
    {
        return $this->hasOne(User::className(), ['id' => 'owner_id']);
    }

    /**
     * Get team create user
     * @return \yii\db\ActiveQuery
     */
    public function getCreatedBy()
    {
        return $this->hasOne(User::className(), ['id' => 'created_by']);
    }

    /**
     * Get team update user
     * @return \yii\db\ActiveQuery
     */
    public function getUpdatedBy()
    {
        return $this->hasOne(User::className(), ['id' => 'updated_by']);
    }

    /**
     * Get team delete user
     * @return \yii\db\ActiveQuery
     */
    public function getDeletedBy()
    {
        return $this->hasOne(User::className(), ['id' => 'updated_by']);
    }

    /**
     * Get user data from third table
     * @return \yii\db\ActiveQuery
     */
    public function getTeamUser()
    {
        return $this->hasMany(TeamUser::className(), ['team_id' => 'id']);
    }

    /**
     * Get team's users
     * @return \yii\db\ActiveQuery
     */
    public function getUsers()
    {
        return $this->hasMany(User::className(), ['id' => 'user_id'])
            ->via('teamUser');
    }

	public function getOpportunity()
	{
		return $this->hasOne(OpportunitiesModel::className(), ['id' => 'opportunity_id']);
	}

    /**
     * @param Team $teamModel
     * @param $idArray
     * @return bool
     */
    public static function updateTeamList(Team $teamModel, $idArray){
        if(!is_array($idArray)) return true;

        $currentArray = ArrayHelper::map($teamModel->teamUser, 'id', 'user_id');

        $delete_array = array_diff($currentArray, $idArray);
        $new_array = array_diff($idArray, $currentArray);

        /* Delete users from team */
        TeamUser::deleteAll(
            ['AND', 'team_id = :team_id', ['IN', 'user_id', $delete_array]], [':team_id' => $teamModel->id]
        );

        /* Add new users to team */

        $new_users_emails = [];

        foreach ($new_array as $item){
            $newTeamUser = new TeamUser();
            $newTeamUser->user_id = $item;
            $newTeamUser->team_id = $teamModel->id;
            $newTeamUser->save();

            if($teamModel->slack_id != ''){
                $new_users_emails[] = $newTeamUser->user->email;
            }
        }

        if($teamModel->slack_id != '' && count($new_users_emails)){
            Slack::addUsersToChanel($teamModel->slack_id, $new_users_emails);
        }
    }

    public static function updateOpportunityTeamList(Team $teamModel, $idArray, $status, $statuses = []){
        if(!is_array($idArray)) return true;

        $currentArray = ArrayHelper::map($teamModel->teamUser, 'id', 'user_id');

        $delete_array = array_diff($currentArray, $idArray);
        $new_array = array_diff($idArray, $currentArray);

        /* Delete users from team */
        TeamUser::deleteAll(
            ['AND', 'team_id = :team_id', ['IN', 'user_id', $delete_array]], [':team_id' => $teamModel->id]
        );

        /* Add new users to team */

        $new_users_ids = [];

        foreach ($new_array as $item){
            $newTeamUser = new TeamUser();
            $newTeamUser->user_id = $item;
            $newTeamUser->team_id = $teamModel->id;
            $newTeamUser->status = $status;
            $newTeamUser->user_type = $statuses[$item];
            $newTeamUser->save();

            $new_users_ids[] = $newTeamUser->user->id;

        }

        /* TODO return invited users */
        return ['deleted' => $delete_array, 'new' => $new_users_ids];
    }

	public function isOwner($id){
		return $id == $this->owner_id;
	}

	public function currentUserStatus($id){
		if($this->isOwner($id)){
			return 'OWNER';
		}
		$team_user = TeamUser::find()->where(['user_id' => $id])->andWhere(['team_id' => $this->id])->one();
		if($team_user){
			return $team_user->status;
		}
		return null;
	}


	public function getTeamListForUser($user_id){
		$team_id = $this->id;
		return TeamUser::find()->where(['AND',
			['team_id' => $team_id],
			['OR',
				['user_id' => $user_id],
				['status' => TeamUser::STATUS_MEMBER]
			]
		])->all();
	}


  /**
   * Looking for user in current team
   * @param $team_id
   * @param $user_id
   *
   * @return bool
   */
	static public function checkUserInTeam($team_id, $user_id){
        $team = Team::findOne($team_id);
        if($user_id === $team->owner_id) return true;
        $team_user = TeamUser::find()
                     ->where(['user_id'=>$user_id])
                     ->andWhere(['team_id' => $team_id])
                     ->one();
        if($team_user) return true;

        return false;
  }

}