<?php

use App\Models\Comment;
use App\Models\File;
use App\Models\Guestbook;
use App\Models\Poll;
use App\Models\Read;
use App\Models\Story;
use App\Models\Tag;
use App\Models\User;
use MotorORM\Migration;

error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');

require __DIR__ . '/../../vendor/autoload.php';

// Добавляет поля picture и avatar в users
$userHeaders = User::query()->headers();
if (! in_array('picture', $userHeaders, true)) {
    $migration = new Migration(new User());

    try {
        $migration->column('picture')->after('name')->create();
        $migration->column('avatar')->after('picture')->create();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Добавлены поля picture и avatar в таблицу users<br>';
}

// Добавляет поле user_id и удаляет login
$guestbookHeaders = Guestbook::query()->headers();
if (! in_array('user_id', $guestbookHeaders, true)) {
    $migration = new Migration(new Guestbook());

    try {
        $migration->column('user_id')->after('id')->create();

        $messages = Guestbook::query()->get();
        foreach ($messages as $message) {
            $user = User::query()->where('login', $message->login)->first();
            $message->where('id', $message->id)->update([
                'user_id' => $user->id ?? '',
            ]);
        }

        $migration->column('login')->delete();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Добавлено поле user_id в таблицу guestbook<br>';
}

// Переносит image из guestbook в files
$guestbookHeaders = Guestbook::query()->headers();
if (in_array('image', $guestbookHeaders, true)) {
    $migration = new Migration(new Guestbook());

    try {
        $messages = Guestbook::query()->get();
        foreach ($messages as $message) {
            if (! $message->image) {
                continue;
            }

            File::query()->create([
                'user_id'    => $message->user_id,
                'post_id'    => $message->id,
                'path'       => $message->image,
                'created_at' => $message->created_at,
            ]);
        }

        $migration->column('image')->delete();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Поле image перенесено из таблицы guestbook в таблицу files<br>';
}

// Добавляет поля name, ext и size в files
$fileHeaders = File::query()->headers();
if (! in_array('ext', $fileHeaders, true)) {
    $migration = new Migration(new File());

    try {
        $migration->column('name')->after('path')->create();
        $migration->column('ext')->after('name')->create();
        $migration->column('size')->after('ext')->create();

        $files = File::query()->get();
        foreach ($files as $file) {
            $file->where('id', $file->id)->update([
                'name' => basename($file->path),
                'ext'  => getExtension($file->path),
                'size' => filesize(publicPath($file->path)) ?? 0,
            ]);
        }

    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Добавлены поля name, ext и size в таблицу files<br>';
}

// Добавляет поле name и удаляет title из guestbook
$guestbookHeaders = Guestbook::query()->headers();
if (! in_array('name', $guestbookHeaders, true)) {
    $migration = new Migration(new Guestbook());

    try {
        $migration->column('name')->after('text')->create();
        $migration->column('title')->delete();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Добавлено поле name и удалено title из таблицы guestbook<br>';
}

// Добавляет поле rating в stories
$storyHeaders = Story::query()->headers();
if (! in_array('rating', $storyHeaders, true)) {
    $migration = new Migration(new Story());

    try {
        $migration->column('rating')->after('tags')->default(0)->create();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Добавлено поле rating в таблицу stories<br>';
}

// Переименовывает поле views в reads в stories
$storyHeaders = Story::query()->headers();
if (in_array('views', $storyHeaders, true)) {
    $migration = new Migration(new Story());

    try {
        $migration->column('views')->to('reads')->rename();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Переименовано поле views на reads в таблице stories<br>';
}

// Переименовывает поле post_id в story_id в comments
$commentHeaders = Comment::query()->headers();
if (in_array('post_id', $commentHeaders, true)) {
    $migration = new Migration(new Comment());

    try {
        $migration->column('post_id')->to('story_id')->rename();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Переименовано поле post_id в story_id в таблице comments<br>';
}

// Переименовывает поле post_id в story_id в files
$fileHeaders = File::query()->headers();
if (in_array('post_id', $fileHeaders, true)) {
    $migration = new Migration(new File());

    try {
        $migration->column('post_id')->to('story_id')->rename();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Переименовано поле post_id в story_id в таблице files<br>';
}

// Переименовывает поле post_id в story_id в polls
$pollHeaders = Poll::query()->headers();
if (in_array('post_id', $pollHeaders, true)) {
    $migration = new Migration(new Poll());

    try {
        $migration->column('post_id')->to('story_id')->rename();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Переименовано поле post_id в story_id в таблице polls<br>';
}

// Переименовывает поле post_id в story_id в reads
$readHeaders = Read::query()->headers();
if (in_array('post_id', $readHeaders, true)) {
    $migration = new Migration(new Read());

    try {
        $migration->column('post_id')->to('story_id')->rename();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Переименовано поле post_id в story_id в таблице reads<br>';
}

// Переименовывает поле story_id в entity_id в polls
$pollHeaders = Poll::query()->headers();
if (in_array('story_id', $pollHeaders, true)) {
    $migration = new Migration(new Poll());

    try {
        $migration->column('story_id')->to('entity_id')->rename();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Переименовано поле story_id в entity_id в таблице polls<br>';
}

// Добавляет поле entity_name в polls
$pollHeaders = Poll::query()->headers();
if (! in_array('entity_name', $pollHeaders, true)) {
    $migration = new Migration(new Poll());

    try {
        $migration->column('entity_name')->after('entity_id')->default('story')->create();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Добавлено поле entity_name в таблицу polls<br>';
}

// Добавляет поле locked в stories
$storyHeaders = Story::query()->headers();
if (! in_array('locked', $storyHeaders, true)) {
    $migration = new Migration(new Story());

    try {
        $migration->column('locked')->after('reads')->default(0)->create();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Добавлено поле locked в таблицу stories<br>';
}

// Удаляет поле tags в stories
$storyHeaders = Story::query()->headers();
if (in_array('tags', $storyHeaders, true)) {
    $migration = new Migration(new Story());

    try {
        $migration->column('tags')->to('tags_old')->rename();

        $stories = Story::query()->get();
        foreach ($stories as $story) {
            $tags = explode(',', $story->tags_old);

            foreach ($tags as $tag) {
                if (! $tag) {
                    continue;
                }

                Tag::query()->create([
                    'story_id' => $story->id,
                    'tag'      => $tag,
                ]);
            }
        }

        $migration->column('tags_old')->delete();
    } catch (Exception $exception) {
        echo $exception->getMessage();
    }

    echo 'Удалено поле tags из таблицы stories<br>';
}


echo 'Все миграции выполнены успешно!<br>';
