<?php

namespace Database\Seeders\Advisories;

use App\Imports\AdvisoryMembersImport;
use App\Models\Advisories\Advisory;
use App\Models\Advisories\AdvisoryType;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;

class AdvisoriesTableSeeder extends Seeder {
    public array $advisories = [
        'tk465' => [
            'number' => 'ТК 465',
            'title' => 'Строительство',
            'type' => AdvisoryType::COMMITTEE,
            'is_main' => true,
            //'members' => ['import' => 'import/advisories/tk465_members.xlsx'],
            'children' => [
                'group1' => [
                    'title' => 'Организационно-методические и общетехнические вопросы в строительстве',
                    'children' => [
                        'pk2' => [
                            'title' => 'Проектирование. Основные положения нормирования',
                            'number' => 'ПК 2',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk3' => [
                            'title' => 'Строительство. Основные положения нормирования',
                            'number' => 'ПК 3',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk4' => [
                            'title' => 'Обследование и мониторинг технического состояния зданий и сооружений. Ремонт, восстановление и усиление конструкций зданий и сооружений',
                            'number' => 'ПК 4',
                            'type' => AdvisoryType::COMMITTEE,
                            'children' => [
                                'rg4.1' => [
                                    'title' => 'Обследование и мониторинг технического состояния зданий и сооружений. Ремонт, восстановление и усиление конструкций зданий и сооружений',
                                    'number' => 'РГ 4.1',
                                    'type' => AdvisoryType::WORKGROUP
                                ]
                            ]
                        ],
                        'pk6' => [
                            'title' => 'Пожаробезопасность в строительстве',
                            'number' => 'ПК 6',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk7' => [
                            'title' => 'Сейсмобезопасность в строительстве',
                            'number' => 'ПК 7',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk8.1' => [
                            'title' => 'Энергосбережение в зданиях',
                            'number' => 'ПК 8.1',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk8.2' => [
                            'title' => 'Строительная физика',
                            'number' => 'ПК 8.2',
                            'type' => AdvisoryType::COMMITTEE
                        ]
                    ]
                ],
                'group2' => [
                    'title' => 'Здания и сооружения',
                    'children' => [
                        'pk10' => [
                            'title' => 'Жилые, общественные и производственные здания и сооружения',
                            'number' => 'ПК 10',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk11' => [
                            'title' => 'Проектирование и строительство транспортных сооружений',
                            'number' => 'ПК 11',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk12' => [
                            'title' => 'Проектирование и строительство гидротехнических и мелиоративных сооружений',
                            'number' => 'ПК 12',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk13' => [
                            'title' => 'Проектирование и строительство магистральных и промысловых трубопроводов, хранилищ нефти и газа',
                            'number' => 'ПК 13',
                            'type' => AdvisoryType::COMMITTEE
                        ]
                    ]
                ],
                'group3' => [
                    'title' => 'Наружные и внутренние инженерные сети и оборудование',
                    'children' => [
                        'pk14' => [
                            'title' => 'Проектирование и строительство сетей теплоснабжения, отопления и вентиляции',
                            'number' => 'ПК 14',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk15' => [
                            'title' => 'Проектирование и строительство сетей водоснабжения и водоотведения',
                            'number' => 'ПК 15',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk16' => [
                            'title' => 'Проектирование и строительство сетей газоснабжения и газораспределения',
                            'number' => 'ПК 16',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk17.1' => [
                            'title' => 'Системы электросвязи зданий и сооружений',
                            'number' => 'ПК 17.1',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk17.2' => [
                            'title' => 'Системы электроснабжения зданий и сооружений',
                            'number' => 'ПК 17.2',
                            'type' => AdvisoryType::COMMITTEE
                        ]
                    ]
                ],
                'group4' => [
                    'title' => 'Строительные конструкции и основания',
                    'children' => [
                        'pk18' => [
                            'title' => 'Надежность строительных конструкций и оснований',
                            'number' => 'ПК 18',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk20' => [
                            'title' => 'Металлические конструкции',
                            'number' => 'ПК 20',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk21' => [
                            'title' => 'Бетонные и железобетонные конструкции. Заполнители, бетоны и растворы',
                            'number' => 'ПК 21',
                            'type' => AdvisoryType::COMMITTEE,
                            'children' => [
                                'rg21.1' => [
                                    'title' => 'Заполнители, бетоны и растворы',
                                    'number' => 'РГ 21.1',
                                    'type' => AdvisoryType::WORKGROUP
                                ],
                                'rg21.2' => [
                                    'title' => 'Сухие строительные смеси',
                                    'number' => 'РГ 21.2',
                                    'type' => AdvisoryType::WORKGROUP
                                ]
                            ]
                        ],
                        'pk22' => [
                            'title' => 'Каменные конструкции',
                            'number' => 'ПК 22',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk23' => [
                            'title' => 'Деревянные конструкции',
                            'number' => 'ПК 23',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk24' => [
                            'title' => 'Блоки оконные, дверные и воротные. Комплектующие изделия и материалы',
                            'number' => 'ПК 24',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk25' => [
                            'title' => 'Ограждающие конструкции зданий, в т.ч. фасадные',
                            'number' => 'ПК 25',
                            'type' => AdvisoryType::COMMITTEE
                        ],
                        'pk26' => [
                            'title' => 'Композитные полимерные конструкции и изделия строительного назначения',
                            'number' => 'ПК 26',
                            'type' => AdvisoryType::COMMITTEE
                        ]
                    ]
                ]
            ]
        ]
    ];

    public function run() {
        collect($this->advisories)->each(function($data, $name) {
            $this->importAdvisory($name, $data);
        });
    }

    public function importAdvisory($name, $data, $parent = null) {
        $query = $parent ? $parent->children() : Advisory::query();
        $advisory = $query->firstOrCreate(['name' => $name]);
        $advisory->update(collect($data)->except('members', 'children')->all());
        $this->importAdvisoryMembers($advisory, $data['members'] ?? []);
        collect($data['children'] ?? [])->each(function($data, $name) use($advisory) {
            $this->importAdvisory($name, $data, $advisory);
        });
    }

    public function importAdvisoryMembers(Advisory $advisory, $data) {
        if ($path = $data['import'] ?? null) Excel::import(new AdvisoryMembersImport($advisory), Storage::path($path));
    }

}
