using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace JtkManagerClient {
    public partial class PcMapAddForm : Form {
        public (string id, int number)[] Result { get; private set; }

        public PcMapAddForm() {
            InitializeComponent();
            digitsComboBox.SelectedIndex = 0;
        }

        #region Event Handlers

        /// <summary>싱글 라디오 버튼</summary>
        private void oneRadioButton_CheckedChanged(object sender, EventArgs e) {
            oneGroupBox.Enabled = oneRadioButton.Checked;
        }

        /// <summary>멀티 라디오 버튼</summary>
        private void multipleRadioButton_CheckedChanged(object sender, EventArgs e) {
            multipleGroupBox1.Enabled = multipleGroupBox2.Enabled = multipleGroupBox3.Enabled = multipleRadioButton.Checked;
        }

        /// <summary>싱글 - ID 텍스트 상자</summary>
        private void idTextBox_TextChanged(object sender, EventArgs e) {
            TrimTextBox(sender as TextBox);
        }

        /// <summary>싱글 - 번호 텍스트 상자</summary>
        private void numberTextBox_TextChanged(object sender, EventArgs e) {
            TrimTextBox(sender as TextBox);
        }

        /// <summary>멀티 - 자릿수 콤보 상자</summary>
        private void digitsComboBox_SelectedIndexChanged(object sender, EventArgs e) {
            UpdateLabels();
        }
        
        /// <summary>멀티 - ID 범위 텍스트 상자</summary>
        private void startEndIdTextBox_TextChanged(object sender, EventArgs e) {
            TrimTextBox(sender as TextBox);
            UpdateLabels();
        }

        /// <summary>멀티 - 수식어 텍스트 상자</summary>
        private void prefixPostfixTextBox_TextChanged(object sender, EventArgs e) {
            TrimTextBox(sender as TextBox);
            UpdateLabels();
        }

        /// <summary>멀티 - 시작 번호 텍스트 상자</summary>
        private void startNumberTextBox_TextChanged(object sender, EventArgs e) {
            TrimTextBox(sender as TextBox);
        }

        /// <summary>완료 버튼</summary>
        private void button1_Click(object sender, EventArgs e) {
            var list = new List<(string id, int number)>();
            if (oneRadioButton.Checked) {
                // 싱글 모드
                if (string.IsNullOrWhiteSpace(idTextBox.Text)) {
                    MessageBox.Show("PC ID를 입력하세요.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    idTextBox.Focus();
                    return;
                }
                if (int.TryParse(numberTextBox.Text, out var number) == false || number < 1 || number > 999) {
                    MessageBox.Show("1부터 999 사이의 유효한 PC 번호를 입력하세요.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    numberTextBox.Focus();
                    return;
                }
                list.Add((idTextBox.Text, number));
            } else {
                // 멀티 모드
                if (int.TryParse(startIdTextBox.Text, out var startId) == false || startId < 0) {
                    MessageBox.Show("유효한 PC ID 시작 번호를 입력하세요.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    startIdTextBox.Focus();
                    return;
                }
                if (int.TryParse(endIdTextBox.Text, out var endId) == false || endId < 0) {
                    MessageBox.Show("유효한 PC ID 끝 번호를 입력하세요.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    endIdTextBox.Focus();
                    return;
                }
                if (endId < startId) {
                    MessageBox.Show("PC ID 끝 번호는 시작 번호보다 크거나 같게 입력하세요.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    endIdTextBox.Focus();
                    return;
                }
                var creatingCount = endId - startId + 1;
                if (creatingCount > 100) {
                    MessageBox.Show("PC는 한번에 최대 100개까지만 생성할 수 있습니다.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    endIdTextBox.Focus();
                    return;
                }
                if (int.TryParse(startNumberTextBox.Text, out var startNumber) == false) {
                    MessageBox.Show("유효한 PC 시작 번호를 입력하세요.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    startNumberTextBox.Focus();
                    return;
                } else if (startNumber < 0) {
                    MessageBox.Show("PC 시작 번호는 1이상이어야 합니다.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    startNumberTextBox.Focus();
                    return;
                } else if (startNumber + creatingCount - 1 > 999) {
                    MessageBox.Show("생성하려는 PC의 마지막 번호가 999를 초과하지 않게 입력하세요.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    startNumberTextBox.Focus();
                    return;
                }
                for (var i = 0; i < creatingCount; i++) {
                    list.Add((GetFormattedIdString(number: startId + i), startNumber + i));
                }
            }
            DialogResult = DialogResult.OK;
            Result = list.ToArray();
            Close();
        }

        /// <summary>취소 버튼</summary>
        private void button2_Click(object sender, EventArgs e) {
            Close();
        }

        /// <summary>아무나 폼을 닫을 수 없다.</summary>
        private void PcMapAddForm_FormClosing(object sender, FormClosingEventArgs e) {
            if (e.CloseReason == CloseReason.None) {
                e.Cancel = true;
            }
        }

        #endregion

        /// <summary>텍스트 상자의 내용 문자열을 트림</summary>
        private void TrimTextBox(TextBox textBox) {
            var cursorWasNotAtFirst = textBox.SelectionStart > 1;
            var trimmedText = textBox.Text.Trim();
            var changed = trimmedText != textBox.Text;
            textBox.Text = trimmedText;
            if (cursorWasNotAtFirst && changed) {
                textBox.SelectionStart = textBox.Text.Length;
            }
        }

        /// <summary>형식화된 ID 문자열</summary>
        private string GetFormattedIdString(bool numberPartOnly = false, int number = -1) {
            string str = null;
            if (int.TryParse(startIdTextBox.Text, out var start) && start >= 0) {
                var formatBuilder = new StringBuilder("0");
                if (int.TryParse(digitsComboBox.SelectedItem.ToString(), out var digits)) {
                    for (var i = 1; i < digits; i++) {
                        formatBuilder.Append("0");
                    }
                }
                str = (number < 0 ? start : number).ToString(formatBuilder.ToString());
                if (numberPartOnly == false) {
                    str = prefixTextBox.Text + str + postfixTextBox.Text;
                }
            }
            return str;
        }

        /// <summary>멀티 - 레이블 갱신</summary>
        private void UpdateLabels() {
            // 자릿수에 대한 레이블
            var str1 = GetFormattedIdString(true);
            digitsExampleLabel.Text = "예: " + (str1 != null ? str1 : "???");
            fixExampleTextBox.Text = str1 != null ? str1 : "???";

            // 수식어에 대한 레이블
            var str2 = GetFormattedIdString(false);
            fixExampleLabel.Text = "예: " + (str2 != null ? str2 : "???");

            // 생성될 개수에 대한 레이블
            if (int.TryParse(startIdTextBox.Text, out var start) && int.TryParse(endIdTextBox.Text, out var end) && start <= end && start >= 0) {
                rangeExampleLabel.Text = $"총 {end - start + 1:N0}개";
            } else {
                rangeExampleLabel.Text = "총 0개";
            }
        }

        
    }
}
