package LasTres::Location;

use v5.36.0;

use strict;
use warnings;

use feature 'signatures';

use LasTres::Planets;
use Moo::Role;

requires qw/identifier name description parent actions npcs/;

my $planets = LasTres::Planets->new;
sub get($planet_id, $super_area_id, $area_id, $location_id) {
    my $planet = $planets->hash->{$planet_id};
    if (!defined $planet) {
        die "No such planet $planet_id.";
    }
    my $super_area = $planet->super_areas->{$super_area_id};
    if (!defined $super_area) {
        die "No such super_area $super_area_id in planet $planet_id.";
    }
    my $area = $super_area->areas->{$area_id};
    if (!defined $area) {
        die "No such area $area_id in super_area $super_area_id in planet $planet_id.";
    }
    my $location = $area->locations->{$location_id};
    if (!defined $location) {
        die "No such location $location_id in area $area_id in super_area $super_area_id in planet $planet_id.";
        
    }
    return $location;
}

sub hash($self) {
    my $location = $self;
    if (!Moo::Role::does_role($location, 'LasTres::Location')) {
        die "$location does not implement LasTres::Location.";
    }
    my $area = $location->parent;
    if (!Moo::Role::does_role($area, 'LasTres::Area')) {
        die "$area does not implement LasTres::Area."; 
    }
    my $super_area = $area->parent;
    if (!Moo::Role::does_role($super_area, 'LasTres::SuperArea')) {
        die "$super_area does not implement LasTres::SuperArea."; 
    }
    my $planet = $super_area->parent;
    if (!Moo::Role::does_role($planet, 'LasTres::Planet')) {
        die "$planet does not implement LasTres::Planet."; 
    }
    return {
        planet => {
            name => $planet->name,
            identifier => $planet->identifier,
        },
        super_area => {
            name => $super_area->name,
            identifier => $super_area->identifier,
        },
        area => {
            name => $area->name,
            identifier => $area->identifier,
        },
        location => {
            name => $location->name,
            identifier => $location->identifier,
        },
    }
}
1;
