/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2020-2022 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program 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 2
* 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, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
*/

#ifndef _EESCHEMA_SETTINGS_H
#define _EESCHEMA_SETTINGS_H

#include <settings/app_settings.h>


using KIGFX::COLOR4D;


enum LINE_MODE
{
    LINE_MODE_FREE          = 0,
    LINE_MODE_90            = 1,
    LINE_MODE_45            = 2,

    LINE_MODE_COUNT,
};


class EESCHEMA_SETTINGS : public APP_SETTINGS_BASE
{
public:
    struct APPEARANCE
    {
        wxString edit_symbol_visible_columns;
        int edit_symbol_width;
        int edit_symbol_height;
        wxString edit_sheet_visible_columns;
        int edit_sheet_width;
        int edit_sheet_height;
        wxString edit_label_visible_columns;
        int edit_label_width;
        int edit_label_height;
        int  erc_severities;
        bool footprint_preview;
        bool print_sheet_reference;
        wxString default_font;
        bool show_hidden_pins;
        bool show_hidden_fields;
        bool show_erc_warnings;
        bool show_erc_errors;
        bool show_erc_exclusions;
        bool show_illegal_symbol_lib_dialog;
        bool show_page_limits;
        bool show_sexpr_file_convert_warning;
        bool show_sheet_filename_case_sensitivity_dialog;
    };

    struct AUI_PANELS
    {
        int  hierarchy_panel_docked_width;  // width of hierarchy tree panel and pane when docked
        int  hierarchy_panel_float_width;   // width of hierarchy tree panel when floating
        int  hierarchy_panel_float_height;  // height of hierarchy tree panel when floating
        bool schematic_hierarchy_float;     // show hierarchy tree panel as floating
        bool show_schematic_hierarchy;      // show hierarchy tree pane
    };

    struct AUTOPLACE_FIELDS
    {
        bool enable;
        bool allow_rejustify;
        bool align_to_grid;
    };

    struct BOM_PLUGIN_SETTINGS
    {
        BOM_PLUGIN_SETTINGS() = default;

        BOM_PLUGIN_SETTINGS( const wxString& aName, const wxString& aPath ) :
                name( aName ),
                path( aPath )
        {}

        wxString name;
        wxString path;
        wxString command;
    };

    struct NETLIST_PLUGIN_SETTINGS
    {
        NETLIST_PLUGIN_SETTINGS() = default;

        NETLIST_PLUGIN_SETTINGS( const wxString& aName, const wxString& aPath ) :
                name( aName ),
                path( aPath )
        {}

        wxString name;
        wxString path;
        wxString command;
    };

    struct DRAWING
    {
        int      default_bus_thickness;
        int      default_junction_size;
        int      default_line_thickness;
        int      default_repeat_offset_x;
        int      default_repeat_offset_y;
        int      default_wire_thickness;
        int      default_text_size;
        int      pin_symbol_size;
        double   text_offset_ratio;
        COLOR4D  default_sheet_border_color;
        COLOR4D  default_sheet_background_color;
        wxString field_names;
        int      line_mode;
        int      repeat_label_increment;
        bool     intersheets_ref_show;
        bool     intersheets_ref_own_page;
        bool     intersheets_ref_short;
        wxString intersheets_ref_prefix;
        wxString intersheets_ref_suffix;
        bool     auto_start_wires;
        std::vector<double> junction_size_mult_list;
        // Pulldown index for user default junction dot size (e.g. smallest = 0, small = 1, etc)
        int      junction_size_choice;
    };

    struct INPUT
    {
        bool drag_is_move;
        bool esc_clears_net_highlight;
    };

    struct SELECTION
    {
        int  selection_thickness;
        int  highlight_thickness;
        bool draw_selected_children;
        bool fill_shapes;
        bool select_pin_selects_symbol;
    };

    struct PAGE_SETTINGS
    {
        bool export_paper;
        bool export_revision;
        bool export_date;
        bool export_title;
        bool export_company;
        bool export_comment1;
        bool export_comment2;
        bool export_comment3;
        bool export_comment4;
        bool export_comment5;
        bool export_comment6;
        bool export_comment7;
        bool export_comment8;
        bool export_comment9;
    };

    struct PANEL_ANNOTATE
    {
        bool automatic;
        bool recursive;
        int scope;
        int options;
        int method;
        int messages_filter;
        int sort_order;
    };

    struct PANEL_BOM
    {
        wxString selected_plugin;
        std::vector<BOM_PLUGIN_SETTINGS> plugins;
    };

    struct PANEL_FIELD_EDITOR
    {
        std::map<std::string, bool> fields_show;
        std::map<std::string, bool> fields_group_by;
        std::map<std::string, int> column_widths;
    };

    struct PANEL_LIB_VIEW
    {
        int lib_list_width;
        int cmp_list_width;
        bool show_pin_electrical_type;
        bool show_pin_numbers;
        WINDOW_SETTINGS window;
    };

    struct PANEL_NETLIST
    {
        std::vector<NETLIST_PLUGIN_SETTINGS> plugins;
    };

    struct PANEL_PLOT
    {
        bool     background_color;
        bool     color;
        wxString color_theme;
        int      format;
        bool     frame_reference;
        int      hpgl_paper_size;
        double   hpgl_pen_size;
        int      hpgl_origin;
        bool     open_file_after_plot;
    };

    struct PANEL_SYM_CHOOSER
    {
        int  sash_pos_h;
        int  sash_pos_v;
        int  width;
        int  height;
        bool keep_symbol;
        bool place_all_units;
    };

    struct SIMULATOR
    {
        int plot_panel_width;
        int plot_panel_height;
        int signal_panel_height;
        int cursors_panel_height;
        bool white_background;
        WINDOW_SETTINGS window;
    };

    struct FIND_REPLACE_EXTRA
    {
        bool search_all_fields;
        bool search_all_pins;
        bool search_current_sheet_only;

        bool replace_references;
    };

    EESCHEMA_SETTINGS();

    virtual ~EESCHEMA_SETTINGS() {}

    virtual bool MigrateFromLegacy( wxConfigBase* aLegacyConfig ) override;

    static std::vector<BOM_PLUGIN_SETTINGS> DefaultBomPlugins();


protected:
    virtual std::string getLegacyFrameName() const override { return "SchematicFrame"; }

private:
    bool migrateBomSettings();

    nlohmann::json bomSettingsToJson() const;

    static std::vector<BOM_PLUGIN_SETTINGS> bomSettingsFromJson( const nlohmann::json& aObj );

    nlohmann::json netlistSettingsToJson() const;
    static std::vector<NETLIST_PLUGIN_SETTINGS> netlistSettingsFromJson( const nlohmann::json& aObj );

public:
    APPEARANCE m_Appearance;

    AUTOPLACE_FIELDS m_AutoplaceFields;

    AUI_PANELS m_AuiPanels;

    DRAWING m_Drawing;

    FIND_REPLACE_EXTRA m_FindReplaceExtra;

    INPUT m_Input;

    PAGE_SETTINGS m_PageSettings;

    PANEL_ANNOTATE m_AnnotatePanel;

    PANEL_BOM m_BomPanel;

    PANEL_FIELD_EDITOR m_FieldEditorPanel;

    PANEL_LIB_VIEW m_LibViewPanel;

    PANEL_NETLIST m_NetlistPanel;

    PANEL_PLOT m_PlotPanel;

    PANEL_SYM_CHOOSER m_SymChooserPanel;

    SELECTION m_Selection;

    SIMULATOR m_Simulator;

    bool m_RescueNeverShow;

    wxString m_lastSymbolLibDir;
};


#endif
