<?php

namespace Database\Seeders;

use App\Models\Feature;
use App\Models\SubscriptionPlan;
use App\Models\SubscriptionPlanOption;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Throwable;

class SubscriptionPlansSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $seederData = json_decode(
            Storage::disk('json')->get('subscriptions.json'),
            true
        );

        DB::beginTransaction();
        try {
            SubscriptionPlan::unguard();

            foreach ($seederData as $subscriptionData) {
                $plan = SubscriptionPlan::where('name', $subscriptionData['name'])->first();

                if (!$plan) {
                    $plan =  new SubscriptionPlan();
                }

                $plan->name = $subscriptionData['name'];
                $plan->save();

                $plan->options()->delete();

                foreach ($subscriptionData['options'] as $idx => $optionData) {
                    $option = new SubscriptionPlanOption();
                    $option->name = $optionData['name'];
                    $option->position = $idx + 1;
                    $option->seats = $optionData['seats'];
                    $option->periodicity = $optionData['periodicity'];
                    $option->price = $optionData['price'];
                    $option->subscription_plan_id = $plan->id;
                    $option->save();
                }

                $featureIds = Feature::whereIn('name', $subscriptionData['features'])->pluck('id');

                $plan->features()->sync($featureIds);
            }
            DB::commit();
        } catch (Throwable $e) {
            DB::rollBack();
            throw($e);
        }
    }
}
