/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

#pragma once

#include <unotools/configitem.hxx>
#include <tools/long.hxx>
#include <vector>
#include <memory>

struct Mapping;
typedef std::vector<std::unique_ptr<Mapping> > MappingArray;


#define COLUMN_COUNT                32
#define IDENTIFIER_POS              0
#define AUTHORITYTYPE_POS           1
#define AUTHOR_POS                  2
#define TITLE_POS                   3
#define YEAR_POS                    4
#define ISBN_POS                    5
#define BOOKTITLE_POS               6
#define CHAPTER_POS                 7
#define EDITION_POS                 8
#define EDITOR_POS                  9
#define HOWPUBLISHED_POS            10
#define INSTITUTION_POS             11
#define JOURNAL_POS                 12
#define MONTH_POS                   13
#define NOTE_POS                    14
#define ANNOTE_POS                  15
#define NUMBER_POS                  16
#define ORGANIZATIONS_POS           17
#define PAGES_POS                   18
#define PUBLISHER_POS               19
#define ADDRESS_POS                 20
#define SCHOOL_POS                  21
#define SERIES_POS                  22
#define REPORTTYPE_POS              23
#define VOLUME_POS                  24
#define URL_POS                     25
#define CUSTOM1_POS                 26
#define CUSTOM2_POS                 27
#define CUSTOM3_POS                 28
#define CUSTOM4_POS                 29
#define CUSTOM5_POS                 30
#define LOCAL_URL_POS               31

struct StringPair
{
    OUString   sRealColumnName;
    OUString   sLogicalColumnName;
};

struct Mapping
{
    OUString       sTableName;
    OUString       sURL;
    sal_Int16           nCommandType;
    StringPair          aColumnPairs[COLUMN_COUNT];

    Mapping() :
        nCommandType(0){}
};

struct BibDBDescriptor
{
    OUString   sDataSource;
    OUString   sTableOrQuery;
    sal_Int32       nCommandType;
};


class BibConfig : public utl::ConfigItem
{
    OUString   sDataSource;
    OUString   sTableOrQuery;
    sal_Int32       nTblOrQuery;

    OUString   sQueryField;
    OUString   sQueryText;
    MappingArray    mvMappings;
    tools::Long            nBeamerSize;
    tools::Long            nViewSize;
    bool        bShowColumnAssignmentWarning;

    OUString               aColumnDefaults[COLUMN_COUNT];

    static css::uno::Sequence<OUString> const & GetPropertyNames();

    virtual void    ImplCommit() override;

public:
    BibConfig();
    virtual ~BibConfig() override;

    virtual void            Notify( const css::uno::Sequence<OUString>& aPropertyNames) override;

    BibDBDescriptor         GetBibliographyURL();
    void                    SetBibliographyURL(const BibDBDescriptor& rDesc);

    const Mapping*          GetMapping(const BibDBDescriptor& rDesc) const;
    void                    SetMapping(const BibDBDescriptor& rDesc, const Mapping* pMapping);

    const OUString&         GetDefColumnName(sal_uInt16 nIndex) const
                                            {return aColumnDefaults[nIndex];}


    void                    setBeamerSize(tools::Long nSize) {SetModified(); nBeamerSize = nSize;}
    tools::Long                    getBeamerSize()const {return nBeamerSize;}
    void                    setViewSize(tools::Long nSize) {SetModified(); nViewSize = nSize;}
    tools::Long                    getViewSize() const {return nViewSize;}

    const OUString&         getQueryField() const {return sQueryField;}
    void                    setQueryField(const OUString& rSet) {SetModified(); sQueryField = rSet;}

    const OUString&         getQueryText() const {return sQueryText;}
    void                    setQueryText(const OUString& rSet) {SetModified(); sQueryText = rSet;}

    bool                    IsShowColumnAssignmentWarning() const
                                { return bShowColumnAssignmentWarning;}
    void                    SetShowColumnAssignmentWarning(bool bSet)
                                { bShowColumnAssignmentWarning = bSet;}
};

class DBChangeDialogConfig_Impl
{
    css::uno::Sequence<OUString> aSourceNames;
public:
    DBChangeDialogConfig_Impl();
    ~DBChangeDialogConfig_Impl();

    const css::uno::Sequence<OUString>& GetDataSourceNames();

};

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
