<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class CreateTestsTable extends Migration {
  public function up() {
    // testdefsite - Main test definition table per site
    $this->forge->addField([
      'TestSiteID'  => ['type' => 'INT', 'auto_increment' => true, 'unsigned' => true],
      'SiteID' => ['type' => 'INT', 'null' => false],
      'TestSiteCode'  => ['type' => 'varchar', 'constraint'=> 6, 'null' => false],
      'TestSiteName'  => ['type' => 'varchar', 'constraint'=> 100, 'null' => false],
      'TestType'  => ['type' => 'int', 'null' => false],
      'Description'  => ['type' => 'varchar', 'constraint'=> 255, 'null' => true],
      'SeqScr' => ['type' => 'int', 'null' => true],
      'SeqRpt' => ['type' => 'int', 'null' => true],
      'IndentLeft' => ['type' => 'int', 'null' => true, 'default' => 0],
      'FontStyle' => ['type' => 'varchar', 'constraint'=> 50, 'null' => true],
      'VisibleScr' => ['type' => 'int', 'null' => true, 'default' => 1],
      'VisibleRpt' => ['type' => 'int', 'null' => true, 'default' => 1],
      'CountStat' => ['type' => 'int', 'null' => true, 'default' => 1],
      'CreateDate' => ['type' => 'Datetime', 'null' => true],
      'StartDate' => ['type' => 'Datetime', 'null' => true],
      'EndDate' => ['type' => 'Datetime', 'null' => true],
    ]);
    $this->forge->addKey('TestSiteID', true);
    $this->forge->createTable('testdefsite');

    // testdeftech - Technical definition for TEST and PARAM types
    $this->forge->addField([
      'TestTechID'  => ['type' => 'INT', 'auto_increment' => true, 'unsigned' => true],
      'TestSiteID'  => ['type' => 'INT', 'unsigned' => true, 'null' => false],
      'DisciplineID' => ['type' => 'int', 'null' => true],
      'DepartmentID' => ['type' => 'int', 'null' => true],
      'ResultType' => ['type' => 'varchar', 'constraint'=> 20, 'null' => true],
      'RefType' => ['type' => 'varchar', 'constraint'=> 10, 'null' => true],
      'VSet' => ['type' => 'int', 'null' => true],
      'ReqQty' => ['type' => 'DECIMAL', 'constraint'=> '10,2', 'null' => true],
      'ReqQtyUnit' => ['type' => 'varchar', 'constraint'=> 20, 'null' => true],
      'Unit1' => ['type' => 'varchar', 'constraint'=> 20, 'null' => true],
      'Factor' => ['type' => 'DECIMAL', 'constraint'=> '10,4', 'null' => true],
      'Unit2' => ['type' => 'varchar', 'constraint'=> 20, 'null' => true],
      'Decimal' => ['type' => 'int', 'null' => true, 'default' => 2],
      'CollReq' => ['type' => 'varchar', 'constraint'=> 255, 'null' => true],
      'Method' => ['type' => 'varchar', 'constraint'=> 50, 'null' => true],
      'ExpectedTAT' => ['type' => 'INT', 'null' => true],
      'CreateDate' => ['type' => 'Datetime', 'null' => true],
      'EndDate' => ['type' => 'Datetime', 'null' => true]
    ]);
    $this->forge->addKey('TestTechID', true);
    $this->forge->addForeignKey('TestSiteID', 'testdefsite', 'TestSiteID', 'CASCADE', 'CASCADE');
    $this->forge->createTable('testdeftech');

    // testdefcal - Calculation definition for CALC type
    $this->forge->addField([
      'TestCalID'  => ['type' => 'INT', 'auto_increment' => true, 'unsigned' => true],
      'TestSiteID'  => ['type' => 'INT', 'unsigned' => true, 'null' => false],
      'DisciplineID' => ['type' => 'INT', 'null' => true],
      'DepartmentID' => ['type' => 'INT', 'null' => true],
      'FormulaInput' => ['type' => 'text', 'null' => true],
      'FormulaCode' => ['type' => 'varchar', 'constraint'=> 255, 'null' => true],
      'RefType' => ['type' => 'varchar', 'constraint'=> 10, 'null' => true, 'default' => 'NMRC'],
      'Unit1' => ['type' => 'varchar', 'constraint'=> 20, 'null' => true],
      'Factor' => ['type' => 'DECIMAL', 'constraint'=> '10,4', 'null' => true],
      'Unit2' => ['type' => 'varchar', 'constraint'=> 20, 'null' => true],
      'Decimal' => ['type' => 'int', 'null' => true, 'default' => 2],
      'Method' => ['type' => 'varchar', 'constraint'=> 50, 'null' => true],
      'CreateDate' => ['type' => 'Datetime', 'null' => true],
      'EndDate' => ['type' => 'Datetime', 'null' => true]
    ]);
    $this->forge->addKey('TestCalID', true);
    $this->forge->addForeignKey('TestSiteID', 'testdefsite', 'TestSiteID', 'CASCADE', 'CASCADE');
    $this->forge->createTable('testdefcal');

    // testdefgrp - Group definition for GROUP type
    $this->forge->addField([
      'TestGrpID'  => ['type' => 'INT', 'auto_increment' => true, 'unsigned' => true],
      'TestSiteID'  => ['type' => 'INT', 'unsigned' => true, 'null' => false],
      'Member' => ['type' => 'INT', 'unsigned' => true, 'null' => true],
      'CreateDate' => ['type' => 'Datetime', 'null' => true],
      'EndDate' => ['type' => 'Datetime', 'null' => true]
    ]);
    $this->forge->addKey('TestGrpID', true);
    $this->forge->addForeignKey('TestSiteID', 'testdefsite', 'TestSiteID', 'CASCADE', 'CASCADE');
    $this->forge->addForeignKey('Member', 'testdefsite', 'TestSiteID', 'CASCADE', 'CASCADE');
    $this->forge->createTable('testdefgrp');

    // testmap - Test mapping for all types
    $this->forge->addField([
      'TestMapID'  => ['type' => 'INT', 'auto_increment' => true, 'unsigned' => true],
      'TestSiteID'  => ['type' => 'INT', 'unsigned' => true, 'null' => false],
      'HostType' => ['type' => 'varchar', 'constraint'=> 20, 'null' => true],
      'HostID' => ['type' => 'varchar', 'constraint'=> 50, 'null' => true],
      'HostDataSource' => ['type' => 'varchar', 'constraint'=> 50, 'null' => true],
      'HostTestCode' => ['type' => 'varchar', 'constraint'=> 10, 'null' => true],
      'HostTestName' => ['type' => 'varchar', 'constraint'=> 100, 'null' => true],
      'ClientType' => ['type' => 'varchar', 'constraint'=> 20, 'null' => true],
      'ClientID' => ['type' => 'varchar', 'constraint'=> 50, 'null' => true],
      'ClientDataSource' => ['type' => 'varchar', 'constraint'=> 50, 'null' => true],
      'ConDefID' => ['type' => 'INT', 'null' => true],
      'ClientTestCode' => ['type' => 'varchar', 'constraint'=> 10, 'null' => true],
      'ClientTestName' => ['type' => 'varchar', 'constraint'=> 100, 'null' => true],
      'CreateDate' => ['type' => 'Datetime', 'null' => true],
      'EndDate' => ['type' => 'Datetime', 'null' => true]
    ]);
    $this->forge->addKey('TestMapID', true);
    $this->forge->addForeignKey('TestSiteID', 'testdefsite', 'TestSiteID', 'CASCADE', 'CASCADE');
    $this->forge->createTable('testmap');
  }

  public function down() {
    $this->forge->dropTable('testdefsite');
    $this->forge->dropTable('testdeftech');
    $this->forge->dropTable('testdefcal');
    $this->forge->dropTable('testdefgrp');
    $this->forge->dropTable('testmap');
  }
}
