require "factory_girl"
require "answer_edition"
require "artefact"
require "tag"
require "user"

FactoryGirl.define do
  factory :user do
    sequence(:uid) { |n| "uid-#{n}"}
    sequence(:name) { |n| "Joe Bloggs #{n}" }
    sequence(:email) { |n| "joe#{n}@bloggs.com" }
    if defined?(GDS::SSO::Config)
      # Grant permission to signin to the app using the gem
      permissions { ["signin"] }
    end
  end

  factory :disabled_user, parent: :user do
    disabled true
  end

  factory :downtime do
    message "This service will be unavailable from 3pm to 6pm tomorrow"
    start_time (Date.today + 1).to_time + (15 * 60 * 60)
    end_time (Date.today + 1).to_time + (18 * 60 * 60)
    artefact
  end

  factory :tag do
    sequence(:tag_id) { |n| "crime-and-justice-#{n}" }
    sequence(:title) { |n| "The title #{n}" }
    tag_type "section"

    trait :draft do
      state "draft"
    end

    trait :live do
      state "live"
    end

    factory :draft_tag, traits: [:draft]
    factory :live_tag, traits: [:live]
  end

  factory :artefact do
    sequence(:name) { |n| "Artefact #{n}" }
    sequence(:slug) { |n| "slug-#{n}" }
    kind            Artefact::FORMATS.first
    owning_app      'publisher'
    content_id      { SecureRandom.uuid }

    trait :whitehall do
      sequence(:slug) {|n| "government/slug--#{n}"}
      owning_app      "whitehall"
      kind            Artefact::FORMATS_BY_DEFAULT_OWNING_APP["whitehall"].first
    end

    trait :with_published_edition do
      after(:create) {|object|
        self.create("#{object.kind}_edition".to_sym, panopticon_id: object.id, slug: object.slug, state: "published")
      }
    end

    trait :non_publisher do
      kind            'smart-answer'
      owning_app      'smartanswers'
    end

    trait :draft do
      state "draft"
    end

    trait :live do
      state "live"
    end

    trait :archived do
      state "archived"
    end

    factory :draft_artefact, traits: [:draft]
    factory :live_artefact, traits: [:live]
    factory :archived_artefact, traits: [:archived]

    factory :live_artefact_with_edition, traits: [:live, :with_published_edition]

    factory :whitehall_draft_artefact, traits: [:whitehall, :draft]
    factory :whitehall_live_artefact, traits: [:whitehall, :live]
    factory :whitehall_archived_artefact, traits: [:whitehall, :archived]

    factory :non_publisher_artefact, traits: [:non_publisher]
  end

  factory :edition, class: AnswerEdition do
    panopticon_id {
        a = create(:artefact)
        a.id
      }
    transient do
      version_number nil
    end

    sequence(:slug) { |n| "slug-#{n}" }
    sequence(:title) { |n| "A key answer to your question #{n}" }

    after :build do |ed, evaluator|
      if !evaluator.version_number.nil?
        ed.version_number = evaluator.version_number
      elsif (previous = ed.series.order(version_number: "desc").first)
        ed.version_number = previous.version_number + 1
      end
    end

    trait :scheduled_for_publishing do
      state 'scheduled_for_publishing'
      publish_at 1.day.from_now
    end

    trait :published do
      state 'published'
    end

    trait :with_body do
      body 'Some body text'
    end

  end
  factory :answer_edition, traits: [:with_body], parent: :edition do
  end

  factory :help_page_edition, traits: [:with_body], :parent => :edition, :class => 'HelpPageEdition' do
  end

  factory :campaign_edition, traits: [:with_body], :parent => :edition, :class => 'CampaignEdition' do
  end

  factory :completed_transaction_edition, traits: [:with_body], :parent => :edition, :class => 'CompletedTransactionEdition' do
  end

  factory :video_edition, traits: [:with_body], parent: :edition, :class => 'VideoEdition' do
  end

  factory :business_support_edition, traits: [:with_body], :parent => :edition, :class => "BusinessSupportEdition" do
  end

  factory :guide_edition, :parent => :edition, :class => "GuideEdition" do
    sequence(:title)  { |n| "Test guide #{n}" }
  end

  factory :programme_edition, :parent => :edition, :class => "ProgrammeEdition" do
    sequence(:title) { |n| "Test programme #{n}" }
  end

  factory :programme_edition_with_multiple_parts, parent: :programme_edition do
    after :create do |getp|
      getp.parts.build(title: "PART !", body: "This is some programme version text.",
                       slug: "part-one")
      getp.parts.build(title: "PART !!",
                       body: "This is some more programme version text.",
                       slug: "part-two")
    end
  end

  factory :guide_edition_with_two_parts, parent: :guide_edition do
    after :create do |getp|
      getp.parts.build(title: "PART !", body: "This is some version text.",
                       slug: "part-one")
      getp.parts.build(title: "PART !!",
                       body: "This is some more version text.",
                       slug: "part-two")
    end
  end

  factory :guide_edition_with_two_govspeak_parts, parent: :guide_edition do
    after :create do |getp|
      getp.parts.build(title: "Some Part Title!",
                       body: "This is some **version** text.", slug: "part-one")
      getp.parts.build(title: "Another Part Title",
                       body: "This is [link](http://example.net/) text.",
                       slug: "part-two")
    end
  end

  factory :local_transaction_edition, :parent => :edition, :class => "LocalTransactionEdition" do
    sequence(:lgsl_code) { |nlgsl| nlgsl }
    introduction { "Test introduction" }
    more_information { "This is more information" }
    need_to_know "This service is only available in England and Wales"
  end

  factory :transaction_edition, :parent => :edition, :class => "TransactionEdition" do
    introduction { "Test introduction" }
    more_information { "This is more information" }
    need_to_know "This service is only available in England and Wales"
    link "http://continue.com"
    will_continue_on "To be continued..."
    alternate_methods "Method A or Method B"
  end

  factory :licence_edition, :parent => :edition, :class => "LicenceEdition" do
    licence_identifier "AB1234"
    licence_short_description "This is a licence short description."
    licence_overview "This is a licence overview."
  end

  factory :local_service do |ls|
    ls.sequence(:lgsl_code)
    providing_tier { %w{district unitary county} }
  end

  factory :local_authority do
    name "Some Council"
    sequence(:snac) {|n| "%02dAA" % n }
    sequence(:local_directgov_id)
    tier "county"
  end

  factory :place_edition, parent: :edition, class: 'PlaceEdition'  do
    title "Far far away"
    introduction "Test introduction"
    more_information "More information"
    need_to_know "This service is only available in England and Wales"
    place_type "Location location location"
  end

  factory :curated_list do
    sequence(:slug) { |n| "slug-#{n}" }
  end

  factory :travel_advice_edition do
    sequence(:country_slug) {|n| "test-country-#{n}" }
    sequence(:title) {|n| "Test Country #{n}" }
    change_description "Stuff changed"
  end

  # These factories only work when used with FactoryGirl.create
  factory :draft_travel_advice_edition, :parent => :travel_advice_edition do
  end
  factory :published_travel_advice_edition, :parent => :travel_advice_edition do
    after :create do |tae|
      tae.published_at ||= Time.zone.now.utc
      tae.state = 'published'
      tae.save!
    end
  end
  factory :archived_travel_advice_edition, :parent => :travel_advice_edition do
    after :create do |tae|
      tae.state = 'archived'
      tae.save!
    end
  end

  factory :rendered_manual do
    sequence(:slug) {|n| "test-rendered-manual-#{n}" }
    sequence(:title) {|n| "Test Rendered Manual #{n}" }
    summary "My summary"
  end

  factory :simple_smart_answer_edition, :parent => :edition, :class => "SimpleSmartAnswerEdition" do
    title "Simple smart answer"
    body "Introduction to the smart answer"
  end
end