# typed: strict
# frozen_string_literal: true

module Bhook
  class MdFile
    extend T::Sig

    PAGE_TEMPLATE = T.let(File.read(Bhook::PAGE_TEMPLATE_PATH), String)
    AFTER_H1_TEMPLATE = T.let(File.read(Bhook::AFTER_H1_TEMPLATE_PATH), String)

    sig { returns(Pathname) }
    attr_reader :src_file_path, :out_file_path

    sig { returns(T.nilable(String)) }
    attr_reader :src_file_date, :src_file_sha, :src_file_url

    sig { returns(String) }
    attr_reader :md

    sig { params(src_file_path: Pathname, out_path: Pathname, git: Git::Base, config: Bhook::Config).void }
    def initialize(src_file_path, out_path, git, config)
      L.debug "Reading: #{src_file_path}"
      @md = T.let(File.read(src_file_path), String)
      @src_file_path = src_file_path
      @out_path = out_path
      @git = git
      @config = config

      file_date, file_sha = load_git_file_metadata
      @src_file_date = T.let(file_date, T.nilable(String))
      @src_file_sha = T.let(file_sha, T.nilable(String))
      @out_file_path = T.let(@out_path.join(out_file_name), Pathname)
      @src_file_url = T.let(file_url, T.nilable(String))
    end

    sig { params(theme: Bhook::Theme).void }
    def write!(theme)
      L.debug "Processing: #{@src_file_sha || 'unversioned'} #{@src_file_path}"
      rendered_page = theme.render_page(@md, @src_file_sha, @src_file_date, @src_file_url)

      L.debug "Writing: #{@src_file_sha} #{out_file_path}"
      File.write(@out_file_path, rendered_page)
    end

    private
    sig { returns(Pathname) }
    def out_file_name
      @src_file_path.basename.sub(/\.md$/, '.html')
    end

    sig { returns(T.nilable(String)) }
    def file_url
      @config.website_url_for(@src_file_path, @src_file_sha)
    end

    sig { returns(T::Array[String]) }
    def load_git_file_metadata
      @git.lib.send(:command, 'log',
                    '-n 1',
                    '--pretty=format:%ad|%H',
                    '--date=short',
                    '--',
                    @src_file_path).split('|')
    end
  end
end