<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

final class Version20260609131304 extends AbstractMigration
{
    public function getDescription(): string
    {
        return 'Create categories table with seed data';
    }

    public function up(Schema $schema): void
    {
        $this->addSql('CREATE TABLE categories (
            id INT AUTO_INCREMENT NOT NULL,
            uuid VARCHAR(36) NOT NULL,
            bundle VARCHAR(32) NOT NULL,
            label VARCHAR(255) DEFAULT NULL,
            status SMALLINT NOT NULL DEFAULT 1,
            parent_id INT DEFAULT NULL,
            weight INT NOT NULL DEFAULT 0,
            logo_id INT DEFAULT NULL,
            title VARCHAR(255) DEFAULT NULL,
            representation_id INT DEFAULT NULL,
            contact_phone VARCHAR(255) DEFAULT NULL,
            email VARCHAR(255) DEFAULT NULL,
            description TEXT DEFAULT NULL,
            slogan VARCHAR(255) DEFAULT NULL,
            domain VARCHAR(255) DEFAULT NULL,
            keywords VARCHAR(255) DEFAULT NULL,
            footer_description TEXT DEFAULT NULL,
            footer_disclaimer TEXT DEFAULT NULL,
            social_media JSON DEFAULT NULL,
            UNIQUE INDEX UNIQ_3AF346686B548B0F (uuid),
            INDEX idx_categories_bundle (bundle),
            INDEX idx_categories_parent (parent_id),
            INDEX idx_categories_status (status, bundle),
            PRIMARY KEY(id)
        ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`');

        // States (31 provinces)
        $states = [
            'آذربایجان شرقی', 'آذربایجان غربی', 'اردبیل', 'اصفهان', 'البرز',
            'ایلام', 'بوشهر', 'تهران', 'چهارمحال و بختیاری', 'خراسان جنوبی',
            'خراسان رضوی', 'خراسان شمالی', 'خوزستان', 'زنجان', 'سمنان',
            'سیستان و بلوچستان', 'فارس', 'قزوین', 'قم', 'کردستان',
            'کرمان', 'کرمانشاه', 'کهگیلویه و بویراحمد', 'گلستان', 'گیلان',
            'لرستان', 'مازندران', 'مرکزی', 'هرمزگان', 'همدان', 'یزد',
        ];
        foreach ($states as $i => $label) {
            $uuid = $this->genUuid();
            $this->addSql("INSERT INTO categories (uuid,bundle,label,status,weight) VALUES ('{$uuid}','state','{$label}',1,".($i+1).")");
        }

        // Cities (major cities per province; parent_id = state row id 1..31)
        $cities = [
            [1,'تبریز'],[1,'مراغه'],[1,'مرند'],
            [2,'ارومیه'],[2,'خوی'],[2,'مهاباد'],
            [3,'اردبیل'],[3,'مشگین‌شهر'],[3,'پارس‌آباد'],
            [4,'اصفهان'],[4,'کاشان'],[4,'خمینی‌شهر'],[4,'نجف‌آباد'],
            [5,'کرج'],[5,'فردیس'],[5,'نظرآباد'],
            [6,'ایلام'],[6,'دهلران'],[6,'آبدانان'],
            [7,'بوشهر'],[7,'برازجان'],[7,'کنگان'],
            [8,'تهران'],[8,'ری'],[8,'شهریار'],[8,'اسلام‌شهر'],[8,'پردیس'],
            [9,'شهرکرد'],[9,'بروجن'],[9,'فارسان'],
            [10,'بیرجند'],[10,'قائنات'],[10,'فردوس'],
            [11,'مشهد'],[11,'نیشابور'],[11,'سبزوار'],[11,'تربت‌حیدریه'],
            [12,'بجنورد'],[12,'شیروان'],[12,'اسفراین'],
            [13,'اهواز'],[13,'آبادان'],[13,'خرمشهر'],[13,'دزفول'],[13,'بهبهان'],
            [14,'زنجان'],[14,'ابهر'],[14,'قیدار'],
            [15,'سمنان'],[15,'شاهرود'],[15,'دامغان'],
            [16,'زاهدان'],[16,'چابهار'],[16,'ایرانشهر'],[16,'زابل'],
            [17,'شیراز'],[17,'مرودشت'],[17,'جهرم'],[17,'فسا'],
            [18,'قزوین'],[18,'تاکستان'],[18,'البرز'],
            [19,'قم'],
            [20,'سنندج'],[20,'سقز'],[20,'مریوان'],
            [21,'کرمان'],[21,'رفسنجان'],[21,'جیرفت'],[21,'سیرجان'],
            [22,'کرمانشاه'],[22,'اسلام‌آباد غرب'],[22,'سرپل‌ذهاب'],
            [23,'یاسوج'],[23,'دهدشت'],[23,'گچساران'],
            [24,'گرگان'],[24,'گنبدکاووس'],[24,'علی‌آباد'],
            [25,'رشت'],[25,'لاهیجان'],[25,'بندرانزلی'],[25,'رودبار'],
            [26,'خرم‌آباد'],[26,'بروجرد'],[26,'دورود'],
            [27,'ساری'],[27,'بابل'],[27,'آمل'],[27,'قائم‌شهر'],[27,'نوشهر'],
            [28,'اراک'],[28,'خمین'],[28,'ساوه'],
            [29,'بندرعباس'],[29,'قشم'],[29,'کیش'],[29,'میناب'],
            [30,'همدان'],[30,'ملایر'],[30,'نهاوند'],
            [31,'یزد'],[31,'میبد'],[31,'اردکان'],
        ];
        foreach ($cities as [$stateId,$label]) {
            $uuid = $this->genUuid();
            $this->addSql("INSERT INTO categories (uuid,bundle,label,status,parent_id,weight) VALUES ('{$uuid}','city','{$label}',1,{$stateId},0)");
        }

        // Medical Specialties
        $specialties = [
            'پزشک عمومی','قلب و عروق','مغز و اعصاب','ارتوپدی','چشم‌پزشکی',
            'گوش و حلق و بینی','دندانپزشکی','زنان و زایمان','اطفال','پوست و مو',
            'جراحی عمومی','داخلی','روانپزشکی','اورولوژی','فیزیوتراپی','روانشناسی',
            'غدد و متابولیسم','گوارش و کبد','ریه','کلیه و مجاری ادراری',
            'جراحی مغز و اعصاب','جراحی قلب','جراحی پلاستیک','تغذیه',
            'طب سنتی','دندانپزشکی کودکان','ارتودنسی','پریودنتیکس',
            'رادیولوژی','آزمایشگاه',
        ];
        foreach ($specialties as $i => $label) {
            $uuid = $this->genUuid();
            $this->addSql("INSERT INTO categories (uuid,bundle,label,status,weight) VALUES ('{$uuid}','specially_doctor','{$label}',1,{$i})");
        }

        // Doctor Services
        $services = [
            'ویزیت حضوری','ویزیت آنلاین','نوبت آنلاین','خدمات در منزل',
            'اورژانس','جراحی','آندوسکوپی','اکوکاردیوگرافی','نوار قلب (ECG)','اسپیرومتری',
        ];
        foreach ($services as $i => $label) {
            $uuid = $this->genUuid();
            $this->addSql("INSERT INTO categories (uuid,bundle,label,status,weight) VALUES ('{$uuid}','doctor_services','{$label}',1,{$i})");
        }

        // Insurance Types
        $insuranceTypes = [
            'تامین اجتماعی','بیمه خدمات درمانی','بیمه ارتش',
            'آزاد (بدون بیمه)','بیمه روستایی','بیمه کارمندی دولت',
        ];
        foreach ($insuranceTypes as $i => $label) {
            $uuid = $this->genUuid();
            $this->addSql("INSERT INTO categories (uuid,bundle,label,status,weight) VALUES ('{$uuid}','insurance_type','{$label}',1,{$i})");
        }

        // Supplementary Insurance
        $suppInsurances = [
            'بیمه ایران','بیمه آسیا','بیمه دی','بیمه ملت','بیمه پارسیان',
            'بیمه البرز','بیمه سینا','بیمه رازی','بیمه کوثر','بیمه نوین',
        ];
        foreach ($suppInsurances as $i => $label) {
            $uuid = $this->genUuid();
            $this->addSql("INSERT INTO categories (uuid,bundle,label,status,weight) VALUES ('{$uuid}','supplementary_insurance','{$label}',1,{$i})");
        }

        // Tags
        $tags = [
            'سلامت','تغذیه','ورزش','بیماری‌های قلبی','دیابت',
            'فشارخون','سرطان','زیبایی','کودکان','سالمندان',
        ];
        foreach ($tags as $i => $label) {
            $uuid = $this->genUuid();
            $this->addSql("INSERT INTO categories (uuid,bundle,label,status,weight) VALUES ('{$uuid}','tag','{$label}',1,{$i})");
        }
    }

    public function down(Schema $schema): void
    {
        $this->addSql('DROP TABLE categories');
    }

    private function genUuid(): string
    {
        return sprintf(
            '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
            mt_rand(0, 0xffff), mt_rand(0, 0xffff),
            mt_rand(0, 0xffff),
            mt_rand(0, 0x0fff) | 0x4000,
            mt_rand(0, 0x3fff) | 0x8000,
            mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
        );
    }
}
