<?php

namespace Database\Seeders;

use App\Models\Backoffice\WebsiteObject;
use App\Models\Backoffice\WebsiteObjectLanguage;
use App\Models\ProcedureType;
use App\Models\ProcedureTypeLanguage;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use Throwable;

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

        $languages = LaravelLocalization::getSupportedLanguagesKeys();

        DB::beginTransaction();
        try {
            foreach ($seederData as $data) {
                if (ProcedureType::where('migration_type_id', $data['type_id'])->exists()) {
                    continue;
                }

                $procedureType = new ProcedureType();
                $procedureType->is_active = true;
                $procedureType->in_competitions_filter = $data['in_competitions'];
                $procedureType->in_results_filter = $data['in_results'];
                $procedureType->migration_type_id = $data['type_id'];
                $procedureType->ted_types_map = $data['map'];
                $procedureType->is_announcement = $data['is_announcement'] ?? false;
                $procedureType->save();

                $wo = new WebsiteObject();
                $wo->object_id = $procedureType->id;
                $wo->object_type = ProcedureType::class;
                $wo->content_type = 'procedure_type';
                $wo->save();

                foreach ($languages as $lang) {
                    $procedureTypeLanguage = new ProcedureTypeLanguage();
                    $procedureTypeLanguage->procedure_type_id = $procedureType->id;
                    $procedureTypeLanguage->language_id = $lang;
                    $procedureTypeLanguage->title = $data['name'];
                    $procedureTypeLanguage->save();

                    $wol = new WebsiteObjectLanguage();
                    $wol->website_object_id = $wo->id;
                    $wol->wo_language_id = $lang;
                    $wol->save();
                }
            }

            DB::commit();
        } catch (Throwable $e) {
            DB::rollBack();
            throw($e);
        }
    }
}
