#!/usr/bin/perl
# vim: set ft=perl:

use strict;
use warnings;
use SQL::Translator;

use File::Spec::Functions qw(catfile updir tmpdir);
use FindBin               qw($Bin);
use Test::More;
use Test::Differences;
use Test::SQL::Translator qw(maybe_plan);
use SQL::Translator::Schema::Constants;
use Storable 'dclone';

plan tests => 4;

use_ok('SQL::Translator::Diff') or die "Cannot continue\n";

my $tr = SQL::Translator->new;

my ($source_schema, $target_schema) = map {
  my $t = SQL::Translator->new;
  $t->parser('YAML')
      or die $tr->error;
  my $out = $t->translate(catfile($Bin, qw/data diff pgsql/, $_))
      or die $tr->error;

  my $schema = $t->schema;
  unless ($schema->name) {
    $schema->name($_);
  }
  ($schema);
} (qw( create1.yml create2.yml ));

# Test for differences
my $out = SQL::Translator::Diff::schema_diff(
  $source_schema,
  'PostgreSQL',
  $target_schema,
  'PostgreSQL',
  {
    sqlt_args => {
      quote_identifiers => 1,
    }
  }
);

eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
-- Convert schema 'create1.yml' to 'create2.yml':;

BEGIN;

CREATE TABLE "added" (
  "id" bigint
);

ALTER TABLE "employee" DROP CONSTRAINT "FK5302D47D93FE702E";

ALTER TABLE "employee" DROP COLUMN "job_title";

ALTER TABLE "employee" ADD CONSTRAINT "FK5302D47D93FE702E_diff" FOREIGN KEY ("employee_id")
  REFERENCES "person" ("person_id") DEFERRABLE;

ALTER TABLE "old_name" RENAME TO "new_name";

ALTER TABLE "new_name" ADD COLUMN "new_field" integer;

ALTER TABLE "person" DROP CONSTRAINT "UC_age_name";

DROP INDEX "u_name";

ALTER TABLE "person" ADD COLUMN "is_rock_star" smallint DEFAULT 1;

ALTER TABLE "person" ALTER COLUMN "person_id" TYPE serial;

ALTER TABLE "person" ALTER COLUMN "name" SET NOT NULL;

ALTER TABLE "person" ALTER COLUMN "age" SET DEFAULT 18;

ALTER TABLE "person" ALTER COLUMN "weight" DROP NOT NULL;

ALTER TABLE "person" ALTER COLUMN "iq" TYPE bigint;

ALTER TABLE "person" ALTER COLUMN "nickname" SET NOT NULL;

ALTER TABLE "person" ALTER COLUMN "nickname" TYPE character varying(24);

ALTER TABLE "person" RENAME COLUMN "description" TO "physical_description";

ALTER TABLE "person" ADD CONSTRAINT "unique_name" UNIQUE ("name");

ALTER TABLE "person" ADD CONSTRAINT "UC_person_id" UNIQUE ("person_id");

ALTER TABLE "person" ADD CONSTRAINT "UC_age_name" UNIQUE ("age", "name");

DROP TABLE "deleted" CASCADE;


COMMIT;

## END OF DIFF

$out = SQL::Translator::Diff::schema_diff(
  $source_schema,
  'PostgreSQL',
  $target_schema,
  'PostgreSQL',
  {
    ignore_index_names      => 1,
    ignore_constraint_names => 1,
    sqlt_args               => {
      quote_identifiers => 0,
    }
  }
);

eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
-- Convert schema 'create1.yml' to 'create2.yml':;

BEGIN;

CREATE TABLE added (
  id bigint
);

ALTER TABLE employee DROP COLUMN job_title;

ALTER TABLE old_name RENAME TO new_name;

ALTER TABLE new_name ADD COLUMN new_field integer;

ALTER TABLE person DROP CONSTRAINT UC_age_name;

ALTER TABLE person ADD COLUMN is_rock_star smallint DEFAULT 1;

ALTER TABLE person ALTER COLUMN person_id TYPE serial;

ALTER TABLE person ALTER COLUMN name SET NOT NULL;

ALTER TABLE person ALTER COLUMN age SET DEFAULT 18;

ALTER TABLE person ALTER COLUMN weight DROP NOT NULL;

ALTER TABLE person ALTER COLUMN iq TYPE bigint;

ALTER TABLE person ALTER COLUMN nickname SET NOT NULL;

ALTER TABLE person ALTER COLUMN nickname TYPE character varying(24);

ALTER TABLE person RENAME COLUMN description TO physical_description;

ALTER TABLE person ADD CONSTRAINT UC_person_id UNIQUE (person_id);

ALTER TABLE person ADD CONSTRAINT UC_age_name UNIQUE (age, name);

DROP TABLE deleted CASCADE;


COMMIT;

## END OF DIFF

# Test for sameness
$out = SQL::Translator::Diff::schema_diff($source_schema, 'PostgreSQL', $source_schema, 'PostgreSQL');

eq_or_diff($out, <<'## END OF DIFF', "No differences found");
-- Convert schema 'create1.yml' to 'create1.yml':;

-- No differences found;

## END OF DIFF