/***************************************************************************
 *   Copyright (C) 2020 by Santiago González                               *
 *                                                                         *
 ***( see copyright.txt file at root folder )*******************************/

#include <QPainter>
#include<math.h>

#include "ldr.h"
#include "itemlibrary.h"
#include "resistor.h"

#include "doubleprop.h"
#include "intprop.h"
#include "propdialog.h"

#define tr(str) simulideTr("Ldr",str)

Component* Ldr::construct( QString type, QString id )
{ return new Ldr( type, id );  }

LibraryItem* Ldr::libraryItem()
{
    return new LibraryItem(
        tr("LDR"),
        "Resistive Sensors",
        "ldr.png",
        "LDR",
        Ldr::construct); 
}

Ldr::Ldr( QString type, QString id )
   : VarResBase( type, id  )
{
    m_r1    = 127410; 
    m_gamma = 0.8582; 

    setVal( 1 ); 

    addPropGroup( { tr("Main"), {
        new DoubProp<Ldr>("Lux", tr("Current Value"), "Lux"
                         , this, &Ldr::getVal, &Ldr::setVal ),

        new DoubProp<Ldr>("Min_Lux", tr("Minimum Value"), "Lux"
                         , this, &Ldr::minVal, &Ldr::setMinVal ),

        new DoubProp<Ldr>("Max_Lux", tr("Maximum Value"), "Lux"
                         , this, &Ldr::maxVal, &Ldr::setMaxVal ),

        new DoubProp<Ldr>("Dial_Step", tr("Dial Step"), "Lux"
                         , this, &Ldr::getStep, &Ldr::setStep )
    },0} ); 
    addPropGroup( { tr("Parameters"), {
        new DoubProp<Ldr>("Gamma", tr("Gamma"), ""
                         , this, &Ldr::gamma, &Ldr::setGamma ),

        new IntProp <Ldr>("R1", tr("R1"), "Ω"
                         , this, &Ldr::r1, &Ldr::setR1,0,"uint" )
    },0} ); 
    addPropGroup( { tr("Dial"), Dialed::dialProps(), 0} ); 
}
Ldr::~Ldr(){}

void Ldr::updateStep()
{
    if( !m_needUpdate ) return; 
    m_needUpdate = false; 

    double res = double(m_r1)*pow( m_value, -m_gamma ); 
    eResistor::setResistance( res ); 
    if( m_propDialog ) m_propDialog->updtValues(); 
    else setValLabelText( getPropStr( showProp() ) ); 
}

void Ldr::setR1( int r1 )
{
    m_r1 = r1; 
    m_needUpdate = true; 
}

void Ldr::setGamma( double ga )
{
    m_gamma = ga; 
    m_needUpdate = true; 
}

void Ldr::paint( QPainter* p, const QStyleOptionGraphicsItem* o, QWidget* w )
{
    if( m_hidden ) return; 

    Component::paint( p, o, w ); 

    if( m_ansiSymbol ) Resistor::drawAnsi( p, 0, 0 ); 
    else               p->drawRect( QRectF(-11,-4.5, 22, 9 )); 
    
    p->drawLine(-5,-11,-1,-7 ); 
    p->drawLine(-1, -7,-1,-9 ); 
    p->drawLine(-1, -7,-3,-7 ); 

    p->drawLine( 1,-11, 5,-7 ); 
    p->drawLine( 5, -7, 5,-9 ); 
    p->drawLine( 5, -7, 3,-7 ); 

    Component::paintSelected( p ); 
}
