$desktop = MAIN.$desktop;
$strings = MAIN.$strings;
$menu = MAIN.$main.$menu;

$colors = [0xFFFF0000, 0xFF53A600, 0xFFD2005A, 0xFFFFD611, 0xFF2839AA, 0xFFFF3F9F, 0xFF007D56, 0xFF7149A2, 0xFFFD5D00, 0xFF00FFFF, 0xFF257EE1, 0xFFFBF345, 0xFF000000, 0xFFFFFFFF];
$selectedMap = "";
$selectedDate = mkdate(1, 1, 1980);
$selectedColor = $colors[0];
$selectedDifficulty = 1;
$selectedName = "";
$availableLogos = [];
$logoTextures = [];
foreach (list_files("metro/company-logos", ".dds")) {
  $availableLogos[] = "metro/company-logos/"+current;
}
foreach (MAIN.$addons.$companyLogos) {
  $availableLogos[] = current;
}
foreach ($availableLogos) {
  $logoTextures[] = MAIN.$window.video.new_texture("/"+current);
}
$logoIndex = random(#$availableLogos);
$selectedLogo = $availableLogos[$logoIndex];
$selectedMoney = 12500*100;
$selectedBanks = 3;
$selectedDemolishCost = -50;
$selectedPrivateCars = 80;
$timelineImages = false;
$difficultyMenu = null;

$box = MAIN.$ui.createHudElement(int(($desktop.width - 1000) * 0.5), int(($desktop.height - 600) * 0.5), 1000, 600, 1 | 2 | 4 | 8, $desktop);
$box.canActivate = true;
$box.active = true;
$box.$content.canActivate = true;
$box.$content.active = true;

$title = MAIN.$ui.createHeadingBar($box, $strings.$menu_sandbox_title);

with ($mapTitle = new_control($box.$content)) {
  .setRect(40, 60, 200, 18);
  MAIN.$ui.setTextFont(current);
  .textAlign = ALIGN_MIDDLE | ALIGN_LEFT;
  .text = $strings.$menu_sandboxMap_title;
  .visible = true;
  .canActivate = false;
}
with ($itemsArea = new_control($box.$content)) {
  .setRect(40, 80, 200, 385);
  .setBorder(0xFF777777, 2);
  .visible = true;
  .canActivate = false;
}
with ($itemsBox = MAIN.$ui.createScrollArea($itemsArea, 2, 2, $itemsArea.width - 4, $itemsArea.height - 4)) {
  .$content.background = 0;
  $y = 0;
}

foreach (list_files("metro/maps", ".grid")) {
  addMap("metro/maps/"+current, true);
}
foreach (MAIN.$addons.$maps) {
  addMap(current, true);
}
foreach (list_files("userdata/maps", ".grid")) {
  addMap("userdata/maps/"+current, false);
}

function addMap($filename, $getName) {
  $text = changeFileExt(extractFileName($filename), "");
  if ($getName) {
    $name = $strings.getVariable("cityname_"+$text);
    if (defined $name) $text = $name;
  }
  if ($selectedMap == "") $selectedMap = $filename;
  $button = MAIN.$ui.createChoiceButton($itemsBox.$content, $itemsArea, 0, $y, $itemsBox.$content.width, 18, $text, macro($filename) :: selectMap($0));
  $y += 18;
}

with ($difficultyTitle = new_control($box.$content)) {
  .setRect(590, 350, 200, 18);
  MAIN.$ui.setTextFont(current);
  .textAlign = ALIGN_MIDDLE | ALIGN_CENTER;
  .text = $strings.$menu_sandboxDifficulty_title;
  .visible = true;
  .canActivate = false;
}
with ($difficultyArea = new_control($box.$content)) {
  .setRect(590, 370, 200, 76);
  .setBorder(0xFF777777, 2);
  .visible = true;
  .canActivate = false;
}
$easyButton = MAIN.$ui.createChoiceButton($difficultyArea, $difficultyArea, 2, 2, 196, 18, $strings.$menu_difficultyEasy_item, macro :: selectDifficulty(0));
$normalButton = MAIN.$ui.createChoiceButton($difficultyArea, $difficultyArea, 2, 20, 196, 18, $strings.$menu_difficultyNormal_item, macro :: selectDifficulty(1));
$hardButton = MAIN.$ui.createChoiceButton($difficultyArea, $difficultyArea, 2, 38, 196, 18, $strings.$menu_difficultyHard_item, macro :: selectDifficulty(2));
$customButton = MAIN.$ui.createChoiceButton($difficultyArea, $difficultyArea, 2, 56, 196, 18, $strings.$menu_difficultyCustom_item, macro :: selectDifficulty(3));
MAIN.$ui.selectChoiceButton($normalButton, $difficultyArea);

with ($yearTitle = new_control($box.$content)) {
  .setRect(270, 60, 200, 18);
  MAIN.$ui.setTextFont(current);
  .textAlign = ALIGN_MIDDLE | ALIGN_LEFT;
  .text = $strings.$menu_sandboxYear_title;
  .visible = true;
  .canActivate = false;
}
$yearEdit = MAIN.$ui.createNumberEdit($box.$content, 270, 80, 100, 25, 1920, 2020, 5, "%0", 1980);
$yearEdit.setBorder(0xFF777777, 2);
$yearEdit.background = 0;
$yearEdit.$action = selectYear;

with ($mapArea = new_control($box.$content)) {
  .setRect(270, 120, 196, 196);
  .setBorder(0xFF000000, 2);
  .background = 0x80000000;
  .visible = true;
  .canActivate = false;
}
with ($mapImage = new_control($mapArea)) {
  .setRect(0, 0, 128, 128);
  .visible = true;
  .canActivate = false;
}
with ($sizeTitle = new_control($box.$content)) {
  .setRect(270, 320, 200, 36);
  MAIN.$ui.setTextFont(current);
  .textAlign = ALIGN_TOP | ALIGN_LEFT;
  .text = $strings.$menu_sandboxSize_pattern;
  .setArg(0, "");
  .visible = true;
  .canActivate = false;
}

with ($separator = new_control($box.$content)) {
  .setRect(500, 80, 2, 385);
  .background = 0x80777777;
  .visible = true;
  .canActivate = false;
}

with ($colorTitle = new_control($box.$content)) {
  .setRect(860, 62, 120, 36);
  MAIN.$ui.setTextFont(current);
  .textAlign = ALIGN_MIDDLE | ALIGN_LEFT;
  .text = $strings.$menu_sandboxColor_title;
  .visible = true;
  .canActivate = false;
}
with ($colorArea = new_control($box.$content)) {
  .setRect(860, 100, 100, 364);
  .visible = true;
  .canActivate = false;
}
for ($i = 0; $i < 14; ++$i) {
  $colorButton = MAIN.$ui.createChoiceButton($colorArea, $colorArea, ($i % 2) * 50, ($i / 2) * 52, 50, 52, "", macro($colors[$i]) :: selectColor($0), "/metro/ui/menus/color-button.dds", "/metro/ui/menus/color-button_se.dds", "/metro/ui/menus/color-button_ho.dds");
  $colorButton.setCropRect(7.0 / 64.0, 6.0 / 64.0, 50.0 / 64.0, 52.0 / 64.0);
  with (new_control($colorButton)) {
    .setRect(9, 10, $colorButton.width - 18, $colorButton.height - 20);
    .background = $colors[$i];
    .visible = true;
    .canActivate = false;
    .clickThrough = true;
  }
}

with ($logoTitle = new_control($box.$content)) {
  .setRect(590, 60, 200, 18);
  MAIN.$ui.setTextFont(current);
  .textAlign = ALIGN_MIDDLE | ALIGN_CENTER;
  .text = $strings.$menu_sandboxLogo_title;
  .visible = true;
  .canActivate = false;
}
with ($logoIcon = new_control($box.$content)) {
  .setRect(626, 80, 128, 128);
  .setImage("/"+$selectedLogo);
  .setShader("/metro/ui/menus/logo.shader");
  .visible = true;
  .canActivate = false;
}
$prevLogoButton = MAIN.$ui.createButton($box.$content, $logoIcon.left - 44, $logoIcon.top + 48, 32, 32, "", macro :: selectLogo($logoIndex-1), "/metro/ui/menus/left-small.dds", "/metro/ui/menus/left-small_se.dds", "/metro/ui/menus/left-small_ho.dds", "/metro/ui/menus/left-small_ia.dds");
$nextLogoButton = MAIN.$ui.createButton($box.$content, $logoIcon.left + 140, $logoIcon.top + 48, 32, 32, "", macro :: selectLogo($logoIndex+1), "/metro/ui/menus/right-small.dds", "/metro/ui/menus/right-small_se.dds", "/metro/ui/menus/right-small_ho.dds", "/metro/ui/menus/right-small_ia.dds");

with ($nameTitle = new_control($box.$content)) {
  .setRect(590, 220, 200, 18);
  MAIN.$ui.setTextFont(current);
  .textAlign = ALIGN_MIDDLE | ALIGN_CENTER;
  .text = $strings.$menu_sandboxName_title;
  .visible = true;
  .canActivate = false;
}
with ($nameInput = new_editControl($box.$content)) {
  .setBorder(0xFF777777, 2);
  .setRect(540, 240, 300, 25);
  .background = 0x60777777;
  .setMargins(2, 5, 2, 2);
  MAIN.$ui.setTextFont(current);
  .caretColor = 0xFFFFFFFF;
  .maxLength = 32;
  .text = $selectedName;
  .selStart = #$selectedName;
  .visible = true;
  event .onCheckInput::($key) {
    .rejectInput = $key < 32;
  }
  event .onChange::() {
    $selectedName = .text;
  }
}
with ($randomButton = MAIN.$ui.createButton($box.$content, 745, 270, 96, 25, $strings.$menu_randomName_button, randomizeName, "/metro/ui/button.dds", "/metro/ui/button.dds", "/metro/ui/button.dds")) {
  .setCropRect(16.0 / 128.0, 3.0 / 32.0, 96.0 / 128.0, 25.0 / 32.0);
}

with ($menu.createMenuButton($box.$content, $strings.$menu_sandboxStart_button, "ok")) {
  .setRect(40, $box.$content.height - .height - 20, .width, .height);
}

with ($menu.createMenuButton($box.$content, $strings.$menu_back_button, "back")) {
  .setRect($box.$content.width - .width - 40, $box.$content.height - .height - 20, .width, .height);
}

function randomizeName() {
  $selectedName = $strings.$company_names_firstPart[random(#$strings.$company_names_firstPart)]+" "+$strings.$company_names_secondPart[random(#$strings.$company_names_secondPart)];
  $nameInput.selLength = 0;
  $nameInput.text = $selectedName;
  $nameInput.selStart = #$selectedName;
}

function selectDifficulty($difficulty) {
  $selectedDifficulty = $difficulty;
  if ($difficulty == 0) {
    $selectedMoney = 15000*100;
    $selectedBanks = 4;
    $selectedDemolishCost = -90;
    $selectedPrivateCars = 60;
  } else if ($difficulty == 1) {
    $selectedMoney = 12500*100;
    $selectedBanks = 3;
    $selectedDemolishCost = -50;
    $selectedPrivateCars = 80;
  } else if ($difficulty == 2) {
    $selectedMoney = 10000*100;
    $selectedBanks = 2;
    $selectedDemolishCost = -20;
    $selectedPrivateCars = 100;
  } else if ($difficulty == 3) {
    MAIN.$main.perform("difficulty");
  }
}

function selectColor($color) {
  $selectedColor = $color;
  $logoIcon.background = $color;
}

function selectLogo($index) {
  $logoIndex = ($index + #$availableLogos) % #$availableLogos;
  $selectedLogo = $availableLogos[$logoIndex];
  $logoIcon.setImage("/"+$selectedLogo);
  $logoIcon.background = $selectedColor;
  //$prevLogoButton.enabled = $logoIndex > 0;
  //MAIN.$ui.updateButtonImage($prevLogoButton);
  //$nextLogoButton.enabled = $logoIndex < #$availableLogos-1;
  //MAIN.$ui.updateButtonImage($nextLogoButton);
}

function selectYear() {
  $selectedDate = mkdate(1, 1, $yearEdit.$value);
  if ($timelineImages) {
    $tile = int($yearEdit.$value - 1920) * 15 / 100;
    $mapImage.setCropRect(($tile & 3) * 0.25, ($tile >> 2) * 0.25, 0.25, 0.25);
  }
}

function selectMap($map) {
  $timelineImages = false;
  $selectedMap = $map;
  $scenarioName = changeFileExt($map, ".scenario");
  $size = 1280;
  if (file_exists($scenarioName)) {
    $s = load "/"+$scenarioName;
    $c = clock($s.$currentTime, $s.$currentDate);
    $yearEdit.$min = $c.years;
    $yearEdit.$value = max($yearEdit.$value, $c.years);
    $selectedDate = mkdate(1, 1, $yearEdit.$value);
    if (defined $s.$cellSize) $size = $s.$cellSize;
    delete $s;
  }
  $imageName1 = changeFileExt($map, "-timeline.dds");
  $imageName2 = changeFileExt($map, ".dds");
  if (file_exists($imageName1)) {
    $timelineImages = true;
    $mapImage.setImage("/"+$imageName1);
    selectYear();
  } else if (file_exists($imageName2)) {
    $mapImage.setImage("/"+$imageName2);
    $mapImage.setCropRect(0.0, 0.0, 1.0, 1.0);
  } else {
    $mapImage.setImage(null);
  }
  $sizeTitle.setArg(0, $strings.$menu_mapSize_items[clamp($size/256-2, 0, 11)]);
  $size = $size * 192 / 1280;
  $mapImage.setRect(($mapArea.clientWidth - $size) * 0.5, ($mapArea.clientHeight - $size) * 0.5, $size, $size);
}

function openDifficulty() {
  if ($difficultyMenu) return;
  MAIN.$main.$menu.$inDialog = true;
  $difficultyMenu = load "difficulty.script";
}

function saveDifficulty() {
  if ($difficultyMenu == null) return;
  $selectedMoney = $difficultyMenu.$selectedMoney;
  $selectedBanks = $difficultyMenu.$selectedBanks;
  $selectedDemolishCost = $difficultyMenu.$selectedDemolishCost;
  $selectedPrivateCars = $difficultyMenu.$selectedPrivateCars;
  delete $difficultyMenu;
  $difficultyMenu = null;
  MAIN.$main.$menu.$inDialog = false;
}

function cancelDifficulty() {
  if ($difficultyMenu == null) return;
  delete $difficultyMenu;
  $difficultyMenu = null;
  MAIN.$main.$menu.$inDialog = false;
}

randomizeName();
if ($selectedMap != "") selectMap($selectedMap);
selectLogo($logoIndex);

event this.onDestroy::() {
  delete $difficultyMenu;
  delete $box;
}

