!---------------------------------------------------------------------------------------
! PREP_FLUXES: adjust_time
!---------------------------------------------------------------------------------------
!  FLEXINVERT 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.
!
!  FLEXINVERT 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 FLEXINVERT.  If not, see <http://www.gnu.org/licenses/>.
!
!  Copyright 2017, Rona Thompson
!---------------------------------------------------------------------------------------
!
!> adjust_time
!!
!! Purpose:    Calculates the time dimension of the output in julian days and
!!             adjusts the time for the selected year.
!!
!! Interface:
!!
!!    Inputs
!!             settings  -  settings data structure
!!             time      -  time dimension of input
!!             timeout   -  time dimension of output (zero on input)
!!
!!    Externals
!!             caldate
!!
!---------------------------------------------------------------------------------------

subroutine adjust_time(settings, time, time_out)

  use mod_settings
  use mod_dates
  use mod_var
  
  implicit none

  type (settings_t),          intent(in)     :: settings
  real, dimension(ntime),     intent(in out) :: time
  real, dimension(ntime_out), intent(in out) :: time_out

  integer  :: i, yyyymmdd, hhmiss
  real     :: days

  if (settings%timeref.ne.0) then
    ! input timestamp is julian days
    do i = 1, ntime_out
      time_out(i) = time(i) + juldate(int(settings%timeref),0) - &
                     juldate(19000101,0) 
    end do
    ! adjust time stamp to given year 
    call caldate(time_out(1) + juldate(19000101,0), yyyymmdd, hhmiss)
    if( yyyymmdd/10000 .ne. settings%year ) then
      time_out(:) = time_out(:) + juldate(settings%year*10000+101,0) - &
                     juldate(yyyymmdd,0)
    endif
  else if (trim(settings%timestamp).eq.'sec') then
    ! input timestamp is seconds
    days = 0.
    do i = 1, ntime_out
      time_out(i) = time(i)/3600./24. + juldate(settings%year*10000+101,0) - &
                     juldate(19000101,0)
    end do
  else if (trim(settings%timestamp).eq.'hour') then
    ! input timestamp is hours -> fossil fuel leave as hours
    do i = 1, ntime_out
      time_out(i) = time(i)
    end do
  else if (trim(settings%timestamp).eq.'month') then
    ! input timestamp is months
    days = 0.
    do i = 1, ntime_out
      if(i.gt.1) days = days + calceomday(int(settings%year*100+(i-1)))
      time_out(i) = days + juldate(settings%year*10000+101,0) - &
                     juldate(19000101,0)
    end do
  else
    write(*,*) 'WARNING: input timestamp not recognised'
  endif

end subroutine adjust_time

