// Copyright (C) 2010, 2011, 2013 panacoran <panacoran@users.sourceforge.jp>
// 
// This program is part of Protra.
//
// Protra is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, see <http://www.gnu.org/licenses/>.
// 
// $Id: BrandListConfig.cs 508 2014-02-19 06:05:07Z panacoran $

using System.Collections.Generic;
using System.Windows.Forms;
using System.Xml.Serialization;

namespace Protra.Lib.Config
{
    /// <summary>
    /// 銘柄リストを格納するクラス
    /// </summary>
    public class BrandList
    {
        /// <summary>
        /// 銘柄リストの名前を取得または設定する。
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 銘柄リストを取得または設定する。
        /// </summary>
        public List<string> List { get; set; }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public BrandList()
        {
            List = new List<string>();
        }

        /// <summary>
        /// 文字列形式を返す。
        /// </summary>
        /// <returns>銘柄リストの名前。</returns>
        public override string ToString()
        {
            return Name;
        }
    }

    /// <summary>
    /// 銘柄リストの設定を読み書きするクラス。
    /// </summary>
    public class BrandListConfig : ConfigBase
    {
        /// <summary>
        /// 銘柄リストリストを取得または設定する。
        /// </summary>
        public List<BrandList> List { get; set; }

        /// <summary>
        /// 編集可能な銘柄リストのリストを取得する。
        /// </summary>
        [XmlIgnore]
        public List<BrandList> EditableList
        {
            get { return List.GetRange(3, List.Count - 3); }
        }

        /// <summary>
        /// 上場廃止銘柄を含むかどうかを取得または設定する。
        /// </summary>
        public bool EnableObsoleteBrand { get; set; }

        /// <summary>
        /// 設定ファイルの名前を取得する。
        /// </summary>
        protected override string ConfigName
        {
            get { return "brandlist"; }
        }

        /// <summary>
        /// 銘柄リストの表示を更新するデリゲートを取得または設定する。
        /// </summary>
        [XmlIgnore]
        public MethodInvoker BrandListInit { private get; set; }

        /// <summary>
        /// 銘柄リストを読み込む。
        /// </summary>
        public override void Load()
        {
            base.Load();
            if (List == null) // 設定ファイルがない場合
                List = new List<BrandList> {new BrandList {Name = "お気に入り"}};
            SetDefaultBrandList();
            if (BrandListInit == null)
                return;
            var main = (Form)BrandListInit.Target;
            if (main.InvokeRequired)
                main.Invoke(BrandListInit, null);
            else
                BrandListInit();
        }

        /// <summary>
        /// 株価指数、日経平均構成銘柄、売買代金上位500位の銘柄リストを挿入する。
        /// すでに存在する場合には作り直す。
        /// </summary>
        public void SetDefaultBrandList()
        {
            if (List.Count >= 3 && List[2].Name == "売買代金上位500位")
                List.RemoveRange(0, 3);

            var indexes = new BrandList {Name = "株価指数"};
            indexes.List.AddRange(new[] {"1001", "1002"});
            List.Insert(0, indexes);

            var n225 = new BrandList {Name = "日経平均構成銘柄"};
            List.Insert(1, n225);
            n225.List = GlobalEnv.BrandData.Nikkei225();

            var a500 = new BrandList {Name = "売買代金上位500位"};
            List.Insert(2, a500);
            a500.List = GlobalEnv.BrandData.A500();
        }

        /// <summary>
        /// 挿入した銘柄リストを削除してから保存する。
        /// </summary>
        public override void Save()
        {
            var prev = List;
            if (List.Count >= 3 && List[2].Name == "売買代金上位500位")
                List = List.GetRange(3, List.Count - 3);
            base.Save();
            List = prev;
        }
    }
}