/*
  Copyright 2010-2011 Grégory Soutadé
  This file is part of KissCount.
  KissCount 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.
  KissCount 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 KissCount.  If not, see .
*/
#ifndef IMPORTENGINE_H
#define IMPORTENGINE_H
#include 
#include 
#include 
class KissCount;
class ImportPattern {
public:
    std::string pattern;
    int account;
    int category;
} ;
class ImportEngine {
public:
    static std::string NULL_IMPORT_PATTERN;
    ImportEngine();
    ~ImportEngine();
    // Get supported file extension. Example :
    // "OFX files (*.ofx)|*.ofx"
    virtual std::string GetFileExt();
    // Handle the file
    virtual bool HandleFile(const std::string& path, User* user, Database* db, KissCount* kiss)=0;
    // Parse the file and return accounts that doesn't match
    virtual void ParseFile(std::vector& accounts, std::vector& categories);
    
    // Final Step
    virtual std::vector* GetOperations(std::map& accounts, std::map& categories);
    const std::map& GetAccountAmounts();
    void MatchPattern(std::string& key, Operation& op);
    int UpdatePattern(int pos);
    static std::string RemoveUnused(const std::string& s);
protected:
    Database* _db;
    User* _user;
    std::string _path;
    KissCount* _kiss;
    std::string _shortExt;
    std::string _longExt;
    std::map _accounts;
    std::map _categories;
    std::vector _unresolvedAccounts;
    std::vector _unresolvedCategories;
    std::vector _operations;
    std::map _descriptions;
    std::map _accountAmounts;
    void ApplyPattern(ImportPattern& pattern, Operation& op);
    std::string FindPattern(std::string& s1, std::string& s2);
};
#endif