<?php

declare(strict_types=1);

/**
 * This file is part of CodeIgniter 4 framework.
 *
 * (c) CodeIgniter Foundation <admin@codeigniter.com>
 *
 * For the full copyright and license information, please view
 * the LICENSE file that was distributed with this source code.
 */

namespace Tests\Support\Database\Seeds;

use CodeIgniter\Database\Seeder;

class CITestSeeder extends Seeder
{
    public function run(): void
    {
        // Job Data
        $data = [
            'user' => [
                [
                    'name'    => 'Derek Jones',
                    'email'   => 'derek@world.com',
                    'country' => 'US',
                ],
                [
                    'name'    => 'Ahmadinejad',
                    'email'   => 'ahmadinejad@world.com',
                    'country' => 'Iran',
                ],
                [
                    'name'    => 'Richard A Causey',
                    'email'   => 'richard@world.com',
                    'country' => 'US',
                ],
                [
                    'name'    => 'Chris Martin',
                    'email'   => 'chris@world.com',
                    'country' => 'UK',
                ],
            ],
            'job' => [
                [
                    'name'        => 'Developer',
                    'description' => 'Awesome job, but sometimes makes you bored',
                ],
                [
                    'name'        => 'Politician',
                    'description' => 'This is not really a job',
                ],
                [
                    'name'        => 'Accountant',
                    'description' => 'Boring job, but you will get free snack at lunch',
                ],
                [
                    'name'        => 'Musician',
                    'description' => 'Only Coldplay can actually called Musician',
                ],
            ],
            'misc' => [
                [
                    'key'   => '\\xxxfoo456',
                    'value' => 'Entry with \\xxx',
                ],
                [
                    'key'   => '\\%foo456',
                    'value' => 'Entry with \\%',
                ],
                [
                    'key'   => 'spaces and tabs',
                    'value' => ' One  two   three	tab',
                ],
            ],
            'stringifypkey' => [
                [
                    'id'    => 'A01',
                    'value' => 'test',
                ],
            ],
            'without_auto_increment' => [
                [
                    'key'   => 'key',
                    'value' => 'value',
                ],
                [
                    'key'   => 'multibyte characters pl',
                    'value' => 'śćźżłąęó',
                ],
                [
                    'key'   => 'multibyte characters fa',
                    'value' => 'خٌوب',
                ],
                [
                    'key'   => 'multibyte characters bn',
                    'value' => 'টাইপ',
                ],
                [
                    'key'   => 'multibyte characters ko',
                    'value' => '캐스팅',
                ],
                [
                    'key'   => 'multibyte characters ml',
                    'value' => 'ടൈപ്പ്',
                ],
            ],
            'team_members' => [
                [
                    'team_id'   => 1,
                    'person_id' => 22,
                    'role'      => 'member',
                    'status'    => 'active',
                ],
                [
                    'team_id'   => 1,
                    'person_id' => 33,
                    'role'      => 'mentor',
                    'status'    => 'active',
                ],
            ],
            'type_test' => [
                [
                    'type_varchar'    => 'test',
                    'type_char'       => 'test',
                    'type_enum'       => 'appel',
                    'type_set'        => 'one',
                    'type_text'       => 'test text',
                    'type_mediumtext' => 'test medium text',
                    'type_smallint'   => 1,
                    'type_integer'    => 123,
                    'type_float'      => 10.1,
                    'type_real'       => 11.21,
                    'type_double'     => 23.22,
                    'type_decimal'    => 123123.2234,
                    'type_numeric'    => 123.23,
                    'type_blob'       => 'test blob',
                    'type_date'       => '2020-01-11T22:11:00.000+02:00',
                    'type_time'       => '2020-07-18T15:22:00.000+02:00',
                    'type_datetime'   => '2020-06-18T05:12:24.000+02:00',
                    'type_timestamp'  => '2019-07-18T21:53:21.000+02:00',
                    'type_bigint'     => 2_342_342,
                    'type_boolean'    => 1,
                ],
            ],
        ];

        // set SQL times to more correct format
        if ($this->db->DBDriver === 'SQLite3') {
            $data['type_test'][0]['type_date']      = '2020/01/11';
            $data['type_test'][0]['type_time']      = '15:22:00';
            $data['type_test'][0]['type_datetime']  = '2020/06/18 05:12:24';
            $data['type_test'][0]['type_timestamp'] = '2019/07/18 21:53:21';
        }

        if ($this->db->DBDriver === 'Postgre') {
            $data['type_test'][0]['type_time']    = '15:22:00';
            $data['type_test'][0]['type_boolean'] = true;
            unset(
                $data['type_test'][0]['type_enum'],
                $data['type_test'][0]['type_set'],
                $data['type_test'][0]['type_mediumtext'],
                $data['type_test'][0]['type_real'],
                $data['type_test'][0]['type_double'],
                $data['type_test'][0]['type_decimal'],
                $data['type_test'][0]['type_blob'],
            );
        }

        if ($this->db->DBDriver === 'SQLSRV') {
            $data['type_test'][0]['type_date']     = '2020-01-11';
            $data['type_test'][0]['type_time']     = '15:22:00.000';
            $data['type_test'][0]['type_datetime'] = '2020-06-18 05:12:24.000';

            unset(
                $data['type_test'][0]['type_timestamp'],
                $data['type_test'][0]['type_enum'],
                $data['type_test'][0]['type_set'],
                $data['type_test'][0]['type_mediumtext'],
                $data['type_test'][0]['type_double'],
                $data['type_test'][0]['type_blob'],
            );
        }

        if ($this->db->DBDriver === 'MySQLi') {
            $data['ci_sessions'][] = [
                'id'         => 'ci_session:1f5o06b43phsnnf8if6bo33b635e4p2o',
                'ip_address' => '127.0.0.1',
                'timestamp'  => '2021-06-25 21:54:14',
                'data'       => '__ci_last_regenerate|i:1624650854;_ci_previous_url|s:40:\"http://localhost/index.php/home/index\";',
            ];
        }

        if ($this->db->DBDriver === 'Postgre') {
            $data['ci_sessions'][] = [
                'id'         => 'ci_session:1f5o06b43phsnnf8if6bo33b635e4p2o',
                'ip_address' => '127.0.0.1',
                'timestamp'  => '2021-06-25 21:54:14.991403+02',
                'data'       => '\x' . bin2hex('__ci_last_regenerate|i:1624650854;_ci_previous_url|s:40:\"http://localhost/index.php/home/index\";'),
            ];
        }

        if ($this->db->DBDriver === 'OCI8') {
            $this->db->query('alter session set NLS_DATE_FORMAT=?', ['YYYY-MM-DD HH24:MI:SS']);
            $data['type_test'][0]['type_date']      = '2020-01-11 22:11:00';
            $data['type_test'][0]['type_time']      = '2020-07-18 15:22:00';
            $data['type_test'][0]['type_datetime']  = '2020-06-18 05:12:24';
            $data['type_test'][0]['type_timestamp'] = '2020-06-18 21:53:21';
            unset($data['type_test'][0]['type_blob']);
        }

        foreach ($data as $table => $dummyData) {
            $this->db->table($table)->truncate();

            foreach ($dummyData as $singleDummyData) {
                $this->db->table($table)->insert($singleDummyData);
            }
        }
    }
}
