/* This file is part of Lemma, a geophysical modelling and inversion API.
 * More information is available at http://lemmasoftware.org
 */

/* 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/.
 */

/**
 * @file
 * @date      11/10/2014 12:31:01 PM
 * @version   $Id$
 * @author    Trevor Irons (ti)
 * @email     Trevor.Irons@xri-geo.com
 * @copyright Copyright (c) 2014, XRI Geophysics, LLC
 * @copyright Copyright (c) 2014, Trevor Irons
 */

#include "DCIPElectrode.h"
#include "DCSurvey.h"

using namespace Lemma;

int main() {


    //DCIPElectrode* Electrode1 = DCIPElectrode::New();
    DCIPElectrode* Electrode2 = DCIPElectrode::New();
    DCIPElectrode* Electrode3 = DCIPElectrode::New();
    DCIPElectrode* Electrode4 = DCIPElectrode::New();
    DCIPElectrode* Electrode5 = DCIPElectrode::New();
    DCIPElectrode* Electrode6 = DCIPElectrode::New();
    DCIPElectrode* Electrode7 = DCIPElectrode::New();
    DCIPElectrode* Electrode8 = DCIPElectrode::New();
    DCIPElectrode* Electrode9 = DCIPElectrode::New();

        //Electrode1->SetLocation( Vector3r( 23.23, 18.1, -45 )  );
        Electrode2->SetLocation( Vector3r( 13.23, 18.1, -25 ) );
        Electrode3->SetLocation( Vector3r( 13.23, 18.1, -25 ) );
        Electrode4->SetLocation( Vector3r( 13.23, 18.1, -25 ) );
        Electrode4->SetLocation( Vector3r( 13.23, 18.1, -25 ) );
        Electrode5->SetLocation( Vector3r( 13.23, 18.1, -25 ) );
        Electrode6->SetLocation( Vector3r( 13.23, 18.1, -25 ) );
        Electrode7->SetLocation( Vector3r( 13.23, 18.1, -25 ) );
        Electrode8->SetLocation( Vector3r( 13.23, 18.1, -25 ) );
        Electrode9->SetLocation( Vector3r( 13.23, 18.1, -25 ) );

//:        std::cout << *Electrode1 << std::endl;
//     std::ofstream ofstr("DCIPElectrode.yaml");
//         ofstr << *Electrode1;
//         ofstr.close();

    /*
    //std::ifstream ifstr("DCIPElectrode.yaml");
    std::ifstream ifstr("test.yaml");
    YAML::Node node = YAML::Load(ifstr);
    DCIPElectrode* Ex = DCIPElectrode::DeSerialize(node);
    std::cout << *Ex << std::endl;
    */
    //exit(1);

    //std::cout << *Electrode << std::endl;
    //std::cout << *Electrode2 << std::endl;

    // Set up a Survey
    DCSurvey* Survey = DCSurvey::New();
        // Instead we should just put location in, and then survey acts as factory?
        DCIPElectrode* Electrode1 = Survey->PoundElectrode( Vector3r( 13.23, 18.1, -25 ), "L0-E0" );
        Survey->PoundElectrode( Electrode2 , "L0-E1" );
        Survey->PoundElectrode( Electrode3 , "L0-E2" );
        Survey->PoundElectrode( Electrode4 , "L0-E3" );
        Survey->PoundElectrode( Electrode5 , "L0-E4" );
        Survey->PoundElectrode( Electrode6 , "L0-E5" );
        Survey->PoundElectrode( Electrode7 , "L0-E6" );
        Survey->PoundElectrode( Electrode8 , "L0-E7" );
        Survey->PoundElectrode( Electrode9 , "L0-E8" );

        int J0 = Survey->AddInjection( Electrode1, Electrode2, 1.0 );
            Survey->AddMeasurement(J0, Electrode3, Electrode4 );
            Survey->AddMeasurement(J0, Electrode5, Electrode6 );
            Survey->AddMeasurement(J0, Electrode6, Electrode7 );
            Survey->AddMeasurement(J0, "L0-E7", "L0-E8" );

        int J1 = Survey->AddInjection( Electrode2, Electrode3, 1.0 );
            Survey->AddMeasurement(J1, Electrode3, Electrode4 );
            Survey->AddMeasurement(J1, Electrode5, Electrode6 );
            Survey->AddMeasurement(J1, Electrode6, Electrode7 );

        int J2 = Survey->AddInjection( Electrode3, Electrode4, 1.0 );
            Survey->AddMeasurement(J2, Electrode3, Electrode4 );
            Survey->AddMeasurement(J2, Electrode5, Electrode6 );
            Survey->AddMeasurement(J2, Electrode6, Electrode7 );

        //Survey->AddMeasurement(L1, L2)
        std::cout << *Survey << std::endl;

        std::ofstream outstr("DC.yaml");
            outstr << *Survey << std::endl;
            outstr.close();

        Survey->Delete();

        //TODO recheck DeSerialize make sure we are filling in all the Tag vectors

        std::ifstream ifstr2("DC.yaml");
        YAML::Node node2 = YAML::Load(ifstr2);
        DCSurvey* Survey2 = DCSurvey::DeSerialize(node2);

        std::cout << "==============================================================\n";
        std::cout << *Survey2 << std::endl;

    return(EXIT_SUCCESS);

}