#!/usr/bin/env python
# Copyright (c) 2023 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import argparse
import os
from datetime import datetime, timezone

SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
FALLBACK_LKGT_FILENAME = os.path.abspath(os.path.join(SCRIPT_DIR, 'fallback_last_known_good_time'))


def utc_time_in_matter_epoch_s(time: datetime):
    """ Returns the time in matter epoch in s. """
    # Matter epoch is 0 hours, 0 minutes, 0 seconds on Jan 1, 2000 UTC
    utc_matter = time - datetime(2000, 1, 1, 0, 0, 0, 0, timezone.utc)
    return int(utc_matter.total_seconds())


class Options:
    def __init__(self, output, define_name, define_val):
        self.output = output
        self.define_name = define_name
        self.define_val = define_val


def write_header(options):
    with open(options.output, "w") as output_file:
        output_file.write("// Generated by write_build_time_header.py\n")
        output_file.write('#pragma once\n\n')

        output_file.write(f'#define {options.define_name} {options.define_val}\n')


def update_fallback_time_in_file():
    with open(FALLBACK_LKGT_FILENAME, "w") as output_file:
        output_file.write(str(utc_time_in_matter_epoch_s(datetime.now(tz=timezone.utc))))


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--output', help="Output header name (inside gen dir)")
    parser.add_argument('--gen-dir',
                        help="Path to root of generated file directory tree.")
    parser.add_argument('--use-current-time', default=False, action='store_true',
                        help="Set the LKGT to the current time. If this flag is not used, the LKGT is set to a hardcoded time.")
    parser.add_argument('--update-fallback-time-in-file', default=False, action='store_true',
                        help='Write the current UTC time out to the fallback file')
    cmdline_options = parser.parse_args()

    if cmdline_options.update_fallback_time_in_file:
        update_fallback_time_in_file()
        return

    # The actual output file is inside the gen dir.
    output = os.path.join(cmdline_options.gen_dir, cmdline_options.output)

    define_name = 'CHIP_DEVICE_CONFIG_FIRMWARE_BUILD_TIME_MATTER_EPOCH_S'
    if cmdline_options.use_current_time:
        build_time = utc_time_in_matter_epoch_s(datetime.now(tz=timezone.utc))
    else:
        with open(FALLBACK_LKGT_FILENAME, "r") as input_file:
            build_time = int(input_file.read())

    opts = Options(output=output,
                   define_name=define_name,
                   define_val=str(build_time))
    write_header(opts)


main()
