using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Management;

namespace ISCamRecorder {

    internal static class Program {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main() {
            //ミューテックス作成
            Mutex app_mutex = new Mutex(false, "ISCamRecorder_Mutex");

            //ミューテックスの所有権を要求する
            if (app_mutex.WaitOne(0, false) == false) {
                MessageBox.Show("本ソフトウェアは複数起動できません。");
                return;
            }

            // 起動
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }

    // 共通クラス
    public static class Common {

        /// <summary>
        /// 時刻付きデバッグ出力
        /// </summary>
        /// <param name="msg"></param>
        public static void DebugOut(string msg) {
            var now = DateTime.Now;
            var timeStr = String.Format("{0:HH:mm:ss.fff}", now);
            Debug.WriteLine($"[{timeStr}] {msg}");
        }

        /// <summary>
        /// カメラ名一覧の取得
        /// </summary>
        /// <returns>カメラ名一覧</returns>
        public static IEnumerable<string> GetCameraNames() {
            var query = @"SELECT * FROM Win32_PnPSignedDriver "
                + "WHERE DeviceID LIKE 'USB%' AND DeviceClass = 'Camera'";
            var searcher = new ManagementObjectSearcher(query);
            foreach (var device in searcher.Get().Cast<ManagementObject>().OrderBy(n => n["PDO"])) {
                var name = device["FriendlyName"]?.ToString()
                    ?? device["DeviceName"]?.ToString()
                    ?? device["Description"]?.ToString() ?? "";
                yield return name;
            }
        }

        /// <summary>
        /// カメラIDの取得
        /// </summary>
        /// <param name="cameraName">検索するカメラ名</param>
        /// <param name="fullMatch">完全一致フラグ</param>
        /// <returns>カメラID，見つからない時は-1</returns>
        public static int GetCameraIndex(string cameraName, bool fullMatch = false) {
            var cameraNames = GetCameraNames().ToList();
            var index = cameraNames.FindIndex(c => fullMatch ? c.Equals(cameraName) : c.Contains(cameraName));
            return index;
        }
    }
}
