<?php

namespace common\models;

use Yii;
use common\models\Etablissement;
use common\models\PointVente;
use common\models\PointVenteUser;
use common\models\Commande;
use common\models\CommandeProduit;

/**
 * This is the model class for table "commande_auto".
 *
 * @property integer $id
 * @property integer $id_user
 * @property integer $id_etablissement
 * @property integer $id_point_vente
 * @property string $date_debut
 * @property string $date_fin
 * @property integer $lundi
 * @property integer $mardi
 * @property integer $mercredi
 * @property integer $jeudi
 * @property integer $vendredi
 * @property integer $samedi
 * @property integer $dimanche
 * @property integer $periodicite_semaine
 * @property string $username
 * @property string $paiement_automatique
 */
class CommandeAuto extends \yii\db\ActiveRecord {

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

    /**
     * @inheritdoc
     */
    public function rules() {
        return [
            [['id_etablissement', 'id_point_vente'], 'required'],
            [['id_user', 'id_etablissement', 'id_point_vente', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche', 'periodicite_semaine'], 'integer'],
            [['paiement_automatique'], 'boolean'],
            [['date_debut', 'date_fin', 'username'], 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels() {
        return [
            'id' => 'ID',
            'id_user' => 'Utilisateur',
            'id_etablissement' => 'Etablissement',
            'id_point_vente' => 'Point de vente',
            'date_debut' => 'Date de début',
            'date_fin' => 'Date de fin',
            'lundi' => 'Lundi',
            'mardi' => 'Mardi',
            'mercredi' => 'Mercredi',
            'jeudi' => 'Jeudi',
            'vendredi' => 'Vendredi',
            'samedi' => 'Samedi',
            'dimanche' => 'Dimanche',
            'periodicite_semaine' => 'Périodicité',
            'paiement_automatique' => 'Paiement automatique'
        ];
    }

    public function getUser() {
        return $this->hasOne(User::className(), ['id' => 'id_user']);
    }

    public function getEtablissement() {
        return $this->hasOne(Etablissement::className(), ['id' => 'id_etablissement']);
    }

    public function getPointVente() {
        return $this->hasOne(PointVente::className(), ['id' => 'id_point_vente']);
    }

    public function getCommandeAutoProduit() {
        return $this->hasMany(CommandeAutoProduit::className(), ['id_commande_auto' => 'id'])->with('produit');
    }

    public static function getAll($date) {
        $date = date('Y-m-d', strtotime($date));

        // commandes auto
        $commandes_auto = self::find()
                ->with('commandeAutoProduit')
                ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
                ->all();

        $arr_commandes_auto = [];

        foreach ($commandes_auto as $c) {
            // vérif dates
            if ($date >= $c->date_debut &&
                    (!$c->date_fin || $date <= $c->date_fin)) {
                // périodicite
                $nb_jours = (strtotime($date) - strtotime($c->date_debut)) / (24 * 60 * 60);
                if ($nb_jours % ($c->periodicite_semaine * 7) < 7) {
                    // jour de la semaine
                    $jour = date('N', strtotime($date));
                    switch ($jour) {
                        case 1 : $jour = 'lundi';
                            break;
                        case 2 : $jour = 'mardi';
                            break;
                        case 3 : $jour = 'mercredi';
                            break;
                        case 4 : $jour = 'jeudi';
                            break;
                        case 5 : $jour = 'vendredi';
                            break;
                        case 6 : $jour = 'samedi';
                            break;
                        case 7 : $jour = 'dimanche';
                            break;
                    }

                    if ($c->$jour) {
                        $arr_commandes_auto[] = $c;
                    }
                }
            }
        }

        return $arr_commandes_auto;
    }

    public static function addAll($date) {
        // production
        $production = Production::findOne([
                    'date' => date('Y-m-d', strtotime($date)),
                    'id_etablissement' => Yii::$app->user->identity->id_etablissement
                ]);

        if ($production) {
            $count_commandes_prod = Commande::find()
                    ->where(['id_production' => $production->id])
                    ->count();

            if (!$count_commandes_prod) {
                $commandes_auto = self::getAll($date);
                foreach ($commandes_auto as $c) {
                    $c->add($date);
                }
            }
        }
    }

    public function add($date) {
        // production
        $production = Production::find()
                ->where([
                    'date' => date('Y-m-d', strtotime($date)),
                    'id_etablissement' => Yii::$app->user->identity->id_etablissement
                ])
                ->with('productionProduit')
                ->one();

        if ($production && count($this->commandeAutoProduit)) {
            // commande
            $commande = new Commande;
            if (strlen($this->username)) {
                $commande->username = $this->username;
                $commande->id_user = 0;
            } else {
                $commande->id_user = $this->id_user;
            }
            $commande->date = date('Y-m-d H:i:s');
            $commande->type = Commande::TYPE_AUTO;
            $commande->id_point_vente = $this->id_point_vente;
            $commande->id_production = $production->id;

            $point_vente_user = PointVenteUser::find()
                    ->where(['id_point_vente' => $this->id_point_vente, 'id_user' => $this->id_user])
                    ->one();

            if ($point_vente_user && strlen($point_vente_user->commentaire)) {
                $commande->commentaire_point_vente = $point_vente_user->commentaire;
            }

            $commande->save();

            // produits
            $montant_total = 0;
            $produits_add = false;
            foreach ($this->commandeAutoProduit as $commande_auto_produit) {
                if ($production->produitActif($commande_auto_produit->produit->id)) {
                    $commande_produit = new CommandeProduit;
                    $commande_produit->id_commande = $commande->id;
                    $commande_produit->id_produit = $commande_auto_produit->produit->id;
                    $commande_produit->quantite = $commande_auto_produit->quantite;
                    $commande_produit->prix = $commande_auto_produit->produit->prix;
                    $commande_produit->save();
                    $produits_add = true;
                }
            }

            if (!$produits_add) {
                $commande->delete();
            } else {
                // on débite automatiquement le crédit pain du client
                if ($commande->id_user &&
                        $this->paiement_automatique &&
                        Etablissement::getConfig('credit_pain')) {
                    $commande = Commande::find()
                            ->with('commandeProduits')
                            ->where(['id' => $commande->id])
                            ->one();

                    $commande->init();

                    $user_action = User::find()->where([
                                'id_etablissement' => $production->id_etablissement,
                                'status' => 11
                            ])->one();

                    if ($user_action)
                        $id_user_action = $user_action->id;
                    else
                        $id_user_action = NULL;

                    if ($commande->getMontant() > 0) {
                        $commande->creditHistorique(
                                CreditHistorique::TYPE_PAIEMENT, $commande->getMontant(), $production->id_etablissement, $id_user_action
                        );
                    }
                }
            }
        }
    }

}