<?php

use App\Models\PaymentManagement\PaymentTransaction;
use App\Models\SettingManagement\Status;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up(){

        if (!Schema::hasTable((new PaymentTransaction)->getTable())){
            Schema::create((new PaymentTransaction)->getTable(), function (Blueprint $table) {
                $table->id();

                $table->string("reference")->unique()
                    ->comment("La reférence de la transaction");

                $table->float("amount")->nullable()
                    ->comment("Le montant payé Ex: '3000'");

                $table->unsignedBigInteger("payment_method_id")->nullable()
                    ->comment("[FK] La methode de paiement");

                $table->string("payer_number",100)->nullable()
                    ->comment("le numéro utilisé par le payeur pour effectuer la transaction");
                $table->string(PaymentTransaction::MORPH_ID_COLUMN,60)->nullable()
                    ->comment("[Polymorph] L'id du payeur Ex: '1'");

                $table->string(PaymentTransaction::MORPH_TYPE_COLUMN,100)->nullable()
                    ->comment("[Polymorph] Le type du payeur Ex: 'user'");

                $table->json("order")->nullable()
                    ->comment("Les données liées à la commande");

                $table->json("payment_result")->nullable()
                    ->comment("Les données liées au resultat du paiement");

                $table->json("order_result")->nullable()
                    ->comment("Les données liées au resultat de l'opération d'enregistrement de la commande");

                $table->string("success_reference")->nullable()
                    ->comment("reference succès retourné par l'api");

                $table->foreignIdFor(Status::class,'status_code')
                    ->constrained((new Status)->getTable(), (new Status)->getKeyName())
                    ->cascadeOnUpdate()->cascadeOnDelete()
                    ->comment("[FK] Le status de la transaction");

                $table->longText('file')->nullable()
                    ->comment("Le chemin du fichier (.json) dans le quelle l'api a reponse");

                $table->longText("exception")->nullable()
                    ->comment("L'exception généré lors du checking de status");

                $table->timestamp("workout_at")->nullable()
                    ->comment("L'heure à la quelle la transaction sera traitée par le CRON JOB");

                $table->timestamps();
            });
        }
    }

    /**
     * Reverse the migrations.
     * @return void
     */
    public function down(){
        Schema::dropIfExists((new PaymentTransaction)->getTable());
    }
};
