<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class CreateInvitationTables extends Migration
{
    public function up()
    {
        $this->table('users', [
            'name' => ['type' => 'VARCHAR', 'constraint' => 100],
            'email' => ['type' => 'VARCHAR', 'constraint' => 150, 'unique' => true],
            'password' => ['type' => 'VARCHAR', 'constraint' => 255],
        ]);
        $this->table('acara', [
            'nama_acara' => ['type' => 'VARCHAR', 'constraint' => 150],
            'nama_anak' => ['type' => 'VARCHAR', 'constraint' => 150],
            'tanggal' => ['type' => 'DATE'],
            'waktu_mulai' => ['type' => 'TIME'],
            'waktu_selesai' => ['type' => 'TIME'],
            'lokasi' => ['type' => 'TEXT'],
            'google_maps_url' => ['type' => 'TEXT'],
            'google_maps_embed' => ['type' => 'TEXT', 'null' => true],
            'foto_anak' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
            'doa' => ['type' => 'TEXT'],
            'nama_orang_tua' => ['type' => 'VARCHAR', 'constraint' => 200, 'null' => true],
        ]);
        $this->table('tamu', [
            'nama_tamu' => ['type' => 'VARCHAR', 'constraint' => 180],
            'slug' => ['type' => 'VARCHAR', 'constraint' => 190, 'unique' => true],
            'nomor_hp' => ['type' => 'VARCHAR', 'constraint' => 30, 'null' => true],
            'status_kehadiran' => ['type' => 'ENUM', 'constraint' => ['belum', 'hadir', 'tidak_hadir'], 'default' => 'belum'],
        ]);
        $this->table('galeri', [
            'foto' => ['type' => 'VARCHAR', 'constraint' => 255],
            'caption' => ['type' => 'VARCHAR', 'constraint' => 180, 'null' => true],
            'urutan' => ['type' => 'INT', 'default' => 0],
        ]);

        $this->forge->addField($this->fields([
            'tamu_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true],
            'nama' => ['type' => 'VARCHAR', 'constraint' => 180],
            'status' => ['type' => 'ENUM', 'constraint' => ['hadir', 'tidak_hadir']],
            'jumlah_tamu' => ['type' => 'INT', 'default' => 1],
            'pesan' => ['type' => 'TEXT', 'null' => true],
        ]))->addKey('id', true)->addForeignKey('tamu_id', 'tamu', 'id', 'SET NULL', 'CASCADE')->createTable('rsvp', true);

        $this->table('ucapan', [
            'nama_pengirim' => ['type' => 'VARCHAR', 'constraint' => 180],
            'ucapan' => ['type' => 'TEXT'],
            'is_approved' => ['type' => 'TINYINT', 'constraint' => 1, 'default' => 0],
        ]);

        $this->forge->addField([
            'id' => ['type' => 'BIGINT', 'unsigned' => true, 'auto_increment' => true],
            'tamu_id' => ['type' => 'INT', 'unsigned' => true, 'null' => true],
            'ip_address' => ['type' => 'VARCHAR', 'constraint' => 45],
            'user_agent' => ['type' => 'TEXT', 'null' => true],
            'visited_at' => ['type' => 'DATETIME'],
        ])->addKey('id', true)->addForeignKey('tamu_id', 'tamu', 'id', 'SET NULL', 'CASCADE')->createTable('pengunjung', true);
    }

    private function table(string $name, array $fields): void
    {
        $this->forge->addField($this->fields($fields))->addKey('id', true)->createTable($name, true);
    }

    private function fields(array $fields): array
    {
        return ['id' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true]]
            + $fields
            + ['created_at' => ['type' => 'DATETIME', 'null' => true], 'updated_at' => ['type' => 'DATETIME', 'null' => true]];
    }

    public function down()
    {
        foreach (['pengunjung', 'ucapan', 'rsvp', 'galeri', 'tamu', 'acara', 'users'] as $table) {
            $this->forge->dropTable($table, true);
        }
    }
}
