#include  <iostream>
#include  <string>
#include <math.h>
#include "Utilities/Configuration/interface/Architecture.h"
#include "Visualisation/CustomTracker/interface/TkLayerSelection.h"
//#include "Utilities/GenUtil/interface/envUtil.h"
#include "Visualisation/CustomTracker/interface/TkSceneUpdate.h"
#include "Tracker/TkLayout/interface/FullTracker.h"
#include "Tracker/TkLayout/interface/CmsTracker.h"
#include "ClassReuse/GeomVector/interface/GlobalPoint.h"
#include "CommonDet/DetGeometry/interface/TkRotation.h"
#include "CommonDet/DetGeometry/interface/Surface.h"
#include "CommonDet/DetGeometry/interface/ActiveMediaShape.h"
#include "CommonDet/DetLayout/interface/DetLayer.h"
#include "CommonDet/BasicDet/interface/DetUnit.h"
#include "CommonDet/BasicDet/interface/Enumerators.h"
#include "CommonDet/BasicDet/interface/Det.h"
#include "CommonDet/BasicDet/interface/DetType.h"
#include "CommonDet/BasicDet/interface/SimHit.h"  
#include "CommonDet/BasicDet/interface/SimDet.h"






TkLayerSelection::TkLayerSelection( TkSceneUpdate *par, QWidget *parent, const char *name , int newlay)
        : QWidget( parent, name )
{
  lym = par;
  nlay=newlay;
  nmoduli= 0; var = 0;
  xa=0;ya=0;za=0;angle=0;thi=0,hbot=0,htop=0,hapo=0,hthi=0;
  posx=0,posy=0,posz=0;
  modulo = 2;
  bar_fow =1;
  TkSceneUpdate::TkModuleMap::iterator pos;
  DetUnit *det;
   for(int k=0;k<12;k++){
      for(int i=0;i<200;i++){      
        int chiave=nlay*100000+k*1000+(i+1);
        pos = lym->tkModuleMap.find(chiave);     	
        if(pos!=lym->tkModuleMap.end()){
         det=pos->second;
         ri[nmoduli]= QRegion();
         cliccato[nmoduli]=false;
         vane[nmoduli]=k;
         vmod[nmoduli]=i;
         addModule(det);     
         nmoduli++;
        } 
      }
      }
  setPalette( QPalette( QColor( 250, 250, 250) ) );
  xmin = -2.0; xmax = 2.0; ymin = -2.0; ymax =2.0;
 /* for (int i=0;i<2000;i++){
   ri[i]= QRegion();
  }
  envUtil eU("TK_DATA_FILE","");
  string defaultFileName = eU.getEnv();
  infile = new ifstream(defaultFileName.c_str(),ios::in);

  while(*infile >> numod ){

    *infile >> modulo >> bar_fow >> layer >> anello >> nmod >> posx >> posy >> posz >> hbot >> htop >> hapo >> hthi >> xa >> ya >> za >> angle;

    layer1=layer;
    if(layer1==nlay){

      cliccato[nmoduli]=false;
      vane[nmoduli]=anello;
      vmod[nmoduli]=nmod;
      vposx[nmoduli]=posx;
      vposy[nmoduli]=posy;
      vposz[nmoduli]=posz;           
      vhtop[nmoduli]=htop;
      vhbot[nmoduli]=hbot;
      vhapo[nmoduli]=hapo;                 
    }
  }//while
  infile->close();
*/
  if(nlay >12 && nlay <17){
     xmin=-.70;xmax=.70;ymin=-.70;ymax=.70;
  }
  if(nlay >28 ){
     xmin=-2.5;xmax=2.5;ymin=-1.;ymax=28.;
     if(nlay <32){xmin=-1.;xmax=1.;}
  }
  connect( this, SIGNAL(myclicked(bool,int,int,int)), lym, SLOT(updateModule(bool,int,int,int)) );	
}

void TkLayerSelection::addModule( const DetUnit* det )
{
      vposx[nmoduli]=det->surface().position().x()/100.0 ;
      vposy[nmoduli]=det->surface().position().y() / 100.0; 
      vposz[nmoduli]=det->surface().position().z() / 100.0;
     const vector< float > par = det->type().shape().parameters();
    if( par.size() == 3 )
    { // Rectangular
         vhapo[nmoduli] = det->type().shape().length() / 100.0; 
         vhtop[nmoduli] = det->type().shape().width() / 100.0; 
         vhbot[nmoduli] = vhtop[nmoduli];
   }
    else if( par.size() == 4 )
    { // Trapezoidal
        vhbot[nmoduli]=par[0]/100.0; // cm -> m
        vhtop[nmoduli]=par[1]/100.0; // cm -> m
        vhapo[nmoduli]=par[3]/100.0; // cm -> m
    }

}
void TkLayerSelection::mousePressEvent( QMouseEvent *e )
{
   for(int i=0; i<nmoduli; i++){
      if(ri[i].contains(e->pos())){
      cout <<vmod[i]<<" "<<vane[i]<< endl;
         if(!cliccato[i]){
	      TkSelectionSet::matrix[nlay-1][vane[i]-1][vmod[i]]=true;
              cliccato[i]=true;
	      emit myclicked(true, nlay, vane[i],vmod[i]);	      
	 }   
	 else {
	        TkSelectionSet::matrix[nlay-1][vane[i]-1][vmod[i]]= false;
		cliccato[i]=false;
	        emit myclicked(false, nlay, vane[i],vmod[i]);
	 } 
     }
   }
   repaint();
}


void TkLayerSelection::paintEvent( QPaintEvent * e)
{ 
  QPainter p( this );

  QPointArray a =  QPointArray(4);
  
  float phi1;
   //cout <<nmoduli<<endl;
  for(int i=0;i<nmoduli;i++){
  phi1=atan(vposy[i]/vposx[i]);
  phi=phi1;
  if(vposy[i] < 0.&&vposx[i]>0)phi=phi1+2.*3.1415;   
  if(vposx[i] < 0.)phi=phi1+3.1415;
  if(fabs(vposy[i])<0.000001&&vposx[i]>0)phi=0;
  if(fabs(vposy[i])<0.000001&&vposx[i]<0)phi=3.1415;
  if(fabs(vposx[i])<0.000001&&vposy[i]>0)phi=3.1415/2.;
  if(fabs(vposx[i])<0.000001&&vposy[i]<0)phi=3.*3.1415/2.;
  
  if(phi < 0.)phi = 2.*3.1415 +phi;
  //endcaps 
  if(nlay < 29){
     r = sqrt(vposx[i]*vposx[i]+vposy[i]*vposy[i]);
     if(nlay >12 && nlay <17){
       r = r*4;
       xp[0]=r-vhbot[i];yp[0]=-vhapo[i];
       xp[1]=r+vhtop[i];yp[1]=-vhapo[i];
       xp[2]=r+vhtop[i];yp[2]=vhapo[i];
       xp[3]=r-vhbot[i];yp[3]=vhapo[i];
     }else{
           r = r + r/3.;
           xp[0]=r-vhapo[i];yp[0]=-vhbot[i];
           xp[1]=r+vhapo[i];yp[1]=-vhtop[i];
           xp[2]=r+vhapo[i];yp[2]=vhtop[i];
           xp[3]=r-vhapo[i];yp[3]=vhbot[i];
     }
     for(int j=0;j<4;j++){
        xp1 = xp[j]*cos(phi)-yp[j]*sin(phi);
        yp1 = xp[j]*sin(phi)+yp[j]*cos(phi);
        xp[j] = xp1;yp[j]=yp1;
        x=xpixel(xp[j]);y=ypixel(yp[j]);
	a.setPoint(j,x,y);
     }
  } else {
  // Barrel
         xp[0]=vposz[i]+vposz[i]/1.-vhtop[i];yp[0]=4.*phi-vhapo[i];
         xp[1]=vposz[i]+vposz[i]/1.+vhtop[i];yp[1]=4.*phi-vhapo[i];
         xp[2]=vposz[i]+vposz[i]/1. +vhtop[i];yp[2]=4.*phi+vhapo[i];
         xp[3]=vposz[i]+vposz[i]/1.-vhtop[i];yp[3]=4.*phi+vhapo[i];
         for(int j=0;j<4;j++){
             x=xpixel(xp[j]);y=ypixel(yp[j]);
    	     a.setPoint(j,x,y);
//cout << x<< " " <<y<<endl;
         }
   }
   p.setPen(black);  
   
   if(cliccato[i])p.setPen(red);
   else {
      if(vmod[i]>100)p.setPen(blue);
      else p.setPen(black);
   }
   ri[i]= QRegion(a,false);
   //ri[i]=a.boundingRect();
   p.drawPolygon(a);
 }//for

}
QSizePolicy TkLayerSelection::sizePolicy() const
{
    return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
}

