<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class CreateSites extends AbstractMigration
{
    public function change(): void
    {
        $this->table('sites', ['id' => 'site_id', 'signed' => false])
            ->addColumn('tenant_id',      'integer', ['signed' => false])
            ->addColumn('parent_site_id', 'integer', ['null' => true, 'signed' => false])
            ->addColumn('code',           'string',  ['limit' => 40,  'null' => true])
            ->addColumn('name',           'string',  ['limit' => 160])
            ->addColumn('description',    'text',    ['null' => true])
            ->addColumn('address',        'string',  ['limit' => 255, 'null' => true])
            ->addColumn('city',           'string',  ['limit' => 80,  'null' => true])
            ->addColumn('region',         'string',  ['limit' => 80,  'null' => true])
            ->addColumn('country',        'string',  ['limit' => 60,  'default' => 'Tanzania'])
            ->addColumn('latitude',       'decimal', ['precision' => 10, 'scale' => 7, 'null' => true])
            ->addColumn('longitude',      'decimal', ['precision' => 10, 'scale' => 7, 'null' => true])
            ->addColumn('status',         'string',  ['limit' => 20, 'default' => 'active'])
            ->addColumn('created_by',     'integer', ['null' => true, 'signed' => false])
            ->addColumn('created_at',     'datetime',['default' => 'CURRENT_TIMESTAMP'])
            ->addColumn('updated_at',     'datetime',['default' => 'CURRENT_TIMESTAMP', 'update' => 'CURRENT_TIMESTAMP'])
            ->addColumn('deleted_at',     'datetime',['null' => true])
            ->addIndex(['tenant_id', 'status'])
            ->addIndex(['tenant_id', 'name'])
            ->addIndex(['tenant_id', 'code'])
            ->addIndex(['parent_site_id'])
            ->addForeignKey('tenant_id',      'tenants', 'tenant_id', ['delete' => 'RESTRICT', 'update' => 'CASCADE'])
            ->addForeignKey('parent_site_id', 'sites',   'site_id',   ['delete' => 'SET_NULL', 'update' => 'CASCADE'])
            ->addForeignKey('created_by',     'users',   'user_id',   ['delete' => 'SET_NULL', 'update' => 'CASCADE'])
            ->create();
    }
}
