<?php

namespace frontend\models;

use Yii;
use common\models\User;
use common\models\Etablissement;
use yii\base\Model;
use common\models\UserEtablissement;
use common\helpers\Password;

/**
 * Signup form
 */
class SignupForm extends Model {

    public $username;
    public $email;
    public $password;
    public $nom;
    public $prenom;
    public $telephone;
    public $is_boulanger;
    public $siret;
    public $nom_magasin;
    public $code_postal;
    public $ville;
    public $id_etablissement;
    public $option_client_boulanger;
    public $cgv;
    public $code;
    public $type;

    /**
     * @inheritdoc
     */
    public function rules() {
        return [
            ['email', 'filter', 'filter' => 'trim'],
            ['email', 'required', 'message' => 'Champs obligatoire'],
            ['email', 'email'],
            ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Cet email est déjà utilisé'],
            [['nom', 'prenom', 'telephone'], 'required', 'message' => 'Champs obligatoire'],
            [['nom', 'prenom', 'telephone', 'option_client_boulanger'], 'string', 'min' => 2, 'max' => 255],
            ['password', 'required', 'message' => 'Champs obligatoire'],
            ['password', 'string', 'min' => 6, 'tooShort' => 'Votre mot de passe doit contenir au moins 6 caractères'],
            ['is_boulanger', 'boolean'],
            ['cgv', 'boolean'],
            ['cgv', function($attribute, $params) {
                    $cgv = $this->$attribute;

                    if ($this->option_client_boulanger == 'boulanger' && !$cgv) {
                        $this->addError($attribute, 'Vous devez accepter les conditions générales de vente pour vous inscrire.');
                    }
                }],
            ['code_postal', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
                    return $model->option_client_boulanger == 'boulanger';
                }, 'whenClient' => "function (attribute, value) {
                return $('#option-boulanger').prop('checked') ;
            }"],
            ['ville', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
                    return $model->option_client_boulanger == 'boulanger';
                }, 'whenClient' => "function (attribute, value) {
                return $('#option-boulanger').prop('checked') ;
            }"],
            ['nom_magasin', 'string'],
            ['nom_magasin', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
                    return $model->option_client_boulanger == 'boulanger';
                }, 'whenClient' => "function (attribute, value) {
                return $('#option-boulanger').prop('checked') ;
            }"],
            ['type', 'string'],
            ['type', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
                    return $model->option_client_boulanger == 'boulanger';
                }, 'whenClient' => "function (attribute, value) {
                return $('#option-boulanger').prop('checked') ;
            }"],
            ['siret', 'string'],
            ['siret', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
                    return $model->option_client_boulanger == 'boulanger';
                }, 'whenClient' => "function (attribute, value) {
                return $('#option-boulanger').prop('checked') ;
            }"],
            ['siret', function($attribute, $params) {

                    $siret = $this->$attribute;
                    $siret = str_replace(' ', '', $siret);

                    if (strlen($siret) != 14) {
                        $this->addError($attribute, 'Le numéro SIRET doit contenir 14 caractères');
                        return;
                    }

                    if (!is_numeric($siret)) {
                        $this->addError($attribute, 'Le numéro SIRET ne doit contenir que des chiffres');
                        return;
                    }

                    // on prend chaque chiffre un par un
                    // si son index (position dans la chaîne en commence à 0 au premier caractère) est pair
                    // on double sa valeur et si cette dernière est supérieure à 9, on lui retranche 9
                    // on ajoute cette valeur à la somme totale

                    $sum = 0;
                    for ($index = 0; $index < 14; $index ++) {
                        $number = (int) $siret[$index];
                        if (($index % 2) == 0) {
                            if (($number *= 2) > 9)
                                $number -= 9;
                        }
                        $sum += $number;
                    }

                    // le numéro est valide si la somme des chiffres est multiple de 10
                    if (($sum % 10) != 0)
                        $this->addError($attribute, 'Numéro SIRET invalide');
                }],
            ['id_etablissement', 'integer'],
            ['id_etablissement', function($attribute, $params) {
                    if ($this->id_etablissement) {
                        $etablissement = Etablissement::findOne($this->id_etablissement);
                        if (!$etablissement) {
                            $this->addError($attribute, 'Ce producteur n\'existe pas.');
                        }
                    }
                }],
            ['code', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
                    $etablissement = Etablissement::findOne($this->id_etablissement);
                    if ($etablissement) {
                        return strlen($etablissement->code);
                    } else {
                        return false;
                    }
                }],
            ['code', function($attribute, $params) {
                    $code = $this->$attribute;
                    $etablissement = Etablissement::findOne($this->id_etablissement);

                    if ($etablissement && strtolower(trim($code)) != strtolower(trim($etablissement->code))) {
                        $this->addError($attribute, 'Code incorrect');
                    }
                }],
        ];
    }

    /**
     * Signs user up.
     *
     * @return User|null the saved model or null if saving fails
     */
    public function signup() {
        if ($this->validate()) {
            $user = new User();
            $user->username = $this->email;
            $user->email = $this->email;
            $user->nom = $this->nom;
            $user->prenom = $this->prenom;
            $user->telephone = $this->telephone;
            $user->confiance = 1;

            if ($this->option_client_boulanger == 'boulanger') {
                // etablissement
                $etablissement = new Etablissement;
                $etablissement->nom = $this->nom_magasin;
                $etablissement->type = $this->type;
                $etablissement->siret = $this->siret;
                $etablissement->code_postal = $this->code_postal;
                $etablissement->ville = $this->ville;
                $etablissement->heure_limite_commande = 20;
                $etablissement->delai_commande = 1;
                $etablissement->gratuit = 1;
                $etablissement->slug = \common\helpers\Url::slugify($this->nom_magasin) ;

                // génération d'un code
                do {
                    $code = Password::generate();
                    $etablissement->code = $code;
                } while (Etablissement::findOne(['code' => $code]));

                $etablissement->save();

                // user
                $user->id_etablissement = $etablissement->id;
                $user->status = User::STATUS_BOULANGER;

                // envoi d'un email à l'administrateur pour le prévenir
                Yii::$app->mailer->compose(
                                [
                            'html' => 'new-boulanger-html',
                            'text' => 'new-boulanger-text'
                                ], [
                            'etablissement' => $etablissement
                        ])
                        ->setTo(Yii::$app->params['adminEmail'])
                        ->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain'])
                        ->setSubject('[La boîte à pain] Nouveau producteur')
                        ->send();
            }

            $user->setPassword($this->password);
            $user->generateAuthKey();
            if ($user->save()) {

                // on ajoute l'établissement sélectionnée par l'user en favoris
                if ($this->option_client_boulanger == 'client') {
                    if ($this->id_etablissement) {
                        $etablissement = Etablissement::find()->where(['id' => $this->id_etablissement])->one();
                        if ($etablissement) {
                            Etablissement::addUser($user->id, $this->id_etablissement) ;

                            // envoi d'un email à l'utilisateur
                            Yii::$app->mailer->compose(
                                [
                                    'html' => 'signup-html',
                                    'text' => 'signup-text'
                                ], 
                                [
                                    'user' => $user,
                                    'etablissement' => $etablissement
                                ])
                                ->setTo($user->email)
                                ->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain'])
                                ->setSubject('[La boîte à pain] Inscription')
                                ->send();
                        }
                    }
                }

                if ($this->option_client_boulanger == 'boulanger') {
                    $etab_user = new UserEtablissement;
                    $etab_user->id_etablissement = $etablissement->id;
                    $etab_user->id_user = $user->id;
                    $etab_user->credit = 0;
                    $etab_user->actif = 1;
                    $etab_user->save();
                }

                return $user;
            }
        }

        return null;
    }

    public function attributeLabels() {
        return [
            'id' => 'ID',
            'username' => 'Identifiant',
            'password' => 'Mot de passe',
            'rememberMe' => 'Se souvenir de moi',
            'prenom' => 'Prénom',
            'telephone' => 'Téléphone',
            'is_boulanger' => "Je suis professionnel et souhaite mettre en place un système de réservation dans mon établissement",
            'nom_magasin' => 'Nom de l\'établissement',
            'siret' => 'Numéro SIRET',
            'code_postal' => 'Code postal',
            'ville' => 'Commune',
            'id_etablissement' => 'Producteur',
            'type' => 'Type d\'établissement',
        ];
    }

}